我在看 service worker practice 和workbox。
有很多文章谈论预缓存,workbox 甚至为此提供了特殊的方法precachingAndRoute()
。我想我理解预缓存和运行时缓存之间的概念差异,但让我感到困惑的是为什么要如此特殊地对待预缓存?
我读过的所有关于预缓存的文章都强调了它如何在客户端离线时使 Web 应用程序可用。这不是缓存(即使它不是预缓存)的用途吗?我的意思是,如果配置正确,运行时缓存似乎也可以实现这一点。是否必须预先缓存才能使 Web 应用程序离线工作?
唯一明显的区别是何时创建缓存。那么,如果客户端离线,无论是预缓存还是运行时缓存,都无法创建缓存,如果在客户端在线时的最后一次访问期间创建了缓存,那么对于当前访问响应的缓存有什么关系呢?预缓存还是运行时缓存?
考虑 2 个抽象案例进行比较。假设我们有两个不同的服务工作者,一个 ( /precache/sw.js
) 只做预缓存,另一个 ( /runtime/sw.js
) 只做运行时缓存,其中/precache
托管/runtime
相同的 Web 应用程序(意味着要缓存相同的资产)。
在什么情况下,由于不同的 sw 设置,Web 应用程序可能会以不同的方式/precache
运行?/runtime
在我的理解中,
- 如果无法创建缓存(例如第一次访问时离线),那么预缓存和运行时缓存应该没有什么不同。
- 如果可以成功创建预缓存(即客户端在第一次访问时在线),则运行时缓存也应该如此。(让我们不要过于疯狂,例如客户可能仅在某个特定时刻在线,在我的示例中它们仍然应该是相同的。)
- 如果缓存可用,则预缓存和运行时缓存无关,因此仍然相同。
当 precache 显示优势时,我能想到的唯一场景是,当缓存需要在当前访问时更新时,precache 确保当前访问获得最新信息。如果是这种情况,NetworkFirst 运行时缓存不会做同样的事情吗?而且,与“离线”无关,我读过的几乎每一篇关于 sw 预缓存的文章都会提到。
在线/离线如何使预缓存成为英雄?
我在这里错过了什么,预缓存有什么特别之处?