javascript - 工作箱服务人员: Cannot use import statement outside a module

标签 javascript reactjs workbox

我正在使用 Create React App 实用程序创建一个 React 应用程序,并且我想覆盖它提供的默认服务工作线程。

由于我不想弹出我的应用程序,因此我使用 workbox-build包来创建我的服务 worker (我还使用 yarn 来安装 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();

为了注册我正在使用的服务 worker :

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

我做错了什么?

最佳答案

当前答案

根据Mozilla's documentation现在应该可以工作了,但请留意最新的 implementation status在每个浏览器中。 Firefox 和 Opera(自版本 67 起实现) 仍然落后。

Mozilla 将在 Firefox 114 中实现该功能。

<小时/>

2020 年的原始答案

workers 中尚无模块支持。

importScripts() 可以为您完成这项工作,但它不能导入模块,这意味着任何内部带有“export”关键字的内容。

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

关于javascript - 工作箱服务人员: Cannot use import statement outside a module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272083/

相关文章:

通过单击 CSS 类触发 JavaScript,但我需要它从 HTML map 区域热点触发?

javascript - React element - 数组对象仅返回第一项?

javascript - 客户端页面和 Service Worker 之间的双向通信

webpack - 错误的 list 预缓存位置

service-worker - 为什么网络优先策略比没有 Service Worker 慢?

javascript 需要一个标识符,但看到的是 '&lt;!'

javascript - 一个 JS 文件中的多个函数

php - 动态加载的缩略图显示其他缩略图的全尺寸图像而不是它自己的(使用 javascript 悬停效果)

reactjs - Onclick 按钮 我想在 ReactJS 中渲染多个组件?

javascript - 如何根据 REACT 中的文本输入从 API 进行搜索