写过前端的人都以为 Vite + React Compiler = 绑 Babel。今天 oxc 把这件事彻底翻了。

写过前端的人都以为 Vite + React Compiler = 绑 Babel。今天 oxc 把这件事彻底翻了。

Oxc 团队 2026 年 8 月 4 日发布了对 React Compiler 的官方支持,包名叫 oxc-transform-react。Outlyne 团队把自己 1,036 个文件的 React Router 代码库切了过去,编译器阶段耗时从 14.3 秒降到 0.81 秒,单线程状态提速约 17.6 倍。整体构建时间从 22.1 秒降到 9.3 秒,提速 2.4 倍。

数字漂亮,但那不是最重要的。

真正重要的,是 Babel 从此可以从 Vite 的 React 工具链里消失了。

在此之前,React Compiler 的唯一接入方式是 babel-plugin-react-compiler。哪怕你用 Vite 做构建、用 Rolldown 做打包、用 Oxlint 做 lint,你的 React Compiler 依然要绑一个 Babel 实例,因为编译它的工具只存在 Babel 里。

这不只是多装一个包的问题。Babel 有自己的 AST 格式,你的 Linter(用 Oxc 的 AST)、你的打包工具(用 Oxc 或 Rolldown 的 AST)和你的 React Compiler(用 Babel 的 AST)是三个不同的内部表示。每次 React Compiler 跳过一个组件,原因是 ESLint 能catch到的东西 Babel 版本里没有——反过来也一样。这就是所谓的”lint 和 build 之间的覆盖缝隙”。

oxc-transform-react 换掉了这个关节。Oxc 把 React 团队自己的 Rust 版 React Compiler 直接 vendoring 进了 Oxc 的 AST 里,而不是维持一个 Babel 形状的 fork。这意味着两层:

第一,编译器变成了 Oxc 工具链的一部分。 Oxlint 现在内置 22 条 React Compiler 驱动的 lint 规则,你的 Linter 和你的构建工具跑的是同一个编译器版本,覆盖范围完全对齐。

第二,性能又上了一层。 Oxc 在自己的 AST 上跑编译,跳过了 Babel AST 的转换步骤和一次 JSON 往返。根据 VoidZero 团队公布的基准测试,Oxc 自己的实现比 React 团队原始 Rust 版还快约 2 倍,二进制体积从 8.66 MiB 缩到 3.97 MiB。

目前 Oxlint 还剩两个未修复的限制:try 块内部的 throw 语句,以及 ??=&&=||= 这类逻辑赋值运算符。遇到这两种写法,编译器依然会跳过那个组件。

Sanity Studio 6.11.0 是最早在生产环境里切过去的团队之一,他们给出的数字是”2 倍到 10 倍”提速,具体取决于代码库里触发编译器优化的组件密度。

下一步怎么走:

如果你用的是 Vite 8,最小迁移路径是:

# 装 oxc-transform-react
npm i -D oxc-transform-react

# vite.config.js 里启用
import react from "@vitejs/plugin-react"
export default {
  plugins: [react({ compiler: true })],
}

然后删掉 @rolldown/plugin-babel 和 babel-plugin-react-compiler。如果你在用 React Router framework mode,用 @acusti/vite-plugin-react-compiler 代替,配置里把 transform: "oxc" 传给 reactCompiler 选项。

如果你还在用 Vite 7 或更早的版本,等 Vite 8 稳定再说,因为这个集成是跟着 Vite 8 一起发的。

Oxc 工具链现在覆盖了 Parser、Transformer、Linter、Formatter、Minifier,加上 React Compiler,五件套全用同一个 AST。这意味着 Vite 生态的 React 项目第一次可以彻底卸掉 Babel,只留 Rust。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 11 阅读