4

我有一个来自我的服务人员js/index.js

import '../scss/app.scss';
// Detect if service workers enabled
if ('serviceWorker' in navigator) {
  try {
    navigator.serviceWorker.register('../sw.js');
    console.log('Service Worker Registered');
  } catch (error) {
    console.log('Service Worker Register Failed');
  }
}

和我的根目录中的 sw.js:

const staticAssets = ['./', 'scss/app.scss', 'js/index.js'];
self.addEventListener('install', async (event) => {
  const cache = await caches.open('min-static');
  cache.addAll(staticAssets);
});
self.addEventListener('fetch', (event) => {
  console.log('fetch');
});

被 babelized 并通过 parcel 放入 dist 文件夹。当它构建完成并转到 时localhost,我打开 chrome 工具并进入应用程序选项卡。我进入缓存存储选项卡,然后: 缓存存储只有一个标题,说缓存存储。 还有一个控制台错误显示 ReferenceError: regeneratorRuntime is not defined 发生了什么事?为什么我的网站没有像PWA 教程中那样得到很好的缓存?它不应该是这样的吗: 我没有的缓存文件的好表?当然,我正在通过 babel 运行所有内容,但为什么它不起作用?

提前致谢!

4

2 回答 2

5

发生错误regeneratorRuntime is not defined是因为 Babel(Parcel 使用它来转换代码)正在为您的构建中的 ES6 生成器生成一个 polyfill。要禁用它(并解决您的问题),您需要指定您不希望生成器被转译。

轻松修复

解决此问题的一种简单方法是将以下行添加到您的 package.json 中:

"browserslist": [
  "since 2017-06"
],

这使得您的构建将仅尝试支持自 2017-06 以来发布的浏览器版本,这些版本确实支持 ES6 生成器,因此不需要 polyfills 来实现该功能。

备择方案

您可能希望根据应用程序的目标受众来试验这些值,例如,这也应该有效:

"browserslist": [
  "last 3 and_chr versions",
  "last 3 chrome versions",
  "last 3 opera versions",
  "last 3 ios_saf versions",
  "last 3 safari versions"
]

更多信息

如果您想查看每个浏览器支持哪些功能,您可以在此处查看

如果你想检查哪些选项对这里browserslint检查有效。

这里还有关于您的具体问题的更多讨论。

于 2019-07-29T15:44:46.053 回答
4

我对 Parcel 很陌生,我也面临同样的问题。

在网上搜索了几个小时后,我想这可能与这个问题有关parcel-bundler/parcel #301: PWA support

虽然,有 2 个插件和 1 个讨论发誓要解决这个问题。目前,我没有看到任何完美的解决方案。

如果您碰巧发现了一些新发现,请告诉我们。

于 2019-01-09T10:37:50.690 回答