你有没有发现,有时候打开一个网页特别快,哪怕网络不太稳定?其实这背后有很大一部分功劳要归功于浏览器的缓存机制。尤其是“强缓存”和“协商缓存”,它们就像网页的“记忆系统”,帮你省去重复加载的麻烦。
什么是强缓存?
强缓存就像是浏览器给自己定了一条规则:“这个资源在某个时间前不用再问服务器了”。只要在这个有效期内,浏览器直接从本地拿数据,连网络请求都不发,自然就快。
实现强缓存主要靠两个响应头:Expires 和 Cache-Control。
比如服务器返回:
Cache-Control: max-age=3600
意思是这个资源可以缓存 1 小时。在这 60 分钟里,无论你刷新多少次页面,浏览器都不会向服务器发请求,而是直接使用本地缓存的版本。
如果你打开开发者工具,会看到状态码显示为 200 (from disk cache) 或 200 (from memory cache),这就是强缓存生效的标志。
那协商缓存又是啥?
当强缓存过期了,浏览器不会立刻重新下载整个资源,而是先“问问”服务器:“我手里的版本还行吗?”——这个过程就是协商缓存。
它依赖两个常见的字段:Last-Modified 和 If-None-Match(对应 ETag)。
举个例子,你第一次访问一张图片,服务器返回:
Last-Modified: Wed, 15 Oct 2023 12:00:00 GMT
ETag: "abc123"
等你下次再访问,浏览器就会带上这些信息去问:
If-Modified-Since: Wed, 15 Oct 2023 12:00:00 GMT
If-None-Match: "abc123"
如果服务器发现资源没变,就回个 304 Not Modified,告诉浏览器:“放心用旧的就行”。这样一来,不用下载内容,节省了流量,也加快了加载速度。
实际场景对比
想象一下你常看的一个新闻网站。首页的 CSS 和 JS 文件基本不变,这类资源适合用强缓存,设置较长有效期。而新闻列表是动态更新的,可能每小时都有新内容,这时候就可以配合协商缓存,既保证及时性,又避免频繁全量加载。
再比如你在手机上刷短视频,App 会把封面图、播放页结构缓存起来。即使你退出再进,页面瞬间弹出,这就是强缓存的功劳。等页面显示后,再通过协商缓存确认有没有新评论或点赞数变化。
怎么判断用了哪种缓存?
打开浏览器开发者工具,选中 Network 面板,刷新页面,观察请求的 Size 列:
- 显示
from disk cache或from memory cache→ 强缓存生效 - 状态码是
304→ 协商缓存生效 - 状态码是
200且有具体大小(如 12KB)→ 从头下载,没走缓存
了解这些,不仅能帮你理解网页为什么快或慢,调试前端问题时也能更快定位是不是缓存惹的祸。