其实这个小工具是我很早以前开发的,最近因为有需求,又翻出来修了修,觉得蛮有用的,分享给大家。Automate GPT 是一个浏览器扩展,可以方便我们更好的使用 ChatGPT。
OpenAI 最近几次发布的新功能还是很强力的,比如近期大热的各种风格化绘图,什么吉卜力啊、卡通3D啊、玩具啊,等等。相信大家都在各种平台上看过,我也试做了一些:




其实这个小工具是我很早以前开发的,最近因为有需求,又翻出来修了修,觉得蛮有用的,分享给大家。Automate GPT 是一个浏览器扩展,可以方便我们更好的使用 ChatGPT。
OpenAI 最近几次发布的新功能还是很强力的,比如近期大热的各种风格化绘图,什么吉卜力啊、卡通3D啊、玩具啊,等等。相信大家都在各种平台上看过,我也试做了一些:




早在开坑 使用 CRXJS Vite 插件开发 ChatGPT SidePanel 插件(一) 系列时我就想做这个视频了。时隔数日,这个插件修复了不少问题,热重载更好用了,也适配了 Vite5,更加值得推荐。
CRXJS Vite plugin 可以大大改进我们开发浏览器扩展时的体验。本视频就简单介绍一下这个插件,带大家初步体会它的能力。另外浏览器扩展近期还开放了 Side Panel 的能力,非常适合做与页面相关的功能。本视频里也一并推荐。
希望大家喜欢,请留下您的意见想法与一键三连,我们过两天再见。
视频大纲:
有任何问题、意见、建议,欢迎留言弹幕私信与我交流。目前我正在筹划新的系列教程,关于方向的选择,想听听大家的意见,请大家移步 B 站帮我投票选择:https://t.bilibili.com/877511288038621239,谢谢。
无论选择哪个方向,我都会遵循 #build-in-public 的方式,欢迎关注我的博客。

上一篇博客 聊了聊 Manifest V3 的设计思路,接下来就该详细介绍下这个版本的变化。按照 官方介绍,V3 的变化主要有以下五点:
chrome.declarativeNetRequest。这个变化我暂时没用到,将来有机会再说。其中 2 暂时不好评价,3 只能被动接受,4、5没啥好说的,所以接下来谈谈 1,background script => service worker。
Background scripts/pages(后面简称 background script)的地位很重要,是浏览器扩展的重要组成部分,可以作为联系其它组件的中心、主控,在扩展功能复杂时,作用很大。比如我厂的 Showman,既需要用 content script 注入功能到目标网页,也需要单独打开页面让用户交互,这里每个 JS 都要跑在独立环境,彼此隔离,所以就需要有一个中控,一方面连接各个独立的组件,另一方面常驻内存存储一些全局数据。
相信大家不难想到,这种常驻内存的东西,虽然给开发带来了便利,但是也会给内存带来不小的压力。况且,在 Manifest V2 阶段,甚至还支持一个浏览器扩展注册多个 background scripts 和 background pages。每个页面和脚本都要独享一个环境,哪怕只有短短几行代码,于是就会吃掉大量的内存。
Chrome 对内存使用方面的不检点,被大家诟病已久。其开发团队当然也知道,所以最近几个版本 Chrome 都在试图改进这些问题。既然新版本要降低系统要求提高性能表现,尽量节省内存、同时减少运行时间就是必须考虑的事情。所以,新版本扩展规范规定,background script 有且只有一个,而且只能是 service worker。
Service worker 只能注册事件侦听器,不能持续运行。这样一来,就可以让 background script 的执行之间降到最低,并且随需而动,减少内存占用。
事件侦听器都要放在顶层,非顶层的事件侦听器会被直接忽略。
不要用全局变量,把一些需要用到的数据都放到 storage 里,如下:
// 不要这样做
const foo = 'bar'
chrome.runtime.onMessage.addListener(({ type, name }) => {
if (type === "set-name") {
name = foo;
}
});
// 这样做
chrome.runtime.onMessage.addListener(({ type, name }) => {
const foo = await chrome.storage.local.get(['name']);
if (type === "set-name") {
name = foo.name || 'bar';
}
});
chrome.alarms 取代定时器我们以前一般习惯于用 setTimeout 或 setInterval 定时执行,但它们在 service worker 里都会失效。此时,要用专门的 Alarms API 代替,使用方法倒也不难:
chrome.alarms.create({ delayInMinutes: 3 });
chrome.alarms.onAlarm.addListener(() => {
// do something
});
需要注意的是,content script 里虽然仍支持 setTimeout,但是太长的定时器会被直接忽略掉,时间阈值是 13s,即短于这个时间的仍然会触发,但是超过的会被忽略。建议如果 content script 需要定时器,那么也交给 background script 来做。
包括解析 HTML/XML、处理音视频播放、使用 <canvas> 绘图等,因为我暂时都没用到,所以就先不说了。

基于安全考虑,Chrome 扩展运行在一个独立的沙箱里,不能直接接触页面里的变量和实例。但有些时候我们必须在当前页面的环境里执行 JS,比如近期开发 Navlang 时遇到一个需求:修改浏览器环境里语言信息,实现语言切换。
(更多…)