PWA 是否必须使用 Workbox 进行预缓存?

Is Precaching with Workbox mandatory for PWA?

我使用 staleWhileRevalidate 添加了一些 workbox.routing.registerRoute 到我的应用程序,到目前为止它已经通过了 PWA 下的大多数灯塔测试。我目前根本没有使用预缓存。我的问题是,它是强制性的吗?没有预缓存我错过了什么? workbox.routing.registerRoute 已经缓存了我需要的一切。谢谢!

没有什么是强制性的。 :-)

对您的所有资产以及 HTML 使用 stale-while-revalidate 绝对是一种合法的方法。这意味着您不必在构建过程中执行任何特殊操作,例如,这在某些情况下可能会很好。

每当您使用从缓存中读取的策略时,无论是通过预缓存还是 stale-while-revalidate,都会有某种重新验证步骤来确保您不会最终服务于无限期回复日期。

如果您使用 Workbox 的预缓存,重新验证是有效的,因为浏览器只需要为您生成的 service-worker.js 文件发出一个请求,并且该响应作为是否预缓存任何内容的真实来源实际上改变了。假设您的预缓存资产不会 that 频繁更改,大多数情况下您的 service-worker.js 将与上次检索时相同,并且不会有任何变化更新时使用的更多带宽或 CPU 个周期。

如果您对所有内容都使用运行时缓存和 stale-while-revalidate 策略,那么每个响应都会发生 "while-revalidate" 步骤。您几乎会立即将 "stale" 响应返回到页面,因此您的整体性能应该仍然不错,但是您会招致服务人员 "in the background" 到 re-fetch 发出的额外请求每个 URL,并更新缓存。这种方法增加了带宽和 CPU 周期。

除了使用额外的资源,您可能更喜欢预缓存而不是 stale-while-revalidate 的另一个原因是您可以提前填充完整的缓存,而不必等待它们第一次被访问。如果某些资产仅在您的 Web 应用程序的一个子部分中使用,并且您希望提前缓存这些资产,那么如果您只进行运行时缓存,那将更加棘手。

预缓存提供的另一优势是它会整体更新您的缓存。这有助于避免这样的情况,例如,一个 JavaScript 文件由于在上一页上被请求而被更新,但是当您导航到下一页时,较新的 JavaScript 与DOM 由您的陈旧 HTML 提供。预缓存所有内容可以减少这些版本控制不匹配发生的可能性。 (Especially if you do not enable skipWaiting.)