配了三年 React Compiler,今天才知道这玩意儿一直在跑 Babel——今天 Oxc 把这件事彻底原生化了
React Compiler 跑在 Babel 上这个事实,很多 React 开发者用了一两年都没意识到——因为体验上它确实 work,但代价是每次构建都多背一个 Babel 实例。2026 年 8 月 18 日,Oxc 官方博客宣布 React Compiler 支持,改变了这件事。
背景:React Compiler 是什么
React Compiler(前身 React Forget)是 Meta 给 React 打的”自动性能优化层”。它能在编译时分析组件依赖,把 useMemo / useCallback / memo 手动优化变成编译器自动完成的事——你只管写业务代码,memo 逻辑编译器帮你插进去。
问题是:React Compiler 官方提供的运行时依赖 Babel 插件。React 团队在 2026 年初把 Compiler 重写成了 Rust 版本(canonical Rust port),但要跑它,Vite 项目里还是要装 @vitejs/plugin-react + Babel。
Babel 管道拖慢了整个流程
在没有 Oxc 之前,Oxlint 要支持 React Compiler lint 规则,必须走 Babel。有开发者实测,跑了 Babel 管道之后,lint 任务从 9 秒暴涨到 29 秒,慢了 3 倍多。
本质上,React Compiler 的 Rust 重写版本已经很快了,但 Babel 这一层把速度优势吃掉了大半。
Oxc 怎么把 Babel 去掉
Oxc 干了件很聪明的事:直接把 React Compiler 的 Rust 版本嵌入自己的 AST 体系,不需要 Babel AST 转换,不需要 JSON 中间层。
这把两个 Rust 编译器直接打通:Oxc 的 Parser → React Compiler → Oxc Transformer,效果从 benchmark 看:
| 文件 | Oxc | Babel | 加速 |
|---|---|---|---|
| UserSettings.tsx | 0.87 ms | 13.39 ms | 15x |
| table.tsx | 8.02 ms | 98.68 ms | 12x |
实际上 Oxc 的实现比 React 团队自己的 Rust port 还快 2 倍,二进制体积从 8.66 MiB 缩到 3.97 MiB。
Oxc 团队在超过 100,000 个源文件、100+ 个流行仓库 上跑了一致性测试,输出和 Babel 版本完全相同。
Oxlint 的 22 条规则
除了 oxc-transform-react 做构建时自动 memo,Oxlint 还内置了 22 条 React Compiler 驱动的 lint 规则,lint 阶段就能发现哪些组件会因为违反 Rules of React 导致 memo bailout、性能退化。
{
"plugins": ["react"],
"categories": {
"correctness": "error"
}
}
怎么接入
需要 Vite 8 和 @vitejs/plugin-react v6.1.0 以上:
pnpm add -D oxc-transform-react @vitejs/plugin-react@^6.1.0
// vite.config.js
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react({ compiler: true })],
});
Compiler 是独立包,不影响 Vite 或 Rolldown 本身,不用 React 的项目完全不受影响。
- Oxc 把 React Compiler 从 Babel 管道里解放出来,memo 这件事终于在它该在的地方发生了。*
评论区
登录后可评论。