最佳缓存效果需通过Nginx响应头精准控制,前提是JS文件名含内容哈希(如app.a1b2c3d4.js);正则匹配8位以上十六进制哈希+js后缀,设Cache-Control为public, max-age=31536000, immutable,并配套构建哈希、自动更新HTML引用、启用ETag。

要让 JavaScript 文件在浏览器中实现最佳缓存效果,核心不是改 JS 代码,而是通过 Nginx 在响应头里精准控制缓存行为——前提是 JS 文件名带内容哈希(如 app.a1b2c3d4.js),这是长期强缓存生效的前提。
只对带哈希的 JS 文件启用激进缓存
Nginx 必须精准识别这类“内容不变、URL 变”的资源,避免误缓存未哈希的开发版文件。推荐用正则匹配哈希特征:
- 匹配 8 位及以上十六进制哈希 +
.js后缀 - 大小写不敏感,防止大小写干扰
location ~* "\.[a-f0-9]{8,}\.js$" {
add_header Cache-Control "public, max-age=31536000, immutable" always;
expires 1y;
}关键字段必须同时存在
-
public:允许 CDN 和中间代理缓存,提升分发效率 -
max-age=31536000:缓存一年(秒数),比expires更可靠 -
immutable:告诉现代浏览器“此 URL 内容永不变更”,跳过If-None-Match验证请求,真正零往返 -
always参数:确保即使返回 304 或 4xx 状态码,该头也生效
配套必须做好的三件事
- 构建时生成内容哈希文件名(Webpack 用
[contenthash],Vite 默认开启) - HTML 中引用路径由构建工具自动更新(如
<script src="app.a1b2c3d4.js">) - 确保 Nginx 启用
ETag(默认开启)或Last-Modified,作为协商缓存兜底
明确避开的陷阱
立即学习“Java免费学习笔记(深入)”;
- 不要用
no-cache:它仍会发请求验证,失去强缓存意义 - 不要用
no-store:完全禁用缓存,JS 每次重下,严重拖慢首屏 - 不单独依赖
Expires:它依赖客户端时间,易因时间偏差失效 - 不给未哈希的 JS(如
app.js)设长缓存:URL 不变时,用户永远拿不到新版本
不复杂但容易忽略


















