标签: extension mv3

  • 【视频】2024 浏览器扩展开发必备:CRXJS Vite Plugin

    【视频】2024 浏览器扩展开发必备:CRXJS Vite Plugin

    早在开坑 使用 CRXJS Vite 插件开发 ChatGPT SidePanel 插件(一) 系列时我就想做这个视频了。时隔数日,这个插件修复了不少问题,热重载更好用了,也适配了 Vite5,更加值得推荐。

    CRXJS Vite plugin 可以大大改进我们开发浏览器扩展时的体验。本视频就简单介绍一下这个插件,带大家初步体会它的能力。另外浏览器扩展近期还开放了 Side Panel 的能力,非常适合做与页面相关的功能。本视频里也一并推荐。

    希望大家喜欢,请留下您的意见想法与一键三连,我们过两天再见。

    视频大纲:

    1. 介绍浏览器扩展
    2. 使用 Vite + CRXJS Vite Plugin 搭建项目框架
    3. 使用 Side Panel 创建扩展
    4. 总结

    有任何问题、意见、建议,欢迎留言弹幕私信与我交流。目前我正在筹划新的系列教程,关于方向的选择,想听听大家的意见,请大家移步 B 站帮我投票选择:https://t.bilibili.com/877511288038621239,谢谢。

    无论选择哪个方向,我都会遵循 #build-in-public 的方式,欢迎关注我的博客。

  • Chrome Extension Manifest V3 升级笔记

    Chrome Extension Manifest V3 升级笔记

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

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

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

    与文档不符

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

    文档未说明

    • service worker 里无法使用 chrome.i18n.getMessage 或者 chrome.i18n.getUILanguage(【v100 已修复】)。于是目前右键菜单都无法 i18n 了。
    • chrome.contextMenus.create 无法向 browser_action 添加菜单项(MV3 不再支持)

    未实现 Promise 或者有 bug

    • chrome.storage.local.get(keys) Promise 结果固定返回 undefined,不可用,需用回 callback (【v97 已修复】)
    • 【未测试】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 里向外传出内容,只有三个选择:

    1. 使用通知 notification API
    2. 直接打开页面
    3. 使用 chrome.scripting.executeScript() 在目标页执行脚本

    (1)(3)需要不同的需要权限,(2)的体验不好。怎么用就自己选择吧。