Hello 大家好,今天给大家带来一期关于 Chrome 的基础文章,内容不多,主要是关于一名前端开发的 2025 的 Chrome 的基础提效指南,文章可能有些老生常谈,大家见谅。
一、常用 Chrome 扩展攻略
在此章节中,我们会先介绍一下笔者本人在日常工作中经常用到的一些 Chrome 扩展。
1、Fehelper|开发者工具集
chromewebstore.google.com/detail/fehe...
Fehelper 是一个能够帮助我们提高开发效率的一个开发者工具集,具有图片转Base64、二维码相关、时间戳转换等其他功能,同时还支持开发者自行开发插件,具体内容大家可以自行查看。

2、ModHeader|请求头/响应头修改工具
chromewebstore.google.com/detail/modh...
ModeHeader 是一个强大的可以修改我们请求、响应的 header 中数据的插件,我们可以在里面配置我们想要添加、修改的 header 属性,之后就可以修改我们网络中的 header,这在一些通过 header 区分环境、用户的场景中十分有用。
它同时支持导入导出、分配置文件修改等功能。

3、Console Importer|通过控制台快速引入第三方库
chromewebstore.google.com/detail/cons...
以 Dayjs 举例,假设有这么一种场景:我是一个没有使用过 Dayjs 的开发者。我现在想根据它的文档来进行它的 API 的调试,但是我并不想通过
1.打开我的编辑器 -> 2.新建一个 Node 项目 -> 3.写一个 js 文件去运行
这种方式去运行,这时,Console Importer 这个插件就派上用场了。
这是一个可以让我们直接在 Chrome 控制台中导入第三方库的插件,以上面的场景举例,我们只需要在控制台中输入$i('dayjs')
,然后再输入 dayjs 的方法即可。
我终于可以在这个场景中扔掉那些繁重的 IDE 了。

4、沉浸式翻译 | 智能翻译助手
chromewebstore.google.com/detail/%E6%...
网页中的翻译是一个比老生常谈还要老生常谈的场景了。
此处推荐 2,000,000 用户,4.6 评分的经典翻译插件:沉浸式翻译。
它支持:
- 多种 AI 翻译:提供 DeepL、DeepSeek、Gemini、OpenAi、智谱、Claude 等多种 API 支持
- 多种来源翻译:可以翻译图片、翻译输入框、翻译 PDF、还可以翻译 Youtube、Netflix、Prime Video 等视频网站的字幕
- 多种翻译样式:可以选择下划线、高亮、模糊状态
- 术语库:原装自带 AI 术语库,例如医疗、宠物、音乐、电商、编程等等,同时也可以支持自定义术语库,我们可以从文件里导入术语库,也可以将现有的术语库导出为文件
- 配置云同步:可以自动同步到 Google Drive
综上所述,我认为沉浸式翻译已经是截止到 2025 年,Chrome 中做的最好的翻译插件了,没有之一。

它还有更多的小功能,可以安装之后自行探索。
5、Cookie-Editor|Cookie 管理工具
chromewebstore.google.com/detail/cook...
作为一名前端开发工程师,Cookie 的管理也是一个永远无法回避的场景。
利用 Cookie-Editor,我们可以轻松的创建、编辑和删除 Cookie。

Cookie-Editor 同时支持暗黑模式。
6、Ajax Interceptor Tools | Ajax 请求拦截工具
chromewebstore.google.com/detail/ajax...
这是一个可以让你在 Chrome 中轻松修改接口响应的插件。我们不需要再在代码 / Mock 平台中修改我们的数据了。我们只需要在这个扩展中把我们想要 mock 的接口和想要的返回数据编写好,设置在里面即可。

7、Maple Bookmarks|书签管理工具
chromewebstore.google.com/detail/mapl...
这是一个可以轻松管理我们的繁杂的书签的 Chrome 扩展,我们不需要再在书签栏中点开一个个文件夹,然后再繁多的书签中寻找我们的想要的那个了。我们只需要按下 Command + E,一个完全平铺的书签栏就会直接出现。

它同时也支持快捷键 Ctrl + S 进行书签的搜索。
8、Automa | RPA 自动化流程工具
chromewebstore.google.com/detail/auto...
这是一个非常非常非常强大的 RPA 工具。
我们可以像搭积木一样,将工作流中的各个步骤进行拼合,包括但不限于点击、滚动、上传、输入、下载、网络请求、循环、判断、截屏、通知等功能,它甚至可以连接到它的 Database 和 GoogleSheet、GoogleDrive 来增强它的能力。

它的能力实在太过强大,以至于我不想再多言。感兴趣可以直接下载之后看一看。
9、Midscene.js | 自然语言自动化测试工具
chromewebstore.google.com/detail/mids...
随着 AI 的越来越来越强大,如何通过 AI 赋能我们的开发、测试流程已经成为了一个比较成熟的领域。
按照以往的自动化测试,我们可能需要通过截图、XPath 来定位元素的目标,然后再通过浏览器的能力进行操作。
实在是太麻烦太复杂了。
字节 WebInfra 团队前段时间推出了 Midscene.js 这一工具,我们可以直接使用 自然语言 来让 AI 进行解析,并自动规划它对浏览器的操作。
例如,我输入(点击页面中的第一个商品,然后将其添加到购物车),MidScene 可以将页面的 Dom 结构、截图和我的 prompt 一同发送给大模型,然后通过大模型返回的数据来进行下一步操作。
同时,它也可以为你输出十分详细的测试报告,也支持通过 ts、yaml 的格式来进行开发。
typescript
await aiWaitFor('跳转支付选择页面或输入支付密码弹窗弹起');
if (client === 'weapp') {
await aiTap('免密支付');
} else {
if (!(await aiBoolean('是否有输入支付密码弹窗'))) {
await aiTap('储值卡');
await aiTap('确认支付');
await sleep(1000);
}
for (let i = 1; i <= 6; i++) {
await aiTap(`${i}`);
await sleep(1000);
}
}

它同时支持 aiAssert、aiQuery 等工具,可以参考 midscenejs.com/zh/index.ht... 文档进行查看。
可以点击视频链接进行示例查看。 github.com/Shenyouxian...
二、我要如何编写一个 Chrome 插件?
上一章介绍了前端常用的 Chrome 扩展,这一章我们将尝试动手开发一个。
一个 Chrome 扩展通常包含以下几个文件
json
manifest.json - 配置文件
icon.png - 图标
popup.html - 弹出页面
popup.js - 弹出脚本
background.js - 后台脚本
options.html - 选项页面
options.js - 选项脚本
content.js - 内容脚本
下面,我们以一个简单的 Todo-List 的 Chrome 扩展为例,来介绍 Chrome 扩展的结构。
manifest.json - 配置文件
我们可以把 manifest.json 看作是 Chrome 扩展的 package.json,它定义了扩展的名称、版本、描述、权限、后台脚本、内容脚本、弹出页面等配置信息
json
{
"manifest_version": 3,
"name": "基础 Chrome 扩展",
"description": "一个简单的 Chrome 扩展示例",
"version": "1.0",
"action": {
"default_popup": "popup.html",
"default_icon": "icon.png"
},
"permissions": ["storage", "alarms", "tabs", "contextMenus", "notifications"],
"background": {
"service_worker": "background.js"
},
"content_scripts": [ // 配置要注入到网页中的脚本
{
"matches": ["\<\all_urls\>\"], // 匹配规则,"\<\all_urls\>\" 表示所有网页
"js": ["content.js"], // 要注入的 JavaScript 文件
"run_at": "document_end" // "document_start": 在 DOM 创建之前 / "document_end": 在 DOM 加载完成后,但在图片等资源加载前 / "document_idle": 在页面加载完成后(默认值)
}
],
"icons": {
"128": "icon.png"
},
"options_page": "options.html"
}
popup
popup 是 Chrome 扩展的弹出页面,它定义了扩展的弹出页面样式和内容
html
// popup.html
<div class="container">
<h2>Todo List</h2>
<div class="input-group">
<input type="text" id="todoInput" placeholder="输入待办事项...">
<button id="addTodo">添加</button>
</div>
<div id="todoList" class="todo-list">
<!-- Todo items will be added here -->
</div>
</div>
javascript
// popup.js
document.addEventListener('DOMContentLoaded', function () {
const todoInput = document.getElementById('todoInput');
const addTodoBtn = document.getElementById('addTodo');
const todoList = document.getElementById('todoList');
// 加载保存的待办事项
loadTodos();
// 添加待办事项
addTodoBtn.addEventListener('click', addTodo);
todoInput.addEventListener('keypress', function (e) {
if (e.key === 'Enter') {
addTodo();
}
});
});
OK!我们现在已经实现了扩展的基础功能。

但是我现在想实现:
假如用户有未完成的提醒事项,每隔 5 秒提醒用户一次
这时,我们就用到了 background.js 文件。
background
background.js 是 Chrome 扩展的后台脚本,会在扩展安装或启动时就运行。即使扩展页面关闭,background.js 也会继续运行。
javascript
// 创建定时器
chrome.alarms.create('checkTodos', {
periodInMinutes: 1 / 6, // 10秒 = 1/6分钟
});
// 监听定时器
chrome.alarms.onAlarm.addListener((alarm) => {
if (alarm.name === 'checkTodos') {
// 如果提醒标签页已经打开,则不再创建新的标签页
if (reminderTabId !== null) {
return;
}
// 获取待办事项和文字颜色设置
chrome.storage.sync.get(['todos', 'textColor'], function (result) {
const todos = result.todos || [];
const textColor = result.textColor || '#000000';
const uncompletedTodos = todos.filter((todo) => !todo.completed);
if (uncompletedTodos.length > 0) {
// 创建提醒页面
const reminderHTML = `
...some HTML codes
`;
// 使用 data URL,添加 charset=UTF-8
const dataUrl =
'data:text/html;charset=UTF-8,' + encodeURIComponent(reminderHTML);
// 打开新标签页
chrome.tabs.create({ url: dataUrl }, (tab) => {
reminderTabId = tab.id;
});
}
});
}
});
Tips: chrome.storage 有三种形式
• chrome.storage.sync:数据会同步到用户的 Google 账户中(如果登录了 Chrome),可在不同设备共享。
• chrome.storage.local:不会同步,仅保存在本地,但速度更快且容量更大。
• chrome.storage.session(Manifest V3 才有):生命周期跟随 Service Worker,只存在于内存中,不会写入磁盘。浏览器关闭、Service Worker 被终止后,数据就会丢失。
好的,我们现在已经实现了扩展的弹窗,并且用 background.js 实现了定时器。
但用户又有一个需求:
我想改变提示的 tab 页中的文字颜色。
这时候我们就需要用到 options 页面。
options
在 options 中,我们可以定义扩展的设置页面,用户可以在设置页面中修改扩展的配置。
我们可以在 options 中定义扩展的设置页面,用户可以在设置页面中修改扩展的配置
html
// options.html
<div class="option-group">
<label for="textColor">提醒文字颜色:</label>
<input type="color" id="textColor" value="#000000">
<div class="color-preview" id="colorPreview"></div>
<button id="save" class="save-button">保存设置</button>
</div>
javascript
// options.js
// 当页面加载时,获取保存的设置
document.addEventListener('DOMContentLoaded', () => {
// 获取元素
const textColorInput = document.getElementById('textColor');
const colorPreview = document.getElementById('colorPreview');
const saveButton = document.getElementById('save');
// 从存储中加载设置
chrome.storage.sync.get(['textColor'], (result) => {
const savedColor = result.textColor || '#000000';
textColorInput.value = savedColor;
colorPreview.style.backgroundColor = savedColor;
});
// 当颜色选择改变时更新预览
textColorInput.addEventListener('input', (e) => {
colorPreview.style.backgroundColor = e.target.value;
});
// 保存设置
saveButton.addEventListener('click', () => {
const newColor = textColorInput.value;
chrome.storage.sync.set(
{
textColor: newColor,
},
() => {
// 显示保存成功的提示
const status = document.createElement('div');
status.textContent = '设置已保存';
status.style.color = '#4CAF50';
status.style.marginTop = '10px';
saveButton.parentNode.appendChild(status);
// 3秒后移除提示
setTimeout(() => {
status.remove();
}, 3000);
}
);
});
});

我们现在已经实现了弹窗、定时器,以及设置页面。
很巧,我现在又想实现一个功能:
当用户在页面选中文字并且点击右键时,能够直接将选中的文字添加到提醒事项中
content
content.js 是 Chrome 扩展用来与页面交互的脚本,它会在页面加载时运行
javascript
// background.js
// 用于跟踪提醒标签页的状态
let reminderTabId = null;
let selectedText = '';
// 创建上下文菜单
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: 'addToTodo',
title: '添加到待办事项',
contexts: ['selection'],
});
});
// 监听上下文菜单点击
chrome.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === 'addToTodo') {
// 获取当前的待办事项列表
chrome.storage.sync.get(['todos'], function (result) {
const todos = result.todos || [];
// 添加新的待办事项
const newTodo = {
id: Date.now(),
text: info.selectionText,
completed: false,
createdAt: new Date().toISOString(),
source: {
url: tab.url,
title: tab.title,
},
};
todos.push(newTodo);
// 保存更新后的列表
chrome.storage.sync.set({ todos }, () => {
// 检查标签页是否存在并发送消息
chrome.tabs.query(
{ active: true, currentWindow: true },
function (tabs) {
if (tabs[0]) {
try {
chrome.tabs.sendMessage(
tabs[0].id,
{
type: 'showNotification',
message: '已添加到待办事项',
},
(response) => {
if (chrome.runtime.lastError) {
console.log('发送消息失败:', chrome.runtime.lastError);
// 如果消息发送失败,使用 chrome.notifications API 显示通知
chrome.notifications.create({
type: 'basic',
iconUrl: 'icon.png',
title: '待办事项',
message: '已添加到待办事项列表',
});
}
}
);
} catch (error) {
console.log('发送消息出错:', error);
}
}
}
);
});
});
}
});
// 监听来自 content.js 的消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === 'textSelected') {
selectedText = message.text;
}
});
javascript
// content.js
// 监听文本选择事件
document.addEventListener('selectionchange', () => {
const selectedText = window.getSelection().toString().trim();
// 将选中的文本发送给 background.js
if (selectedText) {
chrome.runtime.sendMessage({
type: 'textSelected',
text: selectedText,
});
}
});
// 监听来自 background.js 的消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === 'showNotification') {
try {
// 创建通知元素
const notification = document.createElement('div');
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background-color: #4CAF50;
color: white;
padding: 16px;
border-radius: 4px;
z-index: 999999;
animation: slideIn 0.3s ease-out;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
`;
// 添加动画样式
const style = document.createElement('style');
style.textContent = `
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
`;
document.head.appendChild(style);
notification.textContent = message.message;
document.body.appendChild(notification);
// 3秒后移除通知
setTimeout(() => {
notification.style.animation = 'slideIn 0.3s ease-out reverse';
setTimeout(() => {
notification.remove();
style.remove();
}, 300);
}, 3000);
// 发送响应表示成功
sendResponse({ success: true });
} catch (error) {
console.error('显示通知时出错:', error);
sendResponse({ success: false, error: error.message });
}
// 返回 true 表示会异步发送响应
return true;
}
});
我们现在已经实现了我们想要的全部功能,我们现在准备...
调试与发布
我们可以在 chrome://extensions 中直接加载已解压的扩展程序
但我们还有一些其他问题...
-
我要如何调试我的 Chrome 扩展?
- popup.js 中的输出可以直接在弹出层中点击检查
- content.js 中的输出可以直接在页面的控制台中切换上下文
- background.js 中的输出可以点击在 Chrome 的设置中扩展详情中的 Service Worker 之后弹出的 Devtool 中看到
- option.js 中的输出可以直接在 option 页面中点击检查
-
我要如何发布我的 Chrome 扩展?
- 设置
- 打包扩展程序.zip
- 登录 Chrome Web Store Developer Dashboard
- 上传 .zip 文件
- 审核
- 发布
WXT | Next-gen Web Extension Framework
就像是 Vue 和 React 之于 Web 开发一样,WXT 是 Chrome 的下一代 Web 扩展框架,它可以帮助开发者更快速、更高效地开发 Chrome 扩展
pnpm dlx wxt@latest init
WXT 支持 vue、react、svelte、solid 等多种前端框架
项目结构
WXT 的目录结构和大多数 node 项目无异
lua
| {rootDir}/
| ├── .output/
| ├── .wxt/
| ├── (src/)
| ├──|-├── assets/
| ├──|-├── components/
| ├──|-├── composables/
| ├──|-├── entrypoints/
| ├──|-├── hooks/
| ├──|-├── modules/
| ├──|-├── public/
| ├──|-├── utils/
| ├── .env
| ├── .env.publish
| ├── app.config.ts
| ├── package.json
| ├── tsconfig.json
| ├── web-ext.config.ts
| └── wxt.config.ts
我们可以在wxt.config.ts
中配置srcDir: 'src'
来使用src
目录管理项目
Some Tips
WXT 通常使用{rootDir}/src/entrypoints/(sidepanel | popup)/index.html来管理入口文件
WXT 使用{rootDir}/src/entrypoints/background.ts | content.ts | option.ts来管理 background、content、option 的逻辑
WXT 支持使用wxt/storage来管理存储,支持 i18n,支持使用第三方库来处理消息传递
WXT 通过运行 wxt zip 和 wxt publish 来打包和发布
以 Paperboy 这个项目为例,我们在 background.ts 中请求 feeds 信息之后使用 wxt.storage 来将 feeds 信息保存到 storage 中,然后在 WechatRssViewer.tsx 中监听 storage 的变化来更新页面

可以访问官方网站来查看更多:wxt.dev/
三、总结
OK,今天这篇文章我们从日常开发中那些提升效率的 Chrome 插件讲起,一路聊到了怎么手把手写一个自己的扩展,甚至还顺带介绍了一下新一代的开发框架 WXT。
如果你以前只是用插件、没想过自己动手写一个,希望这篇文章能帮你把 Chrome 扩展这件事变得不那么遥远。如果你已经写过一些扩展,那 WXT 也许是你可以尝试的下一步。
下期再见👋。