真正省带宽的是缓存css、js、图片等大体积静态资源,而非html;需结合文件哈希与cache-control immutable实现长期有效缓存,html则应配no-cache以协商复用。

不能靠给 index.html 加缓存来省带宽——真正起效的是让浏览器跳过重复下载 CSS、JS、图片这些大体积静态资源。
为什么直接缓存 HTML 文件几乎不省带宽
HTML 文件本身通常很小(几 KB),且多数含动态内容。即使设了 Cache-Control: public, max-age=3600,用户刷新时仍可能因服务端返回 304 或重新生成而无法复用;更常见的是,它根本没被缓存(比如 CMS 默认返回 no-cache)。省下的那点字节,在整页加载中占比微乎其微。
真正占带宽大头的是:main.a1b2c3.js(几百 KB)、hero-banner.jpg(2 MB)、icon.woff2(50 KB)这类资源。它们一旦被缓存,后续访问就完全不走网络。
必须用 Cache-Control + 文件哈希组合
只设 max-age=31536000 不够,浏览器会缓存但不知道文件是否已更新;只改文件内容不改 URL,旧缓存就会一直生效,导致白屏或功能异常。
- 构建时对每个静态资源生成内容哈希,输出如
app.f8a7d2e4.css、logo.b3c9f1a2.png - Nginx 配置匹配后缀,强制长期缓存:
location ~* \.(css|js|png|jpg|woff2|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } -
immutable关键:告诉浏览器“这个 URL 永远不会变”,跳过后续的If-None-Match验证请求,少一次 HTTP 往返
HTML 文件要配 no-cache,不是不缓存
no-cache 不是禁止缓存,而是强制每次访问都发一个带验证头(If-None-Match 或 If-Modified-Since)的请求。服务器若返回 304 Not Modified,浏览器就复用本地 HTML —— 这个过程只传几十字节响应头,不传 HTML 内容本身,一样省带宽。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
对比错误做法:max-age=3600 导致强缓存,用户刷新时完全不发请求,也就没机会复用;而 no-cache 在绝大多数场景下都能命中 304,实际传输量极小。
- 纯静态 HTML(如文档站首页)可设
max-age=300,5 分钟内免请求,平衡更新与带宽 - 含用户态的页面(如仪表盘、订单页)必须用
no-store,安全优先,不考虑带宽 - 绝对不要用
<meta http-equiv="Cache-Control">,它在fetch()、iframe、PWA 场景下完全失效
CDN 层容易吃掉你的缓存策略
CDN(如 Cloudflare、阿里云 CDN)默认会对所有路径缓存,哪怕源站返回了 no-cache。结果就是:CDN 缓存了旧 HTML,用户浏览器却因协商缓存机制拿到了新 JS,页面结构和逻辑错配。
必须在 CDN 控制台显式配置:
- /index.html → 缓存 TTL = 60 秒,忽略源站
Cache-Control - /static/** 或 /assets/** → 缓存 TTL = 1 年,开启“忽略查询参数”和“缓存静态文件扩展名”
- 检查响应头中是否有
x-cache: HIT或x-cdn-cache: HIT,确认 CDN 是否真按你预期工作
最常被忽略的一点:CDN 的“自动压缩”功能有时会重写响应头,覆盖掉你精心配置的 Cache-Control。上线前务必用 curl -I 对比源站和 CDN 域名的响应头是否一致。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










