工作箱:self.skipWaiting()的危险

时间:2018-03-26 01:15:55

标签: caching service-worker progressive-web-apps offline-caching workbox

我使用Workbox预先缓存呈现应用程序shell所需的资产,包括index.html的基本版本。 Workbox假定index.html在缓存中可用,否则,页面导航失败,因为我在我的服务工作者中注册了这个:

workbox.routing.registerNavigationRoute('/index.html');

我在安装监听器中也有self.skipWaiting()指令:

self.addEventListener('install', e => {
  self.skipWaiting();
});

据我了解,现在有2个install听众:

  • Workbox为预缓存资产(包括index.html)注册的一个
  • 我在我的服务工作者中手动注册的

当Workbox的安装监听器失败时,self.skipWaiting()是否可以成功?这将导致一个问题状态,即资产未预先缓存但服务工作者已激活。这种情况是否可能,我应该采取防范措施吗?

1 个答案:

答案 0 :(得分:10)

我强烈推荐" The Service Worker Lifecycle"作为服务工作者安装和更新的不同阶段的权威信息来源。

总结一下该文章中的一些信息,因为它适用于您的问题:

  • 服务工作者首先进入installing阶段,但是您注册的许多install个听众都将有机会执行。正如您所建议的那样,Workbox会创建自己的install侦听器来处理预先缓存。

  • 只有当每个install侦听器完成且没有错误时,服务工作者才会转到下一个阶段,该阶段可能是waiting(如果已经有一个打开的客户端使用以前的版本服务工作者)或activating(如果没有客户使用以前版本的服务工作者)。

  • skipWaiting(),如果您选择使用它,将绕过waiting阶段,无论是否有任何使用以前版本的服务工作者的开放客户端。

  • 如果任何skipWaiting()侦听器失败,则调用install将无法完成任何操作,因为服务工作人员永远不会离开installing阶段。它基本上是一种无操作。

当您还使用延迟加载版本化的预先缓存资产时,您应该注意的一件事是使用skipWaiting()。正如文章警告的那样:

  

警告:skipWaiting()表示您的新服务工作者很可能   控制使用旧版本加载的页面。这意味着   您的部分页面提取内容将由您的旧服务处理   工作人员,但您的新服务工作人员将在后续处理   取。如果这可能会破坏事情,请不要使用skipWaiting()

由于延迟加载延迟,版本化资产在2018年更常见,默认情况下Workbox不会为您调用skipWaiting()。您可以选择使用它。