分类
chrome

Chrome Extension Manifest V3 升级笔记

关于 MV3 的知识,可以看这篇前文:

《Chrome 扩展大升级 Manifest V3:变化》

近期尝试把一个浏览器扩展升级到 MV3,然后发现了很多问题,写篇博客记录一下。

与文档不符

  • 很多号称返回 Promise 实例的方法实际上不会返回结果,或者在没有 callback 的时候会报错

文档未说明

  • service worker 里无法使用 chrome.i18n.getMessage 或者 chrome.i18n.getUILanguage。于是目前右键菜单都无法 i18n 了。
  • chrome.contextMenus.create 无法向 browser_action 添加菜单项

未实现 Promise 或者有 bug

  • 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 的功能。

无法使用 Image 解析图像

Service worker 也没有 Image 对象,只能使用 createImageBitmap 获取 ImageBitmap,无法转换成 ImageData,也就无法使用一些依赖 ImageData 的仓库,比如没法解析二维码。(可以通过手动解析二进制的方式绕过)

因为 createImageBitmap 无法解析 SVG blob,所以原则上,所有 SVG 的操作均无法执行。

只能通过 chrome.tabs.create() 的方式传出内容

自然,alert()prompt() 都无法使用,也无法手动弹出 popup。所以如果我们想从 service worker 里向外传出内容,只有两个选择:

  1. 使用通知 notification API
  2. 直接打开页面

而 notification API 需要权限,所以可能只好选后者。