跳转到主要内容
Brave
Chrome
Extension.js
Edge
Safari
Opera
Firefox
Chromium
Waterfox

跨浏览器扩展框架

用一套现代化的工作流,为所有主流浏览器构建扩展。Extension.js 帮你处理 manifest 编译、浏览器专属产物以及打包。

GitHub starsnpm weekly downloadslatest version on npmMIT license
npx extension@latest create my-extension

一份 manifest.json。
所有浏览器通吃。

带浏览器前缀的键(chrome:firefox: edge:)会在编译期被过滤。没有前缀的键则全平台生效。

“manifest_version”:3,“name”:“My Extension”,“version”:“1.0.0”,“action”: “default_popup”:“popup.html”,“chrome:background”: “service_worker”:“sw.ts”,“firefox:background”: “scripts”:[“sw.ts”]
Extension.js

为什么要用浏览器扩展框架?

浏览器扩展所需的文件、浏览器 API、manifest 格式、权限和构建产物, 都与普通 web 应用不同。一个浏览器扩展框架就是用来去掉这些胶水代码的:用一套工作流处理 Chrome、Edge 和 Firefox 的扩展开发;按目标过滤 manifest;为 service worker 和 content script 调整重载行为;并产出可直接提交到 Chrome Web Store、addons.mozilla.org 以及 Edge Add-ons 商店的打包结果。

Extension.js 提供的就是这样的工作流:一份 JavaScript 或 TypeScript 项目,一份manifest.json,分开输出到不同的dist/<browser>目录,再加上一个不挡路的 CLI——让你用同一份代码库轻松发布跨浏览器扩展。

观看完整的开发者工作流

从脚手架到运行中的扩展,一条现代化工具链贯穿全程。

贯穿 扩展全生命周期的核心特性

用一条现代化的扩展工作流,为每一种浏览器构建、测试与发布。

选你喜欢的框架。 保留同一条工作流。

从 React、Preact、Vue、Svelte、TypeScript 或 JavaScript 的生产就绪模板起步。

从别的框架过来?

大多数 React、Vue、Svelte 的源文件无需重写就能直接搬过来。真正的工作是替换打包器配置, 以及把生成的 manifest 改回真实的 manifest.json。

为开源核心提供支持

赞助者帮助项目更快发版、提供更好的开发者体验(DX),以及为扩展团队带来长期可靠性。

成为赞助者 ⏵

常见问题

浏览器扩展是为 Chrome、Firefox、Edge 或其他浏览器添加功能的软件。扩展会注入 UI、对浏览器事件作出响应,并调用页面自身无法访问的特权 API。完整入门请参见 什么是浏览器扩展?
是的。Extension.js 可以作为 Chrome 扩展框架,也可以作为 Firefox 和 Edge 扩展框架,使用同一个项目。通过 --browser=chrome--browser=firefox--browser=edge 选择目标。详见可用浏览器
运行 npx extension dev,CLI 会监听项目的改动。对 popup、content script、service worker 以及 options 页面的修改,会触发最快的安全更新路径:在支持时使用热模块替换(HMR),否则进行有针对性的重载。 它会自动解决常见痛点,比如陈旧的 service worker 和遗漏的 content script 更新。
Extension.js 把单一代码库编译为浏览器专属产物。同一套命令就能正确生成 Chrome、Edge、Firefox 以及其他基于 Chromium 的浏览器的打包结果。每份构建都会带上正确的 manifest 格式、路径和平台调整。 你的持续集成(CI)流水线使用同样的构建步骤、不同的浏览器 flag,这样可以减少各商店提交之间的差异。
可以。Extension.js 为 React、Preact、Vue、Svelte、TypeScript 和原生 JavaScript 提供了生产就绪的模板。组件的写法与任何前端项目一样。框架选择不会影响核心工作流。
支持。工具链围绕 Manifest V3 以及当今浏览器商店强制要求的限制构建:service worker、声明式 API、更新后的权限和更严格的打包。Manifest V3(MV3)是默认选项,而不是事后补丁。 常见踩坑请参见 Manifest V3 排查
大部分 Manifest V3 的排查可以归为几类:service worker 注册以及 type: "module"、新的 web_accessible_resources 形态、permissionshost_permissions 的拆分,以及 Firefox 中 declarative_net_request 的差异。修复方法见 Manifest V3 排查
Extension.js 替换了手写打包器配置中扩展相关的胶水代码。它会处理 manifest 版本、多浏览器产物、 content script 注入以及重载编排。把你的源文件和 manifest 移到 Extension.js 项目,剩下的交给 CLI。 你的 React/Vue/Svelte/TS 代码无需重写就能继续工作。
Extension.js 支持 pnpm、npm 和 Yarn 工作区。路径解析与共享依赖能跨工作区边界正常工作。 Extension.js 会按浏览器和构建模式注入环境变量,并在 JS、JSON 和 HTML 中替换它们的值。 开发期的密钥永远不会泄漏到生产产物里。
可以。Extension.js 在 MIT 许可证 下开源。 没有付费档位、使用上限或强制遥测的模式。这个框架由赞助者和贡献者资助。完整数据形态请查看 遥测合约
暂不支持。--browser=safari 目前还不是 CLI 目标。你仍然可以用共享的 web 代码编写 Safari 扩展, 并在这个工作流之外加入 Safari 特定的构建步骤。当前范围请参见 可用浏览器
生产构建(extension build)只会输出扩展实际引用的代码,外加一小段在生产中会被剔除的重载 runtime。 开发构建则包含额外的 HMR 与重载胶水。产物位于 dist/<browser> 下,方便你对比不同浏览器的体积。 Content script 的产物体积,与你的源码加上所选 UI 框架的预期产物非常接近。
大部分 React、Vue 与 Svelte 源文件无需重写就能直接搬过来。真正的工作集中在三处:替换打包器配置; 把生成的 manifest 换回手写的、带浏览器前缀键manifest.json; 以及更新 package.json 的脚本。逐步操作请见 从 CRXJS 迁移