浏览器扩展到底是个啥
本教程共 45 篇 · 第 1 篇 · 更新于 2026-08-13 · 约 4 分钟阅读
本节目标:搞清楚浏览器扩展是什么、由哪些部分组成,弄明白 manifest、运行环境、MV2 与 MV3 这些基础概念,为后面学 WXT 打地基。
扩展是一组由浏览器装配起来的小程序
你每天用的广告拦截器、翻译助手、密码管理器,都属于浏览器扩展。普通网站只是一个页面,扩展则更像一组小程序:它们被浏览器装配在一起,协同完成一件事。
扩展能做的事很多:修改网页内容和行为、改变浏览器界面、与外部服务交互。比如在搜索结果旁显示评级、给网页加夜间模式、一键收集页面信息。
有一个关键点要先记住:这些小程序属于同一个扩展,却不共享同一个 window,也不能直接读取彼此的变量。跨环境协作要靠浏览器存储(storage)或消息 API(消息通信)。这个概念贯穿全书,如 §17 所述。
manifest.json:扩展的安装清单
浏览器凭什么知道一个扩展叫什么、有哪些文件、要什么权限?靠 manifest.json。它告诉浏览器:
- 扩展的名称、描述、版本和图标;
- popup(弹窗)、background(后台)、options(选项页)等入口文件在哪;
- 需要哪些权限、可以访问哪些网站。
Chrome 和 Firefox 的 manifest 字段略有差异。注意:用 WXT 开发时你几乎不手写 manifest,框架会结合配置和入口自动生成。想确认最终结果,要看开发或构建产物里的 manifest.json(如 §05 所述),而不是只看配置源码。
四种代码运行环境
| 环境 | 能看到什么 | 典型用途 |
|---|---|---|
| 扩展页面 | 自己的 DOM、扩展 API | 弹窗、选项页、侧边栏、新标签页 |
| background(后台) | 扩展 API,无可见页面 | 事件监听、消息中转 |
| content script(内容脚本) | 目标网页 DOM、部分扩展 API | 读取页面、往页面注入按钮 |
| 页面主世界 | 网页自己的 JS 全局对象 | 与页面脚本深度集成 |
内容脚本默认运行在隔离世界(isolated world):它能操作页面 DOM,但自己的 JS 变量不会和网页脚本混在一起。这是安全边界,不是 bug。
MV2 与 MV3:两代扩展平台
Manifest V2 是上一代,用常驻后台页面;Manifest V3 是当前主流,background 改成 service worker(服务工作线程)。最大的变化有两个:
- service worker 可能随时休眠和重启,不是常驻进程;
- 因此不能把必须长期存在的数据只放在后台的内存变量里,要写进存储(storage),如 §18 所述;
- V3 对安全性要求更严,比如更严格的内容安全策略(CSP)。
WXT 一个项目可以同时产出 MV3 和 MV2 的构建,多数打包差异由框架处理,但浏览器 API 的支持度仍要分别验证(如 §35 所述)。
权限:扩展能力的门禁
权限分两类声明:
permissions:扩展 API 权限,如storage、tabs;host_permissions:允许扩展访问哪些网站来源。
权限会影响安装提示、商店审核和用户信任。开发时遵守最小权限原则:只申请功能必需的权限,matches 和 host_permissions 用最小范围(如 §21 所述)。
术语速查
| 术语 | 含义 |
|---|---|
| 扩展 / add-on | 浏览器扩展,中文俗称“插件” |
| manifest | 浏览器读取的扩展安装清单 |
| 入口点(entrypoint) | WXT 识别并单独打包的入口 |
| service worker | MV3 的事件驱动后台环境 |
| 内容脚本(content script) | 注入匹配网页的扩展脚本 |
| 隔离世界 | 内容脚本默认的隔离 JS 环境 |
| HMR | 开发中修改代码后的热更新 |
小结
本节建立了扩展的整体模型:一个由 manifest 声明、多环境协作的程序集合。下一节我们看 WXT 这个框架凭什么能简化这一切。