一、前言:React 进入编译时代
React 团队正式发布了 React Compiler 1.0 稳定版。
这个项目经历了近十年的探索与重构,如今终于正式走入生产环境。
React Compiler 是一个 构建时(build-time)编译器,能够在不修改业务代码的情况下,自动为组件和 Hook 进行 memoization(自动缓存优化) ,减少不必要的渲染,提高性能。
它已在 Meta、Sanity Studio、Wakelet 等大型项目中经过生产验证,性能提升明显——部分交互性能提升高达 2.5 倍。
二、什么是 React Compiler?
React Compiler 是一个在 构建阶段运行的优化器。
它会分析你的 React 组件代码结构,自动生成缓存逻辑,从而避免多余的渲染。
简单理解:
以前我们需要自己写
useMemo、useCallback、React.memo;
现在编译器能自动帮你加上。
例如:
function UserList({ users }) {
const list = users.map(u => <User key={u.id} data={u} />);
return <ul>{list}</ul>;
}
以往每次 users 改变都会重新渲染整个列表。
但使用 React Compiler 后,编译器能自动分析依赖、缓存渲染结果,只在真正变化时更新。
效果相当于自动生成了:
const list = useMemo(() => users.map(u => <User key={u.id} data={u} />), [users]);
三、性能实测
React Compiler 已在 Meta 的多个应用中部署。官方提供的性能数据如下:
| 优化指标 | 提升幅度 |
|---|---|
| 首屏加载、跨页导航 | 提升约 12% |
| 交互性能 | 提升最高达 2.5× |
| 内存使用 | 基本持平,无明显增加 |
换句话说,性能提升是真实可感的,而代码几乎无需改动。
四、安装与使用
1️⃣ 安装编译器插件
在现有 React 应用中添加:
# npm
npm install --save-dev --save-exact babel-plugin-react-compiler@latest
# pnpm
pnpm add --save-dev --save-exact babel-plugin-react-compiler@latest
# yarn
yarn add --dev --exact babel-plugin-react-compiler@latest
然后在 Babel 配置中启用:
// babel.config.js
module.exports = {
plugins: ['babel-plugin-react-compiler'],
};
2️⃣ Vite / Next.js / Expo 已内置支持
-
Expo SDK 54+ :默认启用 React Compiler
npx create-expo-app@latest -
Vite / Next.js:新建项目时可选择启用编译器模板
npm create vite@latest npx create-next-app@latest
五、渐进式迁移指南
如果你的项目已经存在大量代码,不必一次性启用。
React 团队提供了 增量迁移指南,建议从部分组件或子模块开始启用,并通过配置参数和编译目标控制适配范围。
官方还提供了用于检测兼容性的工具和 gating 策略,帮助你安全启用编译器。
六、Lint 支持:编译器驱动的 React 规则
React Compiler 同时为 ESLint 带来了新的 编译器增强规则,用于自动检测违反 “Rules of React” 的代码模式。
安装最新版的 React Hooks ESLint 插件即可:
npm install --save-dev eslint-plugin-react-hooks@latest
示例配置:
// eslint.config.js (Flat Config)
import reactHooks from 'eslint-plugin-react-hooks';
import { defineConfig } from 'eslint/config';
export default defineConfig([
reactHooks.configs.flat.recommended,
]);
它能捕获以下常见问题:
- 在 render 中错误调用
setState - 在 effect 中执行高代价的操作
- 在渲染期间访问不安全的
ref
七、useMemo / useCallback / React.memo 还需要吗?
React Compiler 已自动处理大部分 memoization。
但在某些需要手动控制依赖或副作用触发的场景下,仍可使用 useMemo 和 useCallback。
✅ 建议新项目依赖编译器自动优化,
🔒 旧代码可保留原有 memo 逻辑(删除前需充分测试)。
八、兼容性与注意事项
- 兼容 React 17+
- 旧版本可通过配置
react-compiler-runtime使用 - 建议固定版本号(
--save-exact),防止语义化升级带来 memoization 差异 - 若项目中存在不符合 React 规则的写法(如副作用混用),升级编译器时可能出现非预期行为
👉 推荐保持良好测试覆盖率,确保迁移安全
九、SWC 与未来生态
React 团队正与 SWC 作者 Kang Dongyoon (@kdy1dev) 合作,开发官方 SWC 插件支持。
这意味着未来在 Next.js 中启用 React Compiler 时,构建速度将进一步提升。
Vite 用户可继续使用 vite-plugin-react 集成编译器。
团队还计划在 oxc 与 Rolldown(Vite 新打包引擎)中支持 React Compiler。
🔮 十、展望:React 的下一个十年
React Compiler 是 React 团队十年探索的成果。
从 2017 年的 Prepack 到 2025 年的 Compiler 1.0,React 正从「运行时优化」迈向「编译时代」。
这标志着一个新阶段的开始:
从手动性能优化 → 自动化编译优化。
未来十年,React Compiler 将成为 React 的核心基础之一,
让我们可以写出更“纯”的声明式代码,而性能问题交给编译器自动处理。