前端缓存基础:强缓存、协商缓存和资源更新到底该怎么理解
做前端开发时,缓存是一个绕不开的话题。
页面访问快不快、资源更新生不生效、用户是不是还在看旧代码,这些问题很多都和缓存有关。
但缓存相关概念第一次接触时经常会有点绕,尤其是强缓存和协商缓存,很容易记混。
为什么浏览器要缓存资源
原因很直接:
- 减少重复请求
- 加快页面加载
- 降低服务器压力
像 JS、CSS、图片这类静态资源,如果每次访问都重新下载,成本会很高。浏览器缓存就是为了避免这种重复消耗。
什么是强缓存
强缓存的意思是:浏览器认为本地资源还有效,所以直接使用,不再向服务器发请求。
常见相关字段有:
Cache-ControlExpires
只要资源还在有效期内,浏览器就会直接从本地取。
这也是为什么有时你明明改了线上文件,但用户访问页面却看不到最新效果,因为浏览器根本没再请求服务器。
什么是协商缓存
协商缓存的意思是:浏览器会先去问服务器,这个资源有没有变。
如果服务器确认没变,就返回一个轻量响应,告诉浏览器继续用本地版本。
常见相关字段有:
Last-Modified/If-Modified-SinceETag/If-None-Match
它和强缓存的区别在于,协商缓存会发请求,但不一定重新下载资源内容。
两者关系怎么理解
可以简单理解成:
- 强缓存优先
- 强缓存失效后,再走协商缓存
也就是说,一个资源如果还在强缓存有效期内,浏览器通常不会走协商缓存。
为什么前端项目常用带 hash 的文件名
因为静态资源更新时,最大的难题之一就是“如何让浏览器知道这个资源变了”。
如果文件名不变,浏览器可能继续用旧缓存。
所以构建工具通常会产出像下面这样的文件名:
app.a1b2c3.jsmain.9f8e7d.css
当内容变化时,hash 也会变化,浏览器会把它当成一个新资源重新请求。
这就是为什么现代前端项目常常会把“长缓存 + 文件名 hash”组合在一起使用。
更新不生效的常见原因
1. 文件名没变
资源内容更新了,但 URL 没变,浏览器可能继续命中缓存。
2. HTML 本身缓存策略不合理
很多项目对静态资源做了 hash,却忘了入口 HTML 也需要合理控制缓存。
如果 HTML 还是旧的,那它引用的资源地址也可能还是旧的。
3. 本地调试和生产环境策略混淆
开发环境通常更强调实时更新,生产环境更强调缓存效率。两边策略如果不区分,问题就会变多。
缓存不是越久越好
缓存确实能提升性能,但并不是缓存时间越长越好。
如果更新策略没有设计好,过长缓存会直接变成发布风险。
所以前端缓存真正需要平衡的是:
- 性能
- 可更新性
写在最后
理解浏览器缓存的关键,不是死记字段,而是搞清楚浏览器什么时候直接用本地、什么时候去问服务器、什么时候必须重新下载。
只要把强缓存、协商缓存和文件 hash 之间的关系理顺,前端资源更新问题就会清晰很多。缓存不是玄学,它说到底是资源管理策略的一部分。