Как объединить двух работников службы?

#javascript #google-chrome #create-react-app #service-worker

#javascript #google-chrome #создать-реагировать-приложение #service-worker

Вопрос:

В моем приложении есть два сервисных работника.

Первый автоматически генерируется create-react-app через workbox и отвечает за кэширование статических ресурсов сборки, таких как скомпилированные файлы javascript и css.

Второй был создан мной вручную и отвечает за рассылку push-уведомлений, когда пользователь получает новое сообщение в приложении.

Проблема в том, что для обоих из них требуется доступ к корневой области, и я только недавно узнал, что два работника службы не могут совместно использовать область.

Как мне это согласовать? Второй работник службы (для push-уведомлений) регистрируется только тогда, когда пользователь нажимает, чтобы разрешить push-уведомления в приложении, например:

 function subscribeUserToPush(cb) {
  if ('Notification' in window amp;amp; 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. Как насчет создания 1 sw на корневом уровне, а другого на уровне вложенной области?

Ответ №1:

Я бы рекомендовал использовать create-react-app v4 вместе с cra-template-pwa .

Это даст вам service worker на основе Workbox, который можно полностью настроить с помощью дополнительной логики, например, кода push-уведомления.

Более ранние версии c-r-a , к сожалению, не настраиваются в этом отношении.