JavaScript文件浏览器缓存需分两层配置:强缓存靠Cache-Control(如public, max-age=31536000, immutable)直接拦截请求,需配合文件名哈希;协商缓存则用ETag或Last-Modified在强缓存失效后验证更新,Expires仅作兼容补充。

JavaScript 文件的浏览器缓存要分两层配:强缓存靠响应头直接拦住请求,协商缓存则在强缓存失效后“轻问一声”服务器是否更新。关键不是写 JS 代码,而是让服务端返回正确的 HTTP 头。
强缓存:用 Cache-Control 控制有效期
这是最优先、最高效的缓存方式。浏览器看到有效 Cache-Control,连请求都不发,直接读本地副本。
-
推荐配置:
Cache-Control: public, max-age=31536000, immutable——max-age=31536000表示缓存一年(365 天),public允许 CDN 和代理缓存,immutable告诉浏览器:只要 URL 不变,内容就绝不会改(需配合文件名哈希使用) -
必须配套构建策略:JS 文件名带内容哈希,比如
app.a1b2c3d4.js。内容一变,文件名就变,URL 更新 → 浏览器自然跳过旧缓存,加载新资源 -
避免踩坑:别设
no-cache(它会强制走协商缓存,仍发请求)或no-store(彻底禁用缓存,每次重下),生产环境 JS 不适用
协商缓存:用 ETag 或 Last-Modified 验证更新
当强缓存过期或被禁用(如设置了 no-cache),浏览器会发起请求,但只传校验信息,不下载完整资源——服务器比对后,未变就回 304,变才回 200 + 新内容。
-
优先用 ETag:服务器为每个 JS 文件生成唯一标识(如基于内容哈希的字符串
"abc123"),通过响应头ETag: "abc123"返回;浏览器下次请求带上If-None-Match: "abc123",服务器比对一致就返回 304 -
Last-Modified 可作备选:返回最后修改时间
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT,浏览器后续带If-Modified-Since请求;但精度是秒级,且文件可能被覆盖但时间没变,不如 ETag 可靠 - 两者可共存:浏览器通常优先用 ETag,Fallback 到 Last-Modified;服务端实现时建议两者都设,兼容性更好
Expires 是兼容补充,不是主力
它是 HTTP/1.0 的老字段,设绝对过期时间(如 Expires: Wed, 21 Oct 2027 07:28:00 GMT),但依赖客户端和服务端时间同步——用户电脑时间不准就会出问题。
立即学习“Java免费学习笔记(深入)”;
- 现代开发中,
Cache-Control存在时,浏览器直接忽略Expires - 如果要用,仅作为兜底:设为比
max-age略晚的绝对时间,确保老旧客户端也能识别
HTML 和构建工具要协同配合
再好的缓存头,如果 HTML 里引用的 JS 路径没更新,浏览器永远拿不到新文件。
- Webpack 启用
[contenthash],Vite 默认开启类似机制,保证 JS 文件名随内容变化 - HTML 中的
<script src="app.a1b2c3d4.js"></script>必须由构建插件(如 html-webpack-plugin)自动注入,不能手写固定路径 - 上线后清 CDN 缓存,否则用户可能拿到旧 HTML,引用旧 JS,导致强缓存长期不生效


















