Présentation du compilateur Rust React
Le projet oxc a publié le 4 août 2026 le support officiel du React Compiler écrit en Rust. Cette implémentation native remplace le pipeline Babel habituel et se déclenche dans Vite via l’option { compiler: true } du plugin @vitejs/plugin-react (v6.1.0). Un plugin alternatif, @acusti/vite-plugin-react-compiler, permet d’utiliser le même compilateur même lorsque le plugin officiel ne peut pas être appliqué, par exemple avec React Router en mode framework.
Performances mesurées
Sur un projet de 1 036 fichiers React Router, le temps de compilation est passé de 14,3 s avec Babel à 0,81 s en mode natif, soit un facteur de ≈ 17,6×. Le benchmark interne du responsable du projet oxc indique un gain « plus de 10 fois » par rapport à Babel. Cette amélioration concerne uniquement la phase de compilation ; le reste du processus de construction (bundling, minification, etc.) n’est pas affecté. En pratique, le temps total de build a été réduit de 22,1 s à 9,3 s, soit une accélération globale de ≈ 2,4×.
Compatibilité et limitations
La version Rust du compilateur corrige plusieurs restrictions présentes dans la version Babel 1.0 : prise en charge de la logique conditionnelle dans les blocs try/catch, réaffectation de propriétés destructurées, et clés d’objet calculées. Ces correctifs ajoutent la compatibilité de sept fonctions supplémentaires (cinq grâce aux améliorations try/catch, deux grâce aux clés d’objet calculées). Exemple de code désormais supporté :
export default function Foo({ value }: { value: null | string }) {
value = value ?? "this is a fallback";
return <button onClick={() => console.log(value)}>{value}</button>;
}
et :
import { clsx } from "clsx";
export default function Header({ itemCount }: { itemCount: number }) {
return (
<header className={clsx({ [`items-${itemCount}`]: itemCount > 0 })}>
{/* ... */}
</header>
);
}
Des cas restent non supportés : levée d’exception à l’intérieur d’un try et opérateurs d’affectation logique (??=, &&=, ||=). Le passage au compilateur Rust garantit que les futures corrections seront disponibles dès leur publication, contrairement à la chaîne Babel qui ne reçoit plus de mises à jour majeures.
Intégration dans Vite
Pour les projets déjà sur Vite ≥ 8, la migration consiste à installer oxc-transform-react et à activer le flag compiler :
// vite.config.js
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react({ compiler: true })],
});
Cette configuration supprime la dépendance @rolldown/plugin-babel et les presets associés. Dans les projets utilisant React Router en mode framework, le remplacement du plugin Babel par @acusti/vite-plugin-react-compiler élimine trois paquets (vite-plugin-babel, babel-plugin-react-compiler, @babel/preset-typescript) tout en conservant la même logique de compilation.
Un autre avantage technique réside dans la cohérence de la chaîne d’outils : le même compilateur est utilisé par le linter Oxlint et le processus de build. Une différence de version (oxc‑transform‑react v0.145.0 vs v0.144.0) avait auparavant généré des incohérences où le linter acceptait du code que le compilateur rejetait. L’uniformisation élimine ces « coverage gaps » et garantit que chaque composant est traité de façon identique du linting à la production.