在生产版本中注册Service-Worker脚本时出错

我正在使用Workbox Webpack插件(v4.3.1)生成服务工作者脚本,并使用Workbox-Window(v4.3.1)插件进行注册。

在开发环境(我使用webpack开发服务器)上一切正常,但是在生产版本中,我在Chrome(v78)开发控制台上收到以下错误:

Uncaught (in promise) TypeError: Failed to register a ServiceWorker for scope ('http://localhost:4321/') with script ('http://localhost:4321/undefined'): A bad HTTP response code (404) was received when fetching the script.

(注意:我正在使用本地Nginx服务器来测试我的生产版本)

我正在像这样使用Workbox Webpack GenerateSW:

new WorkboxPlugin.GenerateSW({
  clientsClaim: true,skipWaiting: false
})

我确认,在构建之后,将生成服务工作者脚本(service-worker.js),并将其保存在dist文件夹中。

我正在使用Workbox-Window插件注册上述服务工作者脚本:

 import { Workbox } from 'workbox-window'

 if ('serviceWorker' in navigator) {
      const wb = new Workbox('/service-worker.js') // Note: I also tried without the bar and with path './service-worker.js' and didnt work
      wb.register()
  }

我猜测该问题与Im使用Nginx测试产品构建的事实无关,也与提供给Workbox构造函数的Service Worker脚本的url或路径无关,因为使用ServiceWorker Web API而不是Workbox Window API,效果很好:

if ('serviceWorker' in navigator) {
   navigator.serviceWorker.register('/service-worker.js') // THIS WORKS!!!
}

为什么在完全相同的条件下,使用Workbox Window API的服务工作者注册失败?您可以在错误日志中看到的undefined来自哪里?

*编辑* 我在Workbox GitHub存储库上打开了一个问题。您可以找到它here

nidi_2 回答:在生产版本中注册Service-Worker脚本时出错

我遇到了同样的问题,当我在这里看到你的帖子时,我寄予了希望。经过一阵失望之后,我开始在网上寻找和寻找启发。无论如何,我有一个与您类似的设置,在开发环境中它可以工作,而在生产环境中却不行。

我的特定设置是:Python 3 + Flask + Webpack + npm + Apache HTTPD

我为解决此问题所做的就是从以下位置修改导入语句:

import { Workbox } from 'workbox-window'

对此:

import { Workbox } from 'workbox-window/Workbox.mjs';

根据Google Workbox网站上的以下文档: Workbox Advanced bundling concepts

此后,我需要更新我的Webpack设置以捆绑Babel-Polyfill,以便能够避免由于工作区窗口所使用的promise和await函数引起的regeneratorRuntime错误,方法是安装并包括在此处,包括如下所述: @babel/Polyfillbabel-polyfill取决于您的设置,并将其添加为module.exports配置中的条目。

希望这可以帮助遭受此模棱两可和详尽错误的其他人。

本文链接:https://www.f2er.com/3143104.html

大家都在问