Firefox 上的 Manifest v3 后台脚本/服务工作者

Lua*_*ico 34 firefox google-chrome cross-browser browser-extension service-worker

我正在尝试将我的浏览器扩展(我希望在 Chrome 和 Firefox 上运行)从清单 v2 迁移到 v3。

\n

但是,我收到有关该background部分的相互矛盾的信息。我对谷歌和堆栈溢出做了很多研究,但似乎没有人在任何事情上达成一致。此外,大多数信息似乎已经过时。在我找到的最好的来源中,很多地方都提到它应该迁移到service_workerexample),但 Firefox 似乎仍然应该使用scriptssource)。

\n

但无论我做什么,我都会遇到错误。如果我只使用 Service Worker:

\n
"background": {\n    "type": "module", // tried both with and without this option\n    "service_worker": "background.ts"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

来自的构建命令parcel很高兴(似乎在下面使用parcel/transformer-webextension),但web-ext灾难性地失败了:

\n
WebExtError: installTemporaryAddon: Error:\nError: Could not install add-on at \'...\':\nError: background.service_worker is currently disabled\n
Run Code Online (Sandbox Code Playgroud)\n

即使我提供了--firefox-preview应该解决此问题的标志。

\n

这有点有道理,这篇写得很好的教程声称 Firefox 继续使用scriptsV3,只是弃用了该persisent标志(您可以删除该标志或将其设置为 false)。没关系,因为无论如何我都没有使用它。

\n
"background": {\n    "scripts": ["background.ts"],\n    "persistent": false // `persistent` must either be false or omited; I tried both\n}\n
Run Code Online (Sandbox Code Playgroud)\n

事实上,这正是Firefox 官方文档声称 V3 应该支持的方式。

\n

但包裹抱怨说^^^ Missing property service\\_worker

\n

包裹错误截图

\n

好的,让我们尝试一下:

\n
"background": {\n    "type": "module",\n    "service_worker": "background.ts",\n    "scripts": ["background.ts"]\n},\n
Run Code Online (Sandbox Code Playgroud)\n

但包裹不满意,有Invalid Web Extension manifest

\n

包裹错误截图

\n

因此,无论我尝试什么,我都无法同时获得快乐parcelweb-ext

\n

似乎 Chrome 想要一件事,而 Firefox 想要另一件事,但无论我尝试什么,我什至都无法在这两个浏览器上运行我的扩展。因此,我不仅无法为这两种浏览器提供 V3 扩展 - 如果我想同时使用parcelweb-ext(据我所知,这是不可或缺的),我根本无法拥有 V3 扩展。

\n

我特别担心,因为根据chrome 官方消息,Manifest V3 从现在开始是“特色徽章\xe2\x81\xa0 的先决条件” ,而 V2 将于 6 月删除。

\n

那么,如果我已经因为现在不使用 V3 而受到惩罚,并且只有不到 6 个月的时间来弄清楚如何使用,而所有可用的工具似乎都还没有支持该版本呢?我肯定错过了什么...

\n
\n

注意:这些是我用来运行 Parcel 和 web-ext 的命令:

\n
        "watch": "parcel watch src/manifest.json --dist-dir distribution --no-cache --no-hmr",\n        "start": "web-ext run --firefox-preview"\n
Run Code Online (Sandbox Code Playgroud)\n

这些是我正在使用的版本,都是 NPM 上的最新版本

\n
        "parcel": "^2.8.2",\n        "web-ext": "^7.4.0",\n
Run Code Online (Sandbox Code Playgroud)\n

jsn*_*ack 35

刚刚遇到同样的问题:

  • Chrome不满意background.scripts,坚持使用background.service_worker
  • Firefox 不支持background.service_worker并且想要background.scripts

Manifest v3 是由 Google 开发的,所以看起来 Firefox 团队还没有完全实现它。Firefox 109 是第一个“支持”manifest v3 的版本(1 月 17 日发布)。

我很快就在 bugzilla 上找到了票1和票2。看来短期内不会修复!

更糟糕的是,Chrome 不再接受带有清单 v2 的新扩展!这可能就是 Firefox 团队决定在没有 Service Worker 支持的情况下启用 Manifest v3 扩展的原因。

web-ext也是由 Mozilla 开发的,只是有这样的东西:

"background": {
    "scripts": ["background.js"]
},
Run Code Online (Sandbox Code Playgroud)

应该允许您(没有跨浏览器兼容性!)将其发布到 Firefox 市场并使用web-ext工具(它还有非常详细的内置 lint 子命令./node_modules/.bin/web-ext lint

  • FWIW,添加了一个简单的 npm 包,用于在 v3 风格之间进行转换:https://github.com/brettz9/convert-manifest-format (3认同)

cir*_*den 10

我查看了 Parcel-Bundler 更改历史记录,发现 Manifest V3 支持是在 2022 年 4 月添加的,之后Mozilla 提供了Manifest V3 实现的详细信息,其中不包括 Chrome 添加 Service Workers 来替换后台页面。

时至今日,Mozilla 只提供了有关 Manifest v3 愿景的高级细节,这使得 Firefox 的实现只完成了一半,并且(本文值得注意)在包含后台脚本时与 Chrome 的实现不同。

这给 Parcel 带来了几个问题,因为它们的捆绑器依赖一致的清单标准来生成可跨浏览器使用的单个可分发文件。您提出的问题是有效的,Parcel 仅支持 Chrome 版本的 Manifest v3。更大的问题是,在可预见的将来,Firefox 将需要与其他浏览器不同的清单文件,而 Parcel-bundler 仅支持必须命名为 'manifest.json' 的单个清单文件。

有一个开放的拉取请求,以添加对使用不同名称的多个清单文件的支持,但尚未合并(在撰写本文时)。我不确定这个解决方案有多合适,因为这些更改不能解决这个特定问题。

我在 Parcel-bundler 存储库中打开了一个错误,以记录与 Firefox Manifest V3 的不兼容性,但目前无法为 Firefox 构建包含使用 Parcel 的后台脚本的 Manifest V3 扩展。