几个框架
| 维度 | Extension.js | WXT | CRXJS | Plasmo |
|---|---|---|---|---|
| 模型 | manifest.json 作为唯一事实来源 | 文件约定 + 配置 | 读取 manifest 的 Vite 插件 | 文件约定 |
| 打包器 | Rspack(内部封装,零配置) | Vite | Vite(插件层) | Parcel |
| 跨浏览器 | 一份源码输出 Chrome、Edge、Firefox | Chrome、Firefox,支持 MV2 | 以 Chromium 为主 | 面向 Chrome、Firefox |
| 配置 | 无需配置 | wxt.config.ts | vite.config.ts + 插件 | package.json 的 manifest 字段 |
| 与打包器的耦合 | 框架内部细节 | 跟随 Vite 主版本 | 打包器变化时会出问题 | 与 Parcel 绑定 |
- manifest 在哪里。 Extension.js 读取你的
manifest.json,并编译它声明的所有内容。WXT 与 Plasmo 通过文件约定和配置来生成 manifest。CRXJS 也读取 manifest,但通过 Vite 的插件 API 解析,这就是为什么打包器升级可能让它失效(参见 Vite 8 fileName 错误)。 - 谁拥有打包器。 一个封装了通用打包器的框架,会继承那个打包器的破坏性变更。Extension.js 把打包器当作内部细节:你永远不需要配置它,升级是框架的事,而不是你的事。
详细对比与迁移
- Extension.js vs WXT:最接近的对比,逐项展开。
- 从 CRXJS 迁移:分步指南,典型项目大约十分钟。
- 修复:Content script fileName is undefined:CRXJS + Vite 8 的构建错误,附变通方案。
- 从 Plasmo 迁移:约定到 manifest 的映射、环境变量与 CSUI。
不必承诺,先试一试
用一条命令运行任意扩展模板,或运行 GitHub 上任意扩展仓库:chrome.* 调用与样式都可以直接沿用;迁移指南会覆盖需要调整的接线部分。
