本文结合基于 React + Vite + Manifest V3 构建的 Chrome 扩展示例,总结插件开发中的注意点,并对比插件开发与普通 Web 开发的差异,方便从前端转型或入门扩展开发的同学少踩坑。
一、插件开发 vs Web 开发:核心差异
| 维度 | 普通 Web 开发 | Chrome 扩展开发 |
|---|---|---|
| 运行环境 | 单一页面或 SPA,同源策略限制 | 多个隔离环境:Popup、Background(如 Service Worker)、Content Script、可选 Offscreen |
| 脚本加载方式 | 可自由使用 <script type="module"> | Popup 可用 ESM;Content Script 按普通脚本注入,不能直接写顶层 import |
| 存储 | 常用 localStorage、Cookie、后端 DB | 推荐 chrome.storage.sync / chrome.storage.local,跨页面且可同步(sync) |
| 网络与权限 | 受 CORS 限制,需后端或代理 | 在 manifest 中声明 host_permissions 后可直连指定域名,无 CORS 问题 |
| 与页面交互 | 直接操作当前页 DOM/JS | Content Script 与页面共享 DOM,与 Popup/Background 通过 消息 通信,不能直接共享变量 |
| 构建与部署 | 通常单入口打包,部署到服务器 | 多入口:Popup 页面 + Content Script(+ Background);加载的是本地目录(如 dist),不是 URL |
| 安全与审核 | 主要防 XSS、CSRF、敏感信息泄露 | 还需注意权限最小化、Manifest V3 规则、商店审核策略 |
这些差异会直接影响到你的技术选型、构建配置和调试方式,下面按「开发时需要注意的情况」展开。
二、开发插件时需要注意的情况(结合示例项目)
1. Manifest:权限与入口要写对
扩展的「合同」是 manifest.json(示例项目在 public/manifest.json,构建时拷贝到 dist)。
- permissions:只申请必要权限,例如本插件用到了
activeTab、scripting、downloads、storage。 - host_permissions:调用外部 API 时必须声明域名,例如 ModelScope:
"https://api-inference.modelscope.cn/*",否则请求会被拦截。 - content_scripts.js:写的是构建后的文件名(如
content.js),且该文件必须是单文件、无顶层 ESM(见下一条)。
权限过多会触发商店或用户的不信任;少了则功能无法使用,建议每加一个能力就对照 补全。


