TL;DR:你应该选哪个?
如果以下情况,选 Extension.js……
- 你希望
manifest.json作为唯一事实来源,而不是由配置生成。 - 你喜欢贴近原生 WebExtension 模型(真实文件、透明输出)。
- 你希望用一条命令开发远程示例:
extension dev <github-url>。 - 你想要 Rspack 的 Rust 级构建速度和一等公民的 AI/MCP 工具。
如果以下情况,选 WXT……
- 你更喜欢 文件系统约定(
entrypoints/)而不是显式的 manifest。 - 你需要把 Manifest V2 作为主要目标。
- 你希望默认在任何地方都使用自动 polyfill 的
browser.*命名空间。
一览
| 维度 | Extension.js | WXT |
|---|---|---|
| 打包器 | Rspack(基于 Rust) | Vite(Rolldown 迁移进行中) |
| Manifest | 单一 manifest.json,编译时按浏览器前缀过滤键 | wxt.config.ts 在每次构建时生成 manifest.json |
| 入口点 | 由 manifest.json 引用的文件 | 位于 entrypoints/ 下的文件系统约定 |
| 浏览器目标 | Chrome、Edge、Firefox、Chromium、Gecko、自定义可执行文件 | Chrome、Edge、Firefox、Safari(社区)、自定义可执行文件 |
| Manifest V3 | 默认 | 默认 |
| Manifest V2 | 不作为主要目标支持 | 通过 manifestVersion: 2 支持 |
| 重载模型 | popup/options/devtools 使用 HMR,content script 和 SW 使用精准重载 | popup/options/devtools 使用 HMR,content script 使用精准重载 |
browser.* polyfill | --polyfill 选项 | 自动 polyfill 的 browser 命名空间 |
| 模板 | React、Preact、Vue、Svelte、TypeScript、JavaScript、init | React、Vue、Svelte、Solid、Preact、原生 |
| TypeScript | 一等公民 | 一等公民 |
| AI 接入 | 托管 MCP 服务器 + llms.txt(详情) | 提供 llms.txt |
心智模型
Extension.js 贴近平台。 你编写manifest.json 并引用真实文件。CLI 负责编译、按浏览器过滤并打包发布。如果你已经理解一个浏览器扩展是怎样组织的,框架不会挡你的路。
WXT 抽象了平台。 入口点从目录结构推断而来(entrypoints/popup/、entrypoints/content.ts),manifest 则由你的配置和源代码生成。如果你偏好约定优于配置,WXT 在每个你写的文件上为你做得更多。
两种方式没有绝对的好坏。选择取决于你想 看见 自己的 manifest,还是 声明 自己的 manifest。
CLI 体验
Extension.js
WXT
build --zip。
跨浏览器策略
两个框架都从一份代码出发输出多浏览器产物,但机制不同:- Extension.js 在单一的
manifest.json内使用 按浏览器前缀的 manifest 字段(chrome:、firefox:、gecko:等)。未加前缀的键到处都生效;加前缀的键只会落到匹配的构建中。 - WXT 从
wxt.config.ts和按目标的覆盖项计算出 manifest。浏览器差异存在于 TypeScript 配置里,而不是 manifest 本身。
manifest.json 的设计师或 PM,前缀化的键能保留那个文件作为唯一事实来源。如果你的团队希望扩展配置与其他 TypeScript 配置放在一起,WXT 的方式读起来会更自然。
迁移路径
如果你已经在用 WXT 并想评估 Extension.js,典型迁移涉及三件事:- 把
entrypoints/中的内容移回手写的manifest.json所引用的扁平文件。 - 用
extension.config.js替换wxt.config.ts作为构建默认值。 - 把
wxt/wxt build脚本替换为extension dev/extension build。
何时选择 Extension.js
- 你想要 manifest 作为唯一事实来源,而不是被生成出来。
- 你想用一个 CLI 参数就开发远程示例(
extension dev <github-url>)。 - 你想要面向文档的一等托管 MCP AI 工具。
- 你想要在大型扩展上获得 Rspack 的 Rust 级编译速度。
何时选择 WXT
- 你更喜欢文件系统约定,而不是显式的 manifest。
- 你需要把 Manifest V2 作为主要目标。
- 你希望默认在任何地方都使用自动 polyfill 的
browser.*。

