我使用Workbox预先缓存呈现应用程序shell所需的资产,包括index.html
的基本版本。 Workbox假定index.html
在缓存中可用,否则,页面导航失败,因为我在我的服务工作者中注册了这个:
workbox.routing.registerNavigationRoute('/index.html');
我在安装监听器中也有self.skipWaiting()
指令:
self.addEventListener('install', e => {
self.skipWaiting();
});
据我了解,现在有2个install
听众:
当Workbox的安装监听器失败时,self.skipWaiting()
是否可以成功?这将导致一个问题状态,即资产未预先缓存但服务工作者已激活。这种情况是否可能,我应该采取防范措施吗?
答案 0 :(得分:10)
我强烈推荐" The Service Worker Lifecycle"作为服务工作者安装和更新的不同阶段的权威信息来源。
总结一下该文章中的一些信息,因为它适用于您的问题:
服务工作者首先进入installing
阶段,但是您注册的许多install
个听众都将有机会执行。正如您所建议的那样,Workbox会创建自己的install
侦听器来处理预先缓存。
只有当每个install
侦听器完成且没有错误时,服务工作者才会转到下一个阶段,该阶段可能是waiting
(如果已经有一个打开的客户端使用以前的版本服务工作者)或activating
(如果没有客户使用以前版本的服务工作者)。
skipWaiting()
,如果您选择使用它,将绕过waiting
阶段,无论是否有任何使用以前版本的服务工作者的开放客户端。
如果任何skipWaiting()
侦听器失败,则调用install
将无法完成任何操作,因为服务工作人员永远不会离开installing
阶段。它基本上是一种无操作。
当您还使用延迟加载版本化的预先缓存资产时,您应该注意的一件事是使用skipWaiting()
。正如文章警告的那样:
警告:
skipWaiting()
表示您的新服务工作者很可能 控制使用旧版本加载的页面。这意味着 您的部分页面提取内容将由您的旧服务处理 工作人员,但您的新服务工作人员将在后续处理 取。如果这可能会破坏事情,请不要使用skipWaiting()
。
由于延迟加载延迟,版本化资产在2018年更常见,默认情况下Workbox不会为您调用skipWaiting()
。您可以选择使用它。