核心是“内容变则路径变”,通过contenthash生成带内容指纹的文件名(如main.a1b2c3d4.js),配合html-webpack-plugin或vite-plugin-html自动注入html,再设置cache-control: immutable实现长期缓存。

浏览器缓存配合文件名指纹(Contenthash)实现自动缓存刷新,核心在于让“内容变化 → 文件名变化 → 浏览器强制加载新资源”。前端构建工具(如 Webpack、Vite、Rollup)生成带内容哈希的文件名(如 main.a1b2c3d4.js),HTML 中引用该文件,浏览器根据新文件名发起新请求,自然绕过旧缓存。
文件名指纹如何生成并确保唯一性
Contenthash 是基于文件内容计算出的哈希值(如 Webpack 的 [contenthash]),内容不变则哈希不变,内容哪怕改一个字符,哈希就变。这比 [hash](整个构建 hash)或 [chunkhash](Webpack 4 以前按 chunk 计算)更精准,避免“一个 JS 改动导致 CSS 文件名也变”这类无效刷新。
- Webpack 配置示例:
output: { filename: 'js/[name].[contenthash:8].js' }
同时需启用optimization.splitChunks并为 CSS 单独配置mini-css-extract-plugin,使其也能输出[contenthash]的 CSS 文件 - Vite 默认开启
build.rollupOptions.output.entryFileNames和assetFileNames的 contentHash(v4.3+ 默认使用[hash],但可通过[name].[hash:8].[ext]模拟;真正语义化 contenthash 需搭配插件如vite-plugin-content-hash或升级到 v5+ 的build.modulePreload+ 内置哈希策略) - 关键点:CSS 和 JS 若共用同一 chunk,需确保提取逻辑分离,否则 CSS 内容变更可能意外触发 JS 文件名变化(反之亦然)
HTML 中如何正确注入带哈希的资源链接
静态 HTML 写死文件名会失效,必须由构建工具动态注入。不能靠手动替换或 Nginx 重写,而应交由构建流程生成最终 HTML。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Webpack:用
html-webpack-plugin,它读取打包后的 JS/CSS 资源清单(manifest),自动把<script src="main.js"></script>替换为<script src="main.a1b2c3d4.js"></script> - Vite:默认使用
vite-plugin-html或内置支持(index.html中的<script type="module" src="/src/main.js"></script>会被自动转为带 hash 的产物路径),也可用vite-plugin-static-copy配合自定义模板 - 注意:HTML 文件自身一般不加 hash(如不叫
index.a1b2c3d4.html),而是设较短缓存(如Cache-Control: max-age=600),确保用户能及时拿到新 HTML,从而加载新 JS/CSS
HTTP 缓存头要分层设置才有效
光有文件名 hash 不够,服务端缓存策略必须配合:对带 hash 的静态资源(JS/CSS/图片等)设长期缓存,对 HTML 设短期缓存或禁用强缓存。
- 推荐响应头:
index.html → Cache-Control: public, max-age=600main.abcd1234.js → Cache-Control: public, max-age=31536000, immutableimmutable告诉浏览器“这个 URL 永远不会变内容”,可跳过后续If-None-Match验证,提升重复访问性能 - Nginx 示例配置片段:
location ~* \.(js|css|png|jpg|gif|webp|woff2)$ {<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>} - 若用 CDN(如 Cloudflare、阿里云 OSS),同样需在控制台或上传时为不同后缀设置对应缓存规则
上线后如何验证是否生效
别只看 Network 面板里状态码是 200 还是 304,重点确认三件事:
- 打开新标签页访问首页,检查 Network 中 JS/CSS 请求的响应头是否有
Cache-Control: immutable和长 max-age - 修改一行 JS 代码,重新构建,对比新旧
dist目录:JS 文件名是否变化?HTML 中引用的是否是新文件名? - 清空浏览器缓存后首次访问,再刷新一次 —— 第二次 JS/CSS 应显示
from disk cache或from memory cache,且响应头中Age值持续增长,说明长期缓存已命中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










