ServiceWorker注册失败。Chrome扩展程序
我不明白如何在 Service Worker 的一部分中从清单 v2 迁移到 v3。发生错误Service worker registration failed
// manifest.json
"background": {
"service_worker": "/script/background/background.js"
},
// background.js
chrome.runtime.onInstalled.addListener(onInstalled);
回答
请在下面找到您的特定问题的原因以及未在控制台日志中获取失败详细信息的原因。
-
在 Chrome 93 之前,service worker 文件必须
在 manifest.json 所在的根路径中。这是 Service Worker 规范的限制,自 Chrome 93 以来对扩展放宽了。
如果出于某种原因,您希望在旧版 Chrome 中使用您的扩展程序,则正确的 manifest.json 应如下所示:
"background": { "service_worker": "background.js" },相反,要使用任意路径,您需要阻止在旧版 Chrome 中安装:
"minimum_chrome_version": 93, "background": { "service_worker": "js/bg/worker-loader.js", "type": "module" },Type
module是可选的,从 Chrome 92 开始就支持。你现在可以静态导入 ES 模块。对动态导入的支持正在开发中。在任何 Chrome 版本中,您都可以用来
importScripts('/path/foo.js', '/path/bar.js');从其他目录导入脚本。 -
如果 Worker 脚本在安装时抛出错误,则该 Worker 将不会被注册,您将不会在控制台中收到由 Service Worker 触发的错误信息,而只会得到“Service Worker 注册失败”。此行为是由于早于 Chrome 93 的 Chrome 版本中的错误错误所致。
解决方案:
- 使用 Chrome 93 或更新版本。
有限的解决方法:
- 将所有内容包装在 try/catch 中,如其他答案所示或使用“加载程序”脚本。
典型原因:
- 访问未声明的变量
- 语法错误,如未闭合的括号
- 访问
chromeAPI 而不在 manifest.json 的permissions字段中声明它 - 工作进程崩溃
回答
如果在将脚本移动到 wOxxOm 提到的根文件夹后仍然存在相同的错误,那么您的 background.js 文件中可能存在错误。然而,在发布这篇文章时,除了 generic 之外,没有足够的错误消息Service worker registration failed。尝试遵循此处描述的 Simeon 解决方法
例如,您可以将 v2background.js脚本包装到一个错误捕获服务工作者中,并在其中导入旧脚本:
// manifest.json
{
"name": "Throw on Register!",
"version": "1.0",
"manifest_version": 3,
"background": {
"service_worker": "background-wrapper.js"
}
}
// background-wrapper.js file
try {
importScripts("background.js");
} catch (e) {
console.error(e);
}
// background.js
console.log("start");
throw new Error("lol");
console.log("end");
之后,您的 Service Worker 将被注册,因为它尽可能简单,并且您将在控制台中看到错误信息。在我的情况下,它看起来像这样:示例
Happy move to v3 🙂