TOP

浏览器缓存

浏览器缓存分为强缓存和协商缓存,浏览器刷新页面分为:「重新加载页面」、「硬性加载页面」和「清空缓存并重新加载页面」,此外还有 PWA 和浏览器存储,这些都为浏览器缓存相关的一些知识点,这篇文章会快速提炼出这些要点。

缓存

最佳实践:

类型控制字段行为说明
强缓存ExpiresCache-Control (max-ages-max-ageno-cacheno-store)命中则直接使用本地缓存,不发请求s-max-age 专供中间代理缓存(CDN 等),优先级高于 max-age
协商缓存Last-Modified/If-Modified-SinceETag/If-None-Match请求时带验证字段,服务器返回 304 或新资源精度:ETag > Last-Modified

强缓存

协商缓存

缓存过程

  1. 强缓存过期走协商缓存
  2. 强缓存配置为 no-cache 走协商缓存
  3. 强缓存为no-store 不允许缓存
  4. 没有强缓存的字段则使用启发缓存,启发缓存过期了才使用协商缓存
    • 这些启发式规则通常基于响应头中的 Last-Modified 时间。浏览器会执行如下计算: (CurrentTime - LastModifiedDate) * 0.1 例如,如果一个资源在 100 小时前被修改,浏览器可能会尝试将它缓存 100 * 0.1 = 10 小时
  5. 协商缓存优先看 Etag 没有再看 Last-Modified
  6. 没有任何缓存字段则不使用缓存

重新加载

刷新方式强缓存协商缓存特点
普通刷新 (F5)失效可能使用大部分静态资源依旧走协商缓存
硬性加载页面 (Ctrl+F5)跳过跳过所有资源都向服务器重新请求
清空缓存并重载删除缓存全部重新拉取确保获取最新资源

硬性加载页面

浏览器在请求头中加上 Cache-Control: no-cachePragma: no-cache,强制服务器返回最新资源,同时绕过本地缓存。

特点:在 HTML 内联的资源都会自动添加上这个头部,但在 JS 执行中异步加载的资源不会自动添加头部,可能继续命中缓存

清空缓存并重新加载页面

浏览器清空当前 Host 下的所有缓存,并重新加载资源,此时,所有资源都会重新从服务端获取,并配置缓存

浏览器存储

PWA - Service Worker

拦截网络请求并自定义缓存策略,通过编程更自由的操控缓存提升页面加载速度。通过绕过 HTTP 头部限制可以实现:

  1. 离线可用
  2. 自定义缓存优先级
  3. 后台同步更新

通常只有功能一比较常见,最佳实践是将 Service Worker 视为浏览器缓存网络的一个强大可编程扩展

对于简单的资源,允许它们“穿过”Service Worker,使用标准的 HTTP 缓存;对于需要特殊处理的资源(如离线所需的核心文件、需要后台更新的API数据),则在 Service Worker 中实现你自己的高级缓存策略。

Cookie、Storage

IndexedDB

浏览器内建数据库,支持结构化数据存储,容量大,适合离线应用,可以配合 ServiceWorker 的 Cache API 使用。

将 Cache API 视为你的 “静态资源仓库”,用于存储应用本身的代码和资源

将 IndexedDB 视为你的 “动态数据库”,用于存储应用产生的结构化数据。