强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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

  1. 安全性提升:禁止远程代码,减少攻击面
  2. 性能优化:Service Worker 按需启动,节省内存
  3. 隐私保护:声明式网络请求限制了对用户数据的访问
  4. 长期支持: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 中没有 windowdocument 对象。所有 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 启用开发者模式

  1. 打开 Chrome,地址栏输入 chrome://extensions/
  2. 开启右上角的 “开发者模式” 开关
  3. 你将看到三个按钮:加载已解压的扩展程序打包扩展程序更新

1.7.3 推荐开发工具

工具 用途
VS Code 代码编辑,推荐安装 Chrome Extension 插件
Chrome DevTools 调试 Popup、Content Script、Service Worker
Chrome Extensions Reloader 快速重载扩展
webpack / Vite / esbuild 打包构建

1.8 扩展阅读