Skip to main content
在保持类 React 开发体验和快速本地迭代的前提下,让扩展 UI 的包体积更小。 Extension.js 会从依赖中检测 Preact,自动配置 JSX/TSX 转换和 React 兼容别名。你写的 React 导入会通过这些别名映射到 Preact。在开发期,改动通过 live reload 生效:受影响的界面会重新加载,而不是就地热替换组件。

什么场景适合用 Preact

  • 你想缩减 popup/sidebar/新标签页等界面的 UI 包体积。
  • 你喜欢 React 风格的组件,但希望运行时更轻。
  • 你在优化低端设备上扩展的启动时间和 UI 响应速度。

模板示例

new-preact

Template screenshot 用 Preact 和兼容 React 的写法,构建一个更轻的新标签页 UI。
仓库:extension-js/examples/newtab-preact

content-preact

Template screenshot 通过 content script 把一份精巧的 Preact UI 注入到页面内容里。
仓库:extension-js/examples/content-preact

在现有扩展中使用

按下面的步骤把 Preact 添加到现有扩展。

安装

安装所需依赖:
Preact 自带 TypeScript 类型,所以你不需要单独安装 @types/preact 你只需要添加 preact 这一个包。Extension.js 会从你的项目里解析 preact/compatpreact/test-utils 以及 JSX 运行时,并按找到的内容构建别名映射,所以不需要再额外安装其他包。

配置

Extension.js 期望 Preact 文件使用以下扩展名:
  • 未启用 TypeScript:*.jsx
  • 启用 TypeScript:*.tsx

开发期行为

当 Extension.js 检测到 Preact 时,它会配置:
  • 兼容别名(例如把 react 指向 preact/compat)。
  • 适配 Preact 的 JSX 处理。
  • 开发期的 live reload:文件变化时,受影响的界面会重新加载并重新挂载。
和 React 不同,Preact 目前还享受不到 fast refresh(保留状态的热更新)。上游的 @rspack/plugin-preact-refresh 运行时与 Extension.js 内置的 Rspack 版本不兼容, 所以 Extension.js 选择禁用它,而不是让 dev 模式出问题。你的应用在每次编辑后 仍然会更新,只是组件状态不会在编辑之间保留。等上游插件修好后,fast refresh 会回归。

排查

  • 编辑后组件状态被重置: 这是目前的预期行为,因为 Preact 用的是 live reload,而不是 fast refresh(见上文)。
  • 未检测到 Preact 集成: 确认 preact 出现在 dependenciesdevDependencies 中。

用法示例

在新标签页扩展中

要在新标签页扩展中使用 Preact,请把入口作为 <script> 引入 HTML 文件:

content_script 文件中

对于 content script,创建一个 HTML 元素并把 Preact 渲染进去:

下一步

视频讲解

模板演示