Re: [-GC-][-Fx-] 撰写跨浏览器套件的注意事项

楼主: danny0838 (道可道非常道)   2025-06-08 23:07:45
因应谷歌强推 Manifest V3,更新一些资讯。
1. 支援浏览器版本
1.1. 若要共用 manifest.json,一般要 Firefox / Chromium >= 121。
因为目前 Firefox MV3 只支援 background page,
Chromium MV3 只支援 background service worker,
二者在 manifest.json 的 background 有不同的 property 设定值。
在 121 版以后,可以在 manifest.json 填入二种设定值,
浏览器会自动忽略不支援的值。
然而在 121 版以前的 Firefox/Chromium,
若 manifest.json 的 background 含有不支援的设定值,就无法加载套件,
因此无法共用 manifest.json,必须为不同浏览器准备不同的 manifest.json,
除非你的套件完全不使用 background script。
不过这点不算是刚需,因为很多开发者本来就会模组化撰写并使用打包脚本。
详见:https://t.ly/Hju1V
1.2. 由于根凭证过期问题,一般只有 Firefox >= 115 可以安装套件。
若要在旧版的 Firefox 安装套件,主要有二种方法:
(1) 安装 Fx ESR 或 Developer 版本,并关闭签署检查。
(2) 更改 Firefox 的二进制码
详见:#1duAWaDJ (Browsers)
1.3. Manifest V3 支援门槛:Firefox >= 109, Chromium >= 88
1.4. Firefox for Android 一般支援门槛:Firefox >= 113
Firefox for Android 技术上来说,
113 <= Fx 开始支援从 Firefox 附加元件站 (AMO) 安装 Android 套件;
79 <= Fx < 113 必须使用 Nightly 且用比较复杂的开发人员方式安装;
68.2 <= Fx < 79 可以安装桌机版的 Firefox 套件(前提是程式/API可以跑)。
但那些都是浮云,由于 1.2. 根凭证问题,
目前 Firefox for Android < 115 其实都无法安装套件,
除非有高人开发出让 Firefox for Android 绕过安装及签署限制的方法。
(1.2. 相关方法只适用桌机版)
详见:#1bewwsWQ (Browsers)
1.5. 作业系统支援:
Windows XP: Firefox <= 52, Chromium <= 49
Windows 7/8: Firefox <= 115, Chromium <= 109
Windows XP 太老,目前应该几乎没人在考虑了,要用也是为了使用旧版套件。
Windows 7/8 官方已停止支援,不过目前大约还有 2.5% 的桌机市占率。
综上所述,
一般而言建议写成 MV3 并支援 Firefox >= 115 / Chromium >= 109;
若要懒一点直接共用 manifest.json,需求会上升到 Firefox/Chromium >= 121;
若想多照顾一些使用者,可以把门槛降低到 Firefox >= 109 / Chromium >= 88,
但实际上开发者得花额外心力处理更多API相容问题,
使用者也要处理签署问题,
值不值得请自行三思。
至于写成 MV2 套件,一般而言不太推荐,
毕竟 Chromium 通常会强制更新浏览器,且现在已拚命阻止使用者安装及使用 MV2,
不久即将停止支援,到时候大家都不能用;
Firefox 则因为根凭证问题导致低于 115 版本安装套件麻烦又不安全,
扩大支援版本的效益不是很大。
当然如果你的套件是 MV2 就存在很久的套件,
并且 MV3 确实会影响安装、使用或基本功能,
那就另当别论。
2. chrome vs browser API
在 Manifest V2 时,
开发跨平台套件通常要嘛 chrome.* 用到底,
要嘛用 browser.* 并且在 Chromium 挂上 browser-polyfill.js。
在 Manifest V3,
Chromium 大部分 API 已支援回传 promise,
因此即使想用 promise 也可以选择 chrome.* 用到底,
或者用 browser.* 并且在 Chromium 加上 browser = chrome 的超轻量 polyfill。
然而 Chromium 的 onMessage 仍然不支援回传 Promise(以及在发讯端直接 error),
如有此需求,还是可以考虑挂上 browser-polyfill.js。
但相对地,browser-polyfill.js 更新有点缓慢,
有些 Chromium 较晚加入的 API,直接透过此 polyfill 呼叫会出错,
需要反映给官方更新,
或自行在原始码的 const apiMetadata 那边补上未定义的 API。
(详见:https://t.ly/GCffk)
3. service worker vs background page
Chromium MV3 强迫把 background page 改成 service worker,
一个不小的冲击是无法使用 DOM API,例如 document, DOMParser, XMLHttpRequest;
以及 service worker 会定期休眠及重启导致许多东西需要重载。
对于前者,官方提供的解决方案是使用 offscreen API (Chromium >= 109),
这个 API 可以建立一个永久性的隐藏页面,供上述需求使用,
实务上要写一些 messaging 和 background service worker 沟通。
(详见:https://t.ly/5vIk7)
Firefox MV3 目前还不支援此 API,
虽然 Firefox MV3 目前还在使用 background page,不会因此无法使用 DOM API,
但因为根本没有相关 API,如果要跨浏览器,
得写些包裹二种使用情境的判断式或高阶 API,会有点麻烦。
至于后者,目前还没有完美解法,
一个比较偷懒的做法是定期执行 API 使 worker 不断处于活跃状态,
但在某些情况仍会有问题(例如电脑休眠重启)。
Firefox MV3 的 background page 也强迫改成 non-persistent,
因此也会有同样问题要处理。
4. 使用者自订脚本
之前传说 MV3 会导致猴子死光,这点目前官方有善意回应。
新的 userScripts API (Chromium >= 120, Firefox >= 136)
可以允许使用者写入的任意脚本以类似 content scripts 的方式执行,
但无法呼叫 messaging 以外的 extension API。
此外 Chromium 必须要使用者开启开发人员模式才能使用此 API。
目前所见 Tampermonkey MV3 版本已确定可运作。
详见:https://t.ly/oJ3tp
5. webRequestBlocking
这个就是 Google 铁了心要搞死各种内容阻挡器(以提升效能/安全性的名义),
目前仍是比较棘手的问题。
其实 MV3 也不是完全无法使用相关功能,但必须改登录档强制安装套件,
需要提醒使用者做相关设定,且需要相关系统权限。
详见:https://t.ly/QdS2I
6. sidebarAction vs sidePanel
这算是 MV3 极少数的福利。
Chromium >= 114 为 MV3 套件加入新的 sidePanel API,终于有原生支援的侧栏了。
但 Chromium 侧栏目前看起来仍不如 Firefox,
其一是只能放在右侧,不像 Firefox 可以切换显示在左或右侧;
而且四角设计成圆弧状,我觉得有点丑,且可能影响某些套件的操作。
再来是目前还有一些 bug,例如无法在某些使用者操作下开启。
详见:https://t.ly/8UsNj、https://t.ly/fhDOD
7. 手机浏览器支援
手机浏览器的扩充套件支援目前满乱的,
首先 iOS 的浏览器因为苹果的独断政策,只支援 Safari 核心,
iOS 版的 Chromium / Firefox 都是无法安装套件。
Android 上的 Chromium / Edge 也是不支援套件,
以往主要是 Kiwi browser 这个分支有支援套件,但作者已退坑不更新了。
Microsoft Canary 据说有合并 Kiwi 相关程式码,
也有支援扩充套件,但要用很麻烦的方法开启开发人员模式安装。
Firefox for Android 整体来说对套件的支援算相对好一点,
不过目前仍有个值得吐槽的点是打死不支援 downloads API,
而且是执行时出错,无法借由侦测 browser.downloads 做 feature detection,
总之就是给开发者找麻烦……。
话虽如此,在 Android 上的 downloads 实做似乎一直有些技术上的难题,
即使是之前的 Kiwi browser 有支援,
其实也有一些功能上的问题及相容性问题要解决。
总之手机浏览器支援有很多坑要踩,请感恩仍致力于此的程序猿们……。
作者: tPA (-踢趴-)   2025-06-09 17:52:00
作者: kyrc (橘子)   2025-06-09 18:23:00
作者: kawasakiZII   2025-06-10 01:56:00
作者: kyrc (橘子)   2025-06-10 22:31:00
安卓的 edge 能安装扩充了,开启开发人员模式也只要点一下
作者: tennyleaz (tenny)   2025-06-14 09:53:00

Links booklink

Contact Us: admin [ a t ] ucptt.com