标准答案
- JS、CSS、图片等构建产物可以带 content hash,内容变化时文件名变化。
- 带 hash 的静态资源适合设置很长的 Cache-Control,例如 immutable 和较长 max-age。
- HTML 通常不能长期强缓存,因为它负责引用最新一批静态资源。
- 部署时要保证 HTML 和静态资源版本匹配,避免 HTML 引用的新资源还没上传或旧资源已被删除。
- CDN 缓存、浏览器缓存和服务端缓存要一起设计,并保留回滚版本所需资源。
题目解析
前端缓存的关键矛盾是“静态资源想缓存很久,入口 HTML 又必须能及时更新”。content hash 把这个矛盾拆开:资源内容不变,文件名不变;内容变了,文件名也变。
发布顺序比很多人想象得重要。新 HTML 引用了新 hash 文件,但新文件还没上传,会白屏;旧 HTML 还在用户缓存里,但旧资源被删了,也会 404。
因此稳定策略通常是先上传新静态资源,再切 HTML,旧 hash 资源保留一段时间。CDN、浏览器缓存、回滚和 Service Worker 都要按这个思路一起设计。
代码示例
常见策略是 HTML 使用短缓存,带 hash 资源使用长期缓存。
Text
index.html
Cache-Control: no-cache
/assets/app.8f3a1c.js
Cache-Control: public, max-age=31536000, immutable常见误区
- HTML 长期强缓存,用户一直拿不到新资源引用。
- 发布时先删除旧资源,导致仍在访问旧 HTML 的用户加载 404。
- 文件名没有内容 hash,却设置超长缓存。