关于 MV3 的知识,可以看这篇前文:
近期尝试把一个浏览器扩展升级到 MV3,然后发现了很多问题,写篇博客记录一下。
与文档不符
- 很多号称返回 Promise 实例的方法实际上不会返回结果,或者在没有 callback 的时候会报错
文档未说明
service worker 里无法使用(【v100 已修复】)。于是目前右键菜单都无法 i18n 了。chrome.i18n.getMessage
或者chrome.i18n.getUILanguage
chrome.contextMenus.create
无法向browser_action
添加菜单项(MV3 不再支持)
未实现 Promise 或者有 bug
(【v97 已修复】)chrome.storage.local.get(keys)
Promise 结果固定返回undefined
,不可用,需用回 callback- 【未测试】
chrome.permissions.request
未 Promise 化,无返回值 - 【未测试】必须传入 callback,不然报错
chrome.permissions.contains
chrome.contextMenus.remove
文档写了,但我没看见(>_<!)
- 在 service worker 里使用
chrome.contextMenus.create
时,必须传入id
,且不能使用onclick
函数。只能侦听chrome.contextMenus.onClicked.addListener
,然后做进一步判断。
MV2 存在的功能,但无法迁移至 MV3
(有些可能是暂时的)
因:不允许使用 remote JS
MV3 不支持使用外部 JS,所以 Google Analytics 和 Facebook 分享按钮之类的 SDK 都无法使用。也即是说,现在扩展不能使用 GA,也不能嵌入 Facebook Like,也不能使用其它需要引用外部 SDK 才能实现的功能。
因:Service worker 取代 background page/JS
无法获取系统 light/dark mode
Service worker 没有 window
对象,也就没有那些 window
对象上才有的方法,比如 matchMedia()
。所以我们就无法在 service worker 里检查系统的 dark mode,实现动态修改 icon 的功能。
无法将 SVG 解析成 ImageData
因为 createImageBitmap
无法解析 SVG blob,所以原则上,所有 SVG 的操作均无法执行。
外传信息比较麻烦
无法使用 alert()
和 prompt()
,也无法手动弹出 popup。所以如果我们想从 service worker 里向外传出内容,只有三个选择:
- 使用通知 notification API
- 直接打开页面
- 使用
chrome.scripting.executeScript()
在目标页执行脚本
(1)(3)需要不同的需要权限,(2)的体验不好。怎么用就自己选择吧。
欢迎吐槽,共同进步