我使用 Workbox 来预缓存渲染应用程序 shell 所需的 Assets ,包括 index.html
的基本版本. Workbox 假设 index.html
在缓存中可用,否则页面导航失败,因为我在我的 Service Worker 中注册了它:
workbox.routing.registerNavigationRoute('/index.html');
我也有
self.skipWaiting()
安装监听器中的说明:self.addEventListener('install', e => {
self.skipWaiting();
});
据我了解,有 2
install
现在的听众:self.skipWaiting()
可以吗?在 Workbox 的安装监听器失败时成功?这将导致出现问题状态,即 Assets 未预先缓存但 Service Worker 已激活。这种情况是否可能发生,我应该防范吗?
最佳答案
我强烈推荐“The Service Worker Lifecycle”作为有关 Service Worker 安装和更新不同阶段的权威信息来源。
总结该文章中的一些信息,因为它适用于您的问题:
installing
相,不管多install
您已注册的听众,他们都将有机会执行。正如您所建议的,Workbox 创建了自己的 install
监听器来处理预缓存。 install
监听器完成且没有错误,Service Worker 将进入下一阶段,这可能是 waiting
(如果已经有一个使用以前版本的 service worker 的开放客户端)或 activating
(如果没有客户端使用以前版本的 Service Worker)。 skipWaiting()
,如果你选择使用它,它会绕过waiting
无论是否有任何打开的客户端使用先前版本的 Service Worker。 skipWaiting()
如果出现任何 install
将不会完成任何事情监听器失败,因为 Service Worker 永远不会离开 installing
阶段。这基本上是一个无操作。 您应该注意的一件事是使用
skipWaiting()
当您还使用版本化、预缓存 Assets 的延迟加载时。正如文章警告的那样:Caution:
skipWaiting()
means that your new service worker is likely controlling pages that were loaded with an older version. This means some of your page's fetches will have been handled by your old service worker, but your new service worker will be handling subsequent fetches. If this might break things, don't useskipWaiting()
.
由于延迟加载预缓存、版本化 Assets 是 2018 年更常见的事情,Workbox 不会调用
skipWaiting()
默认为您。您可以选择是否使用它。
关于caching - Workbox:self.skipWaiting() 的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482680/