开发者问题收集

如何合并两个 Service Worker?

2020-10-22
494

我的应用程序中有两个服务工作线程。

第一个由 create-react-app 通过 workbox 自动生成,负责缓存静态构建资产,例如已编译的 javascript 和 css 文件。

第二个由我手动创建,负责在用户在应用程序中收到新消息时发送推送通知。

问题是,这两者都需要访问根范围,而我最近才发现两个服务工作线程不能共享一个范围。

我该如何协调呢?第二个服务工作线程(用于推送通知)仅在用户单击以允许应用程序内的推送通知时才注册,如下所示:

function subscribeUserToPush(cb) {
  if ('Notification' in window && navigator.serviceWorker) {
    return navigator.serviceWorker.register('/sw-notifications.js').then(function(registration) {
      let subscribeOptions = {
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array('the-code-qc=')
      };

      return registration.pushManager.subscribe(subscribeOptions);
    }).then(cb);
  }
}

除非它们位于根范围内,否则两者都不起作用。当限制每个范围只能有一个服务工作线程使用时,我怎样才能让它们都工作呢?

1个回答

我建议使用 create-react-app v4 ,以及 cra-template-pwa

这将为您提供一个基于 Workbox 的服务工作线程,可以使用附加逻辑(例如推送通知代码)进行完全自定义。

遗憾的是, c-r-a 的早期版本在这方面无法进行自定义。

Jeff Posnick
2020-11-03