Работник службы рабочего ящика: невозможно использовать оператор импорта вне модуля

Я создаю приложение React с помощью утилиты Create React App и хочу переопределить сервисный работник по умолчанию, который он предоставляет.

Поскольку я не хочу извлекать свое приложение, я использую пакет workbox-build для создания своего работника службы (я также использовал пряжу для установки пакета workbox-sw).

Мой сервисный рабочий код выглядит следующим образом:

/* eslint-disable no-restricted-globals */
import * as core from 'workbox-core';
import * as routing from 'workbox-routing';
import * as strategies from 'workbox-strategies';
import * as precaching from 'workbox-precaching';

self.addEventListener('message', event => {
  if (event.data && event.data.type === 'SKIP_WAITING') {
    self.skipWaiting();
  }
});

core.clientsClaim();

routing.registerRoute(
  new RegExp('^https://fonts.googleapis.com'),
  new strategies.StaleWhileRevalidate({
    cacheName: 'google-fonts-stylesheets-v1',
  })
);

precaching.precacheAndRoute([]);

routing.registerNavigationRoute(
  precaching.getCacheKeyForURL('/index.html'), {
    blacklist: [/^\/_/, /\/[^/?]+\.[^/]+$/],
  }
);

И мой workbox-build скрипт:

const workboxBuild = require('workbox-build');

// NOTE: This should be run *AFTER* all your assets are built
const buildSW = () => {
  // This will return a Promise
  return workboxBuild.injectManifest({
    swSrc: 'src/service-worker.js',
    swDest: 'build/service-worker.js',
    globDirectory: 'build',
    globPatterns: [
      '**\/*.{js,css,html,png,json}',
    ]
  }).then(({
    count,
    size,
    warnings
  }) => {
    // Optionally, log any warnings and details.
    warnings.forEach(console.warn);
    console.log(`${count} files will be precached, totaling ${size} bytes.`);
  });
}

buildSW();

Для регистрации сервисного работника я использую:

import { Workbox } from 'workbox-window';

export function register() {
  if ('serviceWorker' in navigator) {
    const wb = new Workbox('/service-worker.js');
    wb.register();
  }
}

Однако, когда я запускаю свое приложение, я получаю следующие ошибки:

service-worker.js:2 Uncaught SyntaxError: Cannot use import statement outside a module
:3000/107/aggregator:1 Uncaught (in promise) TypeError: Failed to register a ServiceWorker for scope ('http://localhost:3000/') with script ('http://localhost:3000/service-worker.js'): ServiceWorker script evaluation failed

Что я делаю не так?


person Felipe    schedule 10.12.2019    source источник


Ответы (1)


В воркерах пока нет поддержки модулей.

importScripts() может сделать эту работу за вас, но он не может импортировать модули, то есть все, что содержит ключевое слово "export" внутри.

https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/importScripts

person fips    schedule 26.03.2020
comment
Это означает, что лучшим решением, вероятно, будет скомпилировать этот сервис-воркер, а затем переместить скомпилированную версию в /public. - person Andy; 26.02.2021