哪些会变,哪些不变
保持不变: 你的 React 组件、Tailwind 配置、测试、chrome.* API 调用,以及你正在使用的 @plasmohq/storage(它包装的是 chrome.storage,在这里同样可用)。
会改变:
- 文件约定式入口(
popup.tsx、contents/*.ts)变成真实manifest.json中显式的入口。 package.json中的manifest字段移入manifest.json。plasmo dev/plasmo build/plasmo package变成extension dev/extension build --zip。PLASMO_PUBLIC_*环境变量变成EXTENSION_PUBLIC_*。
第 1 步:安装 Extension.js
第 2 步:编写 manifest
Plasmo 根据package.json 加上文件约定来生成 manifest。Extension.js 把 manifest.json 当作事实来源。逐项翻译每个约定:
| Plasmo 约定 | manifest.json 条目 |
|---|---|
popup.tsx 或 src/popup.tsx | "action": {"default_popup": "popup/index.html"} |
options.tsx | "options_ui": {"page": "options/index.html"} |
newtab.tsx | "chrome_url_overrides": {"newtab": "newtab/index.html"} |
background.ts | "background": {"service_worker": "background.ts"} |
带 CS 配置的 contents/inline.ts | "content_scripts": [{...}] 条目 |
package.json 中的 manifest 字段 | 直接合并到 manifest.json |
popup/index.html
<script> 标签里的扩展名继续保持 .ts/.tsx。Extension.js 会在构建期编译它们。
第 3 步:转换 content script
Plasmo 通过读取导出的PlasmoCSConfig 来识别匹配规则:
contents/inline.tsx
manifest.json
getRootContainer 与 anchor 实现的 content script UI),可以改用常规 DOM 代码挂载你的组件:创建一个容器元素,把它附加到你原先 anchor 的位置,再渲染进去。完整模式(包含使用 shadow DOM 隔离样式)参见 Content scripts。
第 4 步:环境变量与消息
- 把
.env文件和代码中的PLASMO_PUBLIC_*重命名为EXTENSION_PUBLIC_*。参见 环境变量。 @plasmohq/storage可以原样继续使用。@plasmohq/messaging依赖 Plasmo 的background/messages/*构建约定。请用标准的chrome.runtime.onMessage监听器替换 background 脚本中的处理器。参见 消息。
第 5 步:更新 package.json 脚本
--target=firefox-mv2 的地方,Extension.js 直接以浏览器为目标:
dist/chrome 与 dist/firefox,里面是为各浏览器正确生成的 manifest,以及可直接提交到 Chrome Web Store 和 addons.mozilla.org 的 .zip 压缩包。
第 6 步:验证
--browser=firefox 在 Firefox 上做同样的事。如果你的代码调用 chrome.* 而又希望让同一份源码在 Firefox 上运行,可以使用 --polyfill。
常见坑
assets/中的图标: Plasmo 会基于assets/icon.png自动生成各种尺寸的图标。Extension.js 只使用 manifest 中"icons"声明的内容;自己导出需要的尺寸即可。参见 图标。~导入别名: Plasmo 把~别名指向项目根。请在tsconfig.json的 paths 中映射它,或者改用相对导入。参见 路径解析。- Storage hooks:
@plasmohq/storage/hook的useStorage可以保持不变;它只依赖 React 和chrome.storage。

