我使用workbox.routing.registerRoute
向我的应用添加了一些staleWhileRevalidate
,到目前为止,它已经通过了PWA下的大多数灯塔测试。我目前没有使用Precaching。我的问题是,它是强制性的吗?没有预先准备,我错过了什么? workbox.routing.registerRoute
已经缓存了我需要的一切。谢谢!
答案 0 :(得分:13)
必须。 : - )
对所有资产以及HTML使用stale-while-revalidate绝对是一种合法的方法。这意味着您不必在构建过程中执行任何特殊操作,例如,在某些情况下可能会很好。
每当您使用从缓存中读取的策略时,无论是通过预先缓存还是通过重新验证,都会有某种重新验证步骤来确保您不要无限期地提供过期响应。
如果您使用Workbox的预处理,那么重新验证是有效的,因为浏览器只需要为您生成的service-worker.js
文件发出单个请求,并且该响应是否是事实的真相来源任何预先实际改变的东西。假设您的预先存储的资产不会经常更改 ,那么您service-worker.js
的大部分时间与上次检索时相同,并且不会更新时使用的任何其他带宽或CPU周期。
如果您对所有内容使用运行时缓存和重新生效的策略,那么" while-revalidate"每个响应都会发生一步。你会得到#34; stale"几乎立即回复该页面,因此您的整体表现应该仍然很好,但是您需要在服务工作人员的背景下发出额外的请求"重新获取每个URL,并更新缓存。这种方法中使用的带宽和CPU周期都有所增加。
除了使用其他资源之外,您可能更喜欢预先缓存以进行重新验证的另一个原因是您可以提前填充完整缓存,而无需等待他们第一次访问。如果某些资产仅用于您的Web应用程序的子部分,并且您希望提前缓存这些资产,那么如果您只进行运行时缓存,那将会更加棘手。
预先缓存提供的另一个优势是它将更新您的缓存 en masse 。这有助于避免例如一个JavaScript文件由于在前一页上被请求而更新的情况,但是当您导航到下一页时,较新的JavaScript与您的陈旧HTML提供的DOM不兼容。预先处理一切可以减少这些版本错配发生的可能性。 (Get DateTime.Now with milliseconds precision。)