标准答案

  1. 带 content hash 的静态资源可以设置较长 max-age 和 immutable,因为内容变化会带来新文件名。
  2. HTML 入口不适合长期强缓存,因为它负责引用最新版本的静态资源。
  3. 发布顺序应先上传新 hash 资源,再切换 HTML 或入口配置,避免新 HTML 引用不存在的资源。
  4. 旧 hash 资源要保留一段时间,服务仍在使用旧 HTML 或缓存旧入口的用户。
  5. 还要关注 CDN 刷新、回源策略、跨域、压缩、Service Worker 和 source map 访问控制。

题目解析

CDN 缓存策略的核心是把“可长期缓存的文件”和“必须及时更新的入口”拆开。hash 资源适合长缓存,HTML 适合短缓存或 no-cache,这样既能利用缓存,又能让新版本入口及时生效。

发布顺序会直接影响线上稳定性。新 HTML 如果先发布,而新 JS/CSS 还没上传到 CDN,用户会遇到资源 404;旧资源如果过早删除,仍持有旧 HTML 的用户也会加载失败。

生产环境还要处理调试和安全:source map 通常不直接公开给所有用户,错误监控需要的 map 可以上传到平台或内部存储,并和 release 版本保持一致。

代码示例

HTML 和 hash 资源应该使用不同缓存头。

Text
/index.html
Cache-Control: no-cache

/assets/app.a8f31c2e.js
Cache-Control: public, max-age=31536000, immutable

/assets/app.a8f31c2e.js.map
Access: private or upload to error monitoring only

常见误区

  • HTML 设置超长强缓存,导致用户长期停留在旧入口。
  • 没有保留旧版本静态资源,回滚或旧缓存用户加载失败。
  • 把 source map 和业务源码直接公开在 CDN 上,没有访问控制。

作者信息