返回

浏览器如何利用缓存机制加快用户的访问速度?

前端

所有浏览器都有自己的缓存机制,它们通过将资源缓存到本地,借此加速用户访问客户端的速度,减少服务器压力。在介绍它之前,我们先来看看旧的缓存策略。

chrome 86 版本以前,引用/储存缓存的键名是资源的 URL。如图:

[图片]

也就是说,如果有其他任何网站引用到了同个 URL的资源,那么这两者都会引用到同一缓存,如果 one.com 修改了其缓存资源(通常是资源更新了),那么 two.com也会收到一份一样的资源,即便 two.com 并没主动索要一份更新。这样就会导致缓存机制失效。

Chrome 86 的 Cache partitioning 就是针对此问题做出的优化。

简而言之,Cache partitioning 就是把相同 URL 的资源,如果其与不同服务相关联,则会放到不同的 Cache 里,由不同的 Service 来引用。如图:

[图片]

当 one.com 更新其缓存资源时,其只更新了它自己的资源,而 two.com 可以接着用旧的资源,没有任何影响。

最关键的是,这并不需要额外的网络请求,因为所有这些都是在缓存阶段进行的。

Cache Partitioning 的运作原理

Chrome 是如何知道一个 URL 属于哪一个 Service 的呢?

Chrome 是通过 COOP(Cross-Origin Opener Policy)和 COEP(Cross-Origin Embedder Policy)这两个 HTTP 头信息来识别的。它们会在解析 HTML 时自动添加到每个资源请求中。

如果两个资源都来自于同一个 Service,那么 Chrome 将其放入同一个 Cache Partition 中。如果两个资源来自不同的 Service,则 Chrome 将其放入不同的 Cache Partition 中。

Cache Partitioning 的使用

Cache Partitioning 可以通过在 HTML 中添加 <link> 标签来启用。该标签应包含 rel="origin-isolation" 属性。

<link rel="origin-isolation" href="same-origin">

这将告诉 Chrome 将页面及其所有资源放入同一个 Cache Partition 中。

也可以通过在 JavaScript 中调用 navigator.storage.overrideQuota() 方法来启用 Cache Partitioning。

navigator.storage.overrideQuota(storageType, newQuotaInBytes);

这将告诉 Chrome 将给定的存储类型(例如, temporarypersistent)的所有资源放入同一个 Cache Partition 中。

优点和缺点

Cache Partitioning 有以下优点:

  • 提高了缓存命中率。
  • 减少了不必要的网络请求。
  • 改善了安全性。

Cache Partitioning 也有以下缺点:

  • 可能会增加内存使用量。
  • 可能会降低某些网站的性能。

结束语

Cache Partitioning 是一项新功能,它可以提高浏览器的性能和安全性。不过,它也可能对某些网站的性能产生负面影响。因此,在使用 Cache Partitioning 之前,请仔细权衡其利弊。