12

我使用 Workbox 预缓存渲染应用程序外壳所需的资产,包括基本版本的index.html. Workbox 假定它index.html在缓存中可用,否则,页面导航将失败,因为我已在我的 Service Worker 中注册了它:

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

self.skipWaiting()我在安装侦听器中也有说明:

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

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

  • Workbox 为预缓存资产注册的一个(包括 index.html)
  • 我在我的 Service Worker 中手动注册的一个

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

4

1 回答 1

30

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

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

  • Service Worker 首先进入installing阶段,无论install你注册了多少监听器,它们都将有机会执行。正如您所建议的,Workbox 创建了自己的install侦听器来处理预缓存。

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

  • skipWaiting(),如果你选择使用它,它会绕过这个waiting阶段,而不管是否有任何打开的客户端使用之前版本的 service worker。

  • skipWaiting()如果任何监听器失败,调用将不会完成任何事情install,因为服务工作者永远不会离开installing阶段。这基本上是一个无操作。

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

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

因为延迟加载预缓存、版本化的资产在 2018 年是一件更常见的事情,所以 Workbox 默认不会调用skipWaiting()您。您可以选择使用它。

于 2018-03-26T14:40:16.087 回答