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

Joh*_*ika 7 caching offline-caching service-worker progressive-web-apps workbox

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

workbox.routing.registerNavigationRoute('/index.html');
Run Code Online (Sandbox Code Playgroud)

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

self.addEventListener('install', e => {
  self.skipWaiting();
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jef*_*ick 16

我强烈推荐" 服务工作者生命周期 "作为服务工作者安装和更新的不同阶段的权威信息来源.

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

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

  • 只有当每个install监听器完成且没有错误时,服务工作者才会进入下一个阶段,这可能是waiting(如果已经有一个使用以前版本的服务工作者的开放客户端)或者activating(如果没有客户端使用以前的版本)服务人员).

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

  • skipWaiting()如果任何install听众失败,呼叫将无法完成任何事情,因为服务工作者永远不会离开installing阶段.它基本上是一个无操作.

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

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

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

  • 这与 https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#the_first_service_worker 中所涵盖的内容有些相同:_install 事件是服务工作线程获得的第一个事件,并且只会发生一次。传递给 installEvent.waitUntil() 的承诺表示安装的持续时间以及成功或失败。在成功完成安装并变为“活动”之前,服务工作人员不会接收诸如获取和推送之类的事件。_ (2认同)