配了三年 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 这件事终于在它该在的地方发生了。*

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 13 阅读