Chrome 扩展开发完全指南 / 第 1 章:Chrome 扩展概述
第 1 章:Chrome 扩展概述
理解 Chrome 扩展的架构原理、核心组件以及从 Manifest V2 到 V3 的演进,是掌握扩展开发的第一步。
1.1 什么是 Chrome 扩展
Chrome 扩展(Chrome Extension)是运行在 Chrome 浏览器中的小型软件程序,用于增强和定制浏览器的功能。与普通网页不同,扩展拥有更高的浏览器 API 访问权限,可以:
- 读取和修改网页内容
- 拦截和修改网络请求
- 管理浏览器标签页和窗口
- 访问书签、历史记录等浏览器数据
- 显示桌面通知
- 在浏览器工具栏添加按钮和 UI
扩展 vs 网页应用 vs 主题
| 特性 | Chrome 扩展 | 网页应用 | Chrome 主题 |
|---|---|---|---|
| 访问浏览器 API | ✅ 完整 | ❌ 有限 | ❌ 仅样式 |
| 修改网页 DOM | ✅ | ❌ | ❌ |
| 后台运行 | ✅ Service Worker | ❌ | ❌ |
| 安装方式 | Chrome Web Store | URL 访问 | Chrome Web Store |
| manifest.json | ✅ 必需 | ❌ | ✅ 必需 |
| 用户界面 | Popup / Options / Side Panel | 完整页面 | 仅主题色 |
1.2 Chrome 扩展架构
一个 Chrome 扩展由以下核心组件构成:
┌─────────────────────────────────────────────────────┐
│ Chrome 扩展 │
│ │
│ ┌──────────────┐ ┌───────────────────────────┐ │
│ │ Manifest │ │ Service Worker │ │
│ │ (manifest │ │ (后台脚本) │ │
│ │ .json) │ │ - 事件监听 │ │
│ └──────────────┘ │ - 消息路由 │ │
│ │ - 数据处理 │ │
│ ┌──────────────┐ └───────────────────────────┘ │
│ │ Content │ │
│ │ Scripts │ ┌───────────────────────────┐ │
│ │ (内容脚本) │ │ UI 层 │ │
│ │ - DOM 操作 │ │ - Popup (弹出页面) │ │
│ │ - 页面注入 │ │ - Options (选项页面) │ │
│ └──────────────┘ │ - Side Panel (侧边栏) │ │
│ └───────────────────────────┘ │
│ ┌──────────────┐ ┌───────────────────────────┐ │
│ │ Storage │ │ Permissions │ │
│ │ (数据存储) │ │ (权限声明) │ │
│ └──────────────┘ └───────────────────────────┘ │
└─────────────────────────────────────────────────────┘
各组件职责
| 组件 | 文件 | 职责 | 生命周期 |
|---|---|---|---|
| Manifest | manifest.json | 声明元数据、权限、组件映射 | 随扩展存在 |
| Service Worker | background.js | 事件驱动的后台逻辑 | 按需激活,空闲时终止 |
| Content Scripts | content.js | 注入网页,操作 DOM | 页面加载时注入 |
| Popup | popup.html | 工具栏图标点击弹出的 UI | 打开时创建,关闭时销毁 |
| Options | options.html | 扩展设置页面 | 打开时创建 |
| Side Panel | sidepanel.html | 浏览器侧边栏 UI | 与标签页关联 |
1.3 Manifest V2 到 V3 的变化
Manifest V3(MV3)是 Chrome 扩展平台的一次重大升级,于 2020 年提出,2024 年 6 月开始强制淘汰 MV2。
核心变更对比
| 特性 | Manifest V2 | Manifest V3 |
|---|---|---|
| 后台脚本类型 | Background Page / Event Page | Service Worker |
| 远程代码执行 | ✅ 允许(CSP 可配置) | 🚫 禁止 |
| 网络请求拦截 | webRequest API | declarativeNetRequest API |
| 权限模型 | 安装时全部授予 | 支持可选权限(Optional Permissions) |
| 内容安全策略 | 可自定义 | 限制更严格 |
| Promise 支持 | ❌ 仅回调 | ✅ 大量 API 支持 async/await |
| Action API | browserAction + pageAction | 统一为 action |
alert() / confirm() | ✅ 可用 | 🚫 Service Worker 中不可用 |
为什么要迁移到 MV3
- 安全性提升:禁止远程代码,减少攻击面
- 性能优化:Service Worker 按需启动,节省内存
- 隐私保护:声明式网络请求限制了对用户数据的访问
- 长期支持:Chrome Web Store 已不接受新的 MV2 扩展提交
1.4 Manifest V3 的关键特性
1.4.1 Service Worker 替代 Background Page
MV2 中的 Background Page 是一个持续运行的隐藏页面,而 MV3 的 Service Worker 是事件驱动的:
// MV3 Service Worker (background.js)
// Service Worker 会在事件触发时启动,空闲时终止
// 监听安装事件
chrome.runtime.onInstalled.addListener((details) => {
console.log('扩展已安装/更新', details.reason);
// 初始化上下文菜单
chrome.contextMenus.create({
id: 'searchSelection',
title: '搜索 "%s"',
contexts: ['selection']
});
});
// 监听来自 Content Script 的消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === 'getData') {
// 异步处理示例
fetchData(message.query).then(data => {
sendResponse({ success: true, data });
});
return true; // 保持消息通道开放以等待异步响应
}
});
// Service Worker 中不可使用
// ❌ window, document, alert, confirm, prompt
// ❌ XMLHttpRequest (需使用 fetch API)
// ❌ 直接操作 DOM
⚠️ 注意:Service Worker 中没有
window和document对象。所有 DOM 操作必须在 Content Script 或 UI 页面(Popup、Options、Side Panel)中完成。
1.4.2 声明式网络请求
// MV2: 使用 webRequest API 拦截和修改请求
chrome.webRequest.onBeforeRequest.addListener(
(details) => { return { cancel: true }; },
{ urls: ["*://*.ads.example.com/*"] },
["blocking"]
);
// MV3: 使用 declarativeNetRequest API 声明规则
// 在 manifest.json 中声明静态规则,或通过 API 动态添加
{
"declarative_net_request": {
"rule_resources": [{
"id": "ruleset_1",
"enabled": true,
"path": "rules.json"
}]
}
}
rules.json 规则文件示例:
[
{
"id": 1,
"priority": 1,
"action": { "type": "block" },
"condition": {
"urlFilter": "||ads.example.com",
"resourceTypes": ["script", "image", "xmlhttprequest"]
}
},
{
"id": 2,
"priority": 1,
"action": {
"type": "redirect",
"redirect": { "url": "https://example.com/replacement.js" }
},
"condition": {
"urlFilter": "||tracker.example.com/tracker.js",
"resourceTypes": ["script"]
}
}
]
1.4.3 统一的 Action API
// MV2: browserAction 和 pageAction 分开使用
chrome.browserAction.setIcon({ path: 'icon-active.png' });
chrome.browserAction.setBadgeText({ text: '5' });
// MV3: 统一为 action API
chrome.action.setIcon({ path: 'icon-active.png' });
chrome.action.setBadgeText({ text: '5' });
chrome.action.setBadgeBackgroundColor({ color: '#FF0000' });
1.5 扩展的运行上下文
Chrome 扩展的代码运行在多个不同的上下文(Context)中,理解这些上下文对于正确编写代码至关重要:
| 上下文 | 可访问 API | 可访问 DOM | 可访问 Chrome API |
|---|---|---|---|
| Service Worker | Web Worker API | ❌ | ✅ 完整 |
| Content Script | 网页 JS API | ✅ 页面 DOM | ✅ 有限子集 |
| Popup | 完整 Web API | ✅ 自身 DOM | ✅ 完整 |
| Options Page | 完整 Web API | ✅ 自身 DOM | ✅ 完整 |
| Side Panel | 完整 Web API | ✅ 自身 DOM | ✅ 完整 |
| Sandboxed Page | 受限 Web API | ✅ 自身 DOM | ❌ 无 |
上下文隔离示意
┌──────────────────────┐ ┌──────────────────────┐
│ Extension Context │ │ Web Page Context │
│ (扩展上下文) │ │ (网页上下文) │
│ │ │ │
│ Service Worker │ │ 页面自身的 JavaScript │
│ Popup │ │ 页面全局变量 │
│ Options │ │ 页面 CSS │
│ Side Panel │ │ │
│ │ │ │
│ ✅ chrome.* API │ │ ❌ chrome.* API │
│ ❌ 页面全局变量 │ │ ✅ 页面全局变量 │
└──────────┬───────────┘ └──────────┬───────────┘
│ │
│ ┌──────────────┐ │
│ │Content Script│ │
└────┤ (内容脚本) ├───────┘
│ │
│ 独立的 JS 环境 │
│ 共享页面 DOM │
│ ✅ chrome.* │
│ ❌ 页面变量 │
└──────────────┘
1.6 典型业务场景
场景一:网页内容增强
用户浏览技术文档时,扩展自动在代码块旁添加"一键复制"按钮。
触发: 页面加载完成
组件: Content Script 注入 → 检测 <pre><code> → 添加按钮
交互: 点击按钮 → Content Script 调用 navigator.clipboard.writeText()
场景二:跨站点数据聚合
电商比价工具,在商品页面自动展示其他平台的价格。
触发: 导航到商品页面
组件: Content Script 检测 URL → 通知 Service Worker
处理: Service Worker 调用 API 查询价格 → 返回结果
展示: Content Script 在页面插入比价面板
场景三:浏览器工作流自动化
自动将网页剪藏保存到笔记应用。
触发: 用户右键 → 选择"保存到笔记"
组件: Context Menu → Service Worker → Side Panel
处理: Service Worker 提取页面信息 → 展示在 Side Panel
保存: 用户编辑后 → Service Worker 调用笔记 API
1.7 开发环境准备
1.7.1 安装 Chrome
确保使用 Chrome 116 或更高版本以获得完整 API 支持。
1.7.2 启用开发者模式
- 打开 Chrome,地址栏输入
chrome://extensions/ - 开启右上角的 “开发者模式” 开关
- 你将看到三个按钮:加载已解压的扩展程序、打包扩展程序、更新
1.7.3 推荐开发工具
| 工具 | 用途 |
|---|---|
| VS Code | 代码编辑,推荐安装 Chrome Extension 插件 |
| Chrome DevTools | 调试 Popup、Content Script、Service Worker |
| Chrome Extensions Reloader | 快速重载扩展 |
| webpack / Vite / esbuild | 打包构建 |