esmodule本身不改变浏览器缓存机制,关键在于其静态导入路径必须与内容哈希文件名配合:构建工具需重写import路径为带contenthash的完整url(如/utils.a1b2c3.js),服务端对哈希资源返回cache-control: public, max-age=31536000, immutable,而html自身必须短缓存或不缓存。

ESModule 本身不改变浏览器缓存机制,但它的模块路径是静态字符串,必须和文件名指纹配合才能实现长期缓存与即时更新并存——关键在于让每个 import 引用的 URL 随内容变化而变化。
ESModule 的导入路径必须是稳定且可哈希的
浏览器以完整的模块 URL(如 /js/utils.a1b2c3d4.js)为缓存键。如果写死为 import { foo } from './utils.js',哪怕构建时加了 contenthash,实际加载的仍是未带哈希的原始名,缓存无法区分新旧版本。
- 开发阶段用相对路径没问题,但生产构建必须确保输出的
import路径被重写为带哈希的完整路径 - Webpack/Vite/Rollup 等工具默认在打包时解析并重写 ESM 导入语句,只要 output.filename 配置了
[contenthash],生成的 chunk 就会自动使用带哈希的文件名,且import语句指向它 - 手动动态 import() 也要注意:不能写
import('./utils.js'),应通过构建插件或运行时映射转为哈希路径,否则绕过指纹控制
HTML 中 script type="module" 的 src 必须带指纹
入口 HTML 里引入主模块的标签:<script type="module" src="/js/main.a1b2c3d4.js"></script>。这个 URL 是浏览器首次加载 JS 的起点,必须含 contenthash。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 靠 HtmlWebpackPlugin(Webpack)或 Vite 的
html插件自动生成,避免手写硬编码 - 若用 CDN,确保其支持查询参数透传或哈希路径回源;否则可能因路径被截断导致 404
- 不要给
type="module"脚本加integrity属性来替代指纹——它只校验内容,不触发 URL 变更,缓存仍复用旧文件
服务端需对带哈希的 JS 文件启用强缓存
浏览器看到 main.a1b2c3d4.js 这个 URL,就认为它是不可变资源,前提是服务端返回正确的响应头:
Cache-Control: public, max-age=31536000, immutable-
ETag可选,但建议开启(Nginx 用etag on),作为极端情况下的协商兜底 - 绝对不要对这类文件设
no-cache或max-age=0,否则失去长期缓存意义
HTML 文件自身必须短缓存或不缓存
因为 HTML 是所有模块的入口载体,它引用的 JS 路径变了,HTML 就必须更新。所以它的缓存策略要和 JS 完全相反:
-
Cache-Control: no-cache, must-revalidate或max-age=0 - Nginx 配置示例:
location ~* \.html$ { add_header Cache-Control "no-cache, must-revalidate"; expires epoch; } - CDN 缓存 HTML 时务必设置为“不缓存”或极短 TTL(如 1 秒),否则用户可能拿到旧 HTML,里面还引用着上一版的哈希文件名
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










