跳转到主要内容
Extension.js 会从项目依赖中检测 React,并自动配置 JSX/TSX 转换、React 模块别名以及开发期的 fast-refresh 支持。

什么场景适合用 React

  • 你在构建 popup、options、sidebar 或新标签页这类组件丰富的 UI 界面。
  • 你希望在扩展页面与 content script UI 挂载之间复用组件。
  • 你已经在 web 项目里使用 React,希望在扩展中沿用同样的开发模式。

模板示例

new-react

new-react template screenshot 用一个开箱即用的项目结构搭建 React 新标签页体验。
npx extension@latest create my-extension --template=new-react
仓库:extension-js/examples/new-react

content-react

content-react template screenshot 通过 content script 优先的设置,把 React UI 注入现有页面。
npx extension@latest create my-extension --template=content-react
仓库:extension-js/examples/content-react

new-react-router

new-react-router template screenshot 使用 React Router 的客户端路由的 React 扩展。
npx extension@latest create my-extension --template=new-react-router
仓库:extension-js/examples/new-react-router

在现有扩展中使用

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

安装

安装 React 运行时依赖: 如果使用 TypeScript,再安装 React 类型包:

配置

常见的 React 文件名模式:
  • JavaScript:*.jsx
  • TypeScript:*.tsx

开发期行为

在开发模式下,当 Extension.js 检测到 React 时,会启用 React refresh 集成。
  • Extension.js 使用 react-refresh@rspack/plugin-react-refresh 来提供 refresh 行为。
  • 如果项目缺少可选的 refresh 依赖,Extension.js 会安装它们并请求你重启。
  • Extension.js 会应用 React 相关的别名,以确保打包结果里只有一份 React/runtime 实例。

用法示例

在新标签页扩展中

页面入口示例:
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>New Extension</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this extension.</noscript>
    <div id="root"></div>
  </body>
  <script src="./index.tsx"></script>
</html>
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
);
export default function App() {
  return <h1>Hello, Extension!</h1>;
}

content_script 文件中

对于 content script,把 React 渲染到一个注入的根元素里:
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./content.css";

const rootDiv = document.createElement("div");
rootDiv.id = "extension-root";
document.body.appendChild(rootDiv);

const root = ReactDOM.createRoot(rootDiv);
root.render(<App />);

下一步

视频讲解