浏览器缓存规则

分类

  • 按缓存位置分类 (memory cache, disk cache, Service Worker 等)

它们的优先级是:(由上到下寻找,找到即返回;找不到则继续)

  1. Service Worker
  2. Memory Cache
  3. Disk Cache
  4. 网络请求
  • 按失效策略分类 (Cache-ControlETag 等)

Cache-control 的优先级高于 Expires

Etag 的优先级高于 Last-Modified

缓存小结

当浏览器要请求资源时

  1. 调用 Service Worker 的 fetch 事件响应
  2. 查看 memory cache
  3. 查看 disk cache。这里又细分:
    1. 如果有强制缓存且未失效,则使用强制缓存,不请求服务器。这时的状态码全部是 200
    2. 如果有强制缓存但已失效,使用对比缓存,比较后确定 304 还是 200
  4. 发送网络请求,等待网络响应
  5. 把响应内容存入 disk cache (如果 HTTP 头信息配置可以存的话)
  6. 把响应内容 的引用 存入 memory cache (无视 HTTP 头信息的配置)
  7. 把响应内容存入 Service Worker 的 Cache Storage (如果 Service Worker 的脚本调用了 cache.put())

 

浏览器的行为

所谓浏览器的行为,指的就是用户在浏览器如何操作时,会触发怎样的缓存策略。主要有 3 种:

  • 打开网页,地址栏输入地址: 查找 disk cache 中是否有匹配。如有则使用;如没有则发送网络请求。
  • 普通刷新 (F5):因为 TAB 并没有关闭,因此 memory cache 是可用的,会被优先使用(如果匹配的话)。其次才是 disk cache。
  • 强制刷新 (Ctrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache)。服务器直接返回 200 和最新内容。
posted @ 2022-04-24 15:32  下一秒钟已经不同  阅读(139)  评论(0编辑  收藏  举报