React团队近日在GitHub上合并了一个备受关注的Pull Request——将React Compiler移植到Rust。这个实验性项目的开发者是React核心团队成员josephsavona,他将其描述为一次"由AI主导编码、人类紧密指导"的尝试。

React Compiler是React生态中的关键工具,可以自动优化React组件的性能。此前它使用TypeScript编写,而Rust以其高性能和内存安全著称。团队希望通过Rust获得更快的执行速度,同时为未来更广泛的集成奠定基础。
值得注意的是,这个项目的架构主要由人类设计(开发者本人),但大部分代码是由AI生成的。开发者强调,他花了大量时间设定架构、测试策略、增量迁移方案,并反复打磨代码质量以达到可接受的水平。
Rust版本采用"Rust Babel AST进、Babel AST出"的公共API设计。团队使用Rust版本的Babel AST作为中间表示,各集成(Babel、OXC、SWC)负责在自己原生表示和这个中间表示之间进行转换。目前集成还需要提供作用域信息,未来React Compiler可能会自己计算绑定和引用。
内部实现上,Rust版本与TypeScript版本架构相同。编译器将AST转换为自有中间表示HIR(High-level Intermediate Representation),HIR使用控制流图(CFG)和单静态赋值(SSA)形式。编译器经过相同的多次传递,使用相同的整体算法——这是一个逐pass的移植。
主要差异体现在数据表示上:为了适配Rust的借用系统,团队大量使用arena式结构和索引。
由于性能基准测试尚未经过充分验证,以下数据仅供参考:Babel插件模式下,Rust版本比TypeScript版本快约3倍。其中序列化成本较高,但实际转换逻辑快约10倍,整体仍然是净收益。如果是原生集成(OXC、SWC),理论上会更快。
据介绍,所有1725个测试用例在快照比对中全部通过——即Rust版本生成的临时插件与主版本进行比较时,生成的代码输出和错误信息一致。每个pass后的编译器中间表示也几乎完全相同(除去一些ID的规范化差异)。OXC和SWC的示例集成也在正常运行。
团队使用多个测试脚本来验证正确性:yarn snap --rust是最主要的测试套件;test-e2e.sh对三种变体(Babel封装版、OXC集成、SWC集成)进行端到端测试;test-rust-port.sh则深入测试每个pass后的内部编译器状态,是确保移植正确性的关键脚本。
团队正在寻求与OXC和SWC等工具的集成合作伙伴。预期的集成模式是:实现方仓库(如OXC、SWC)负责轻量级的代码转换和lint流水线集成,实际逻辑在React官方仓库的独立crate中(如react_compiler_swc、react_compiler_oxc)。这种模式让团队可以在自己的仓库内轻松修改集成层。
当前还有一些待改进之处:编译器目前返回Option<program>,未来计划改为返回一系列补丁;AST的Rust表示可以更优化(使用arena分配和smol_str);同时团队期望最终实现自己的作用域解析,从而不再依赖外部序列化的作用域数据。
参考来源:https://github.com/react/react/pull/36173