Skip to content

浏览器缓存机制

Cache-ControlETag、304 这些首部语义属于 HTTP 标准,网络章已经讲透;但拿到这些头之后怎么决策,是浏览器自己的事:一次请求会依次面对 Service Worker、内存缓存(memory cache)、磁盘缓存(disk cache)好几层,前进/后退还有一层与 HTTP 缓存完全不同维度的整页快照 bfcache。这一叶讲的就是浏览器侧的多层缓存实现与命中决策:每层归谁管、活多久、DevTools 里怎么判读 (memory cache) / (disk cache) / (ServiceWorker)、四种刷新方式各自穿透到哪一层、Cache-Control: no-store 会波及哪些层,以及部署新版后用户拿着旧缓存时该怎么排查、怎么清。

概述

  • 多层命中:一次请求依次经过 Service Worker(Cache API)→ memory cache → disk cache → 网络;经典「四级缓存」里的 push cache 已死(Chrome 106 / Firefox 132 先后默认禁用 HTTP/2 Push)。
  • 「200 但没发请求」:强缓存命中时 Network 面板显示灰色 200,Size 栏标注 (memory cache) / (disk cache)——根本没出网络;304 才是真发了请求(协商缓存,只回头不回体)。
  • bfcache 是另一个维度:不缓存响应,而是把整页(DOM + JS 堆)冻结成内存快照,前进/后退瞬时恢复;unload 监听、打开的 IndexedDB 连接等会把页面挡在门外。
  • Cache API 不遵守 HTTP 缓存头:Service Worker 的 CacheStorage 由开发者全权做主——不自动过期、不自动更新,忘了版本化清理就是「用户永远拿旧版」事故。
  • 观测与清除:DevTools Network Size 栏 + Application 面板是观测主入口;服务端可用 Clear-Site-Data 响应头远程清客户端数据(各指令兼容差异大,"cache" 指令尤其坑)。

本叶地图

  • 入门 —— 一次请求经过哪些缓存层、「200 但没发请求」现象解剖、与网络章的分工
  • 多层缓存总览 —— 命中优先级、每层归属与生命周期、push cache 已死史
  • 内存缓存与磁盘缓存 —— memory vs disk 的行为差异、浏览器如何决策、DevTools 判读
  • HTTP 缓存的浏览器侧落地 —— fresh/stale 之后怎么走、四种刷新行为差异、no-store 的波及面
  • 往返缓存 bfcache —— 整页快照、pageshow/persisted、不可进入条件清单、NotRestoredReasons 诊断
  • Service Worker 缓存与 Cache API —— CacheStorage 模型、与 HTTP 缓存的根本区别、三种策略代码
  • 观测与清除 —— Size 栏全标签判读、Clear-Site-Data、清除数据影响矩阵、排查手册
  • 参考 —— 多层对照 / 刷新矩阵 / bfcache 阻断 / SW 策略选型 / Size 栏判读速查表

文档地址

幻灯片地址

浏览器缓存机制

测试题

浏览器缓存机制 测试题