浏览器缓存为什么有时不更新
缓存能提升速度,但配置不当会让用户继续使用旧资源。关键是区分 HTML 和带哈希静态文件的策略。
先用白话理解
这篇内容在讲什么?
浏览器会保存访问过的文件,下次直接使用,所以有时上线新版本仍会看到旧内容。
问题
发布新版本后,部分用户仍看到旧脚本,怎么解决?
HTML 和静态资源使用相同长期缓存,或文件名没有随内容变化。
解决方案
- 资源名加入内容哈希
- 静态文件长期缓存
- HTML 使用协商缓存
- 检查 CDN 刷新
缓存响应头示例代码
# 带哈希静态资源
Cache-Control: public, max-age=31536000, immutable
# HTML
Cache-Control: no-cache强缓存直接使用本地文件
Cache-Control 可以让浏览器在有效期内不请求服务器,适合文件名带内容哈希的 JS、样式和图片。
协商缓存会询问服务器
ETag 和 Last-Modified 让浏览器确认文件是否变化,未变化时返回 304。
HTML 不应长期锁死
HTML 通常需要较短缓存或协商缓存,因为它负责引用最新的带哈希资源。
- 静态资源长期缓存
- 文件名随内容变化
- HTML 保持可更新
结语
判断最终要回到真实体验
技术方案没有脱离场景的标准答案。把用户任务、业务边界、开发成本和长期维护放在一起评估,才有可能做出稳定、清晰且经得起变化的页面。
照着做的步骤
- 区分 HTML 和静态资源
- 静态文件使用内容哈希
- HTML 使用短缓存或协商缓存
- 发布后检查响应头
容易踩的坑
- 所有文件使用同一缓存时间
- 文件变化但名称不变
- 只清自己浏览器缓存验证
术语不用怕
- Cache-Control:缓存规则响应头
- ETag:文件版本标识
- 304:文件未变化的响应