5

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

4

1 回答 1

16

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

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

每当您使用从缓存中读取的策略时,无论是通过预缓存还是在重新验证时过时,都会有某种重新验证步骤,以确保您最终不会无限期地提供过时的响应。

如果您使用 Workbox 的预缓存,那么重新验证是有效的,因为浏览器只需要对您生成的service-worker.js文件发出一个请求,并且该响应可作为事实来源,以确定任何预缓存是否实际发生了变化。假设您的预缓存资产不经常更改那么您的大部分时间service-worker.js将与上次检索它的时间相同,并且不会有任何进一步的带宽或 CPU 周期用于更新。

如果您对所有内容使用运行时缓存和 stale-while-revalidate 策略,那么每个响应都会发生“while-revalidate”步骤。您几乎会立即将“陈旧”响应返回到页面,因此您的整体性能应该仍然不错,但是您的服务工作者“在后台”发出额外请求以重新获取每个 URL,并且更新缓存。这种方法中使用的带宽和 CPU 周期有所增加。

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

预缓存提供的另一个优势是它会整体更新您的缓存。这有助于避免以下情况,例如,一个 JavaScript 文件由于在前一页上被请求而被更新,但是当您导航到下一页时,较新的 JavaScript 与您的陈旧 HTML 提供的 DOM 不兼容。预先缓存所有内容可以减少发生这些版本控制不匹配的机会。(特别是如果您启用skipWaiting。)

于 2018-03-08T16:32:15.667 回答