Skip to content

Build1 publisher3 min readPublished

The Rust React Compiler cut a 1,036-file compile step from 14.3s to 0.81s

A 1,036-file React Router build ran its compile step in 0.81 seconds on oxc's native React Compiler, down from 14.3 under Babel, and the whole build still takes 9.3. Opting in needs one config key and Vite v8.

The Engineer · Build desk

Illustration accompanying The Rust React Compiler cut a 1,036-file compile step from 14.3s to 0.81s

What happened

  • The oxc project shipped official support for the Rust React Compiler on 4 August 2026, and the team behind the website builder Outlyne moved a 1,036-file React Router codebase onto it.
  • The compile step in that build fell from 14.3 seconds under Babel to 0.81 seconds on the native compiler running single-threaded, about a 17.6-fold speedup on that step alone.
  • The full build went from 22.1 seconds to 9.3 seconds, around 2.4 times faster, because compilation was only one part of the pipeline.
  • The switch brought seven more functions of the Outlyne codebase into compiled output, five from improved try/catch handling and two from computed object property keys.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint The ceiling is set by how much of your build wall time is compilation: at a fifth of the build, making the compile step free buys 1.25x, whichever compiler you run.
  • cost The payoff arrives as CI minutes, so it scales with how many builds a day a team runs rather than with the speedup factor, and the post does not price its Actions bill.
  • decision Teams holding on the Babel-based compiler now have to decide whether to move, because the post's author says future JavaScript-support fixes land only on the Rust path.
  • capability With Oxlint and the build on one compiler version, a component that silently fails to compile can no longer pass lint clean.

Put the two savings side by side and they do not fully reconcile. The compile step lost 13.49 seconds [1]. The whole build lost 12.8 [2]. So the non-compiler work in that pipeline went from 7.8 seconds to 8.49 across the two measurements [3]. Different runs, most likely.

Before the switch, compilation was about 65 percent of that build. After it, 8.7 percent [4]. The 0.81s pass is single-threaded [3], so there is time still available, and taking all of it would cut the build by under nine percent [4].

The 17.6x is a measurement of one workload, 1,036 files of a React Router app called Outlyne [2]. For the 2.4x whole-build figure to transfer, compilation has to be roughly two thirds of your build's wall time. Where it is a fifth, removing it completely caps the gain at 1.25x [5]. Boshen, the oxc project lead, gave a lower figure for the compiler alone: "It is more than 10 times faster than Babel in our preliminary benchmark," he said [7].

The post on blog.master.dev says its author is more interested in being on the latest version of the compiler than in the speedup [20]. Three patterns that made the Babel-based compiler bail now compile: conditional logic of any kind inside try/catch, which blocked many users of the stable 1.0 release [10]; reassigning a destructured component prop that is then used in a nested closure, support for which landed the week before he wrote [11]; and computed object property keys [12]. A throw from inside a try block and the logical assignment operators still cause the compiler to skip a component or hook [14].

The version skew is the practical part. He filed an issue against oxc after a component was neither optimized during the build nor flagged by Oxlint. Oxlint was using oxc-transform-react v0.145.0, which supports the pattern; he was testing against v0.144.0 of the same package [16]. One patch version between linter and build produced a bug report about a bug that did not exist. Both now run the same React Compiler with the same limitations [17].

Adoption cost is small if you are already current. @vitejs/plugin-react v6.1.0 calls the feature experimental native React Compiler support, and you turn it on by passing { compiler: true } to the plugin in your Vite config [5]. Switching an existing Vite build wants Vite v8 or newer [18]. React Router in framework mode does not go through that plugin, so the post uses @acusti/vite-plugin-react-compiler instead [6]. The stated motive is CI: agent-assisted development has raised build volume enough that GitHub Actions minutes are a cost center for the team [19]. On their own measurements, the switch returns 12.8 seconds a build [2].

What to watch

  • Whether @vitejs/plugin-react drops the experimental label on native React Compiler support, and what the default becomes.
  • Whether a throw inside a try block and the logical assignment operators (??=, &&=, ||=) get support in the Rust compiler.
  • Whether any of these JavaScript-support fixes are backported to the Babel-based compiler.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories