---
title: "Oxc v0.137 apprend au minifier à treeshaker les tableaux typés purs et les littéraux Set/Map, livre un rafraîchissement de portée incrémental, et corrige un cas limite du React Compiler"
description: "La release Oxc crates_v0.137.0, publiée le 2026-06-18, livre deux nouvelles passes de treeshaking pour le minifier (treeshake des tableaux typés purs et des littéraux de tableau Set/Map via #23469, et inline de la valeur const pour les variables read-only via #22593), un rafraîchissement de portée incrémental de longue haleine qui supprime entièrement le collecteur LiveUsageCollector (#23197), une erreur d'analyseur conviviale pour les éléments JSX adjacents (#23378), un correctif du React Compiler pour les imports référencés uniquement par une clé calculée (#23586), et deux changements cassants de l'API de configuration ESTree (#23573, #23574). La liste des passes du minifier reçoit aussi un correctif Proxy-aware pour les appels d'introspection d'Object (#23483) et une nouvelle règle de préservation de Map/WeakSet/WeakMap pour les arguments string (#23470). v0.137 est la première release de crates depuis v0.135 le 2026-06-08 et la deuxième depuis que l'intégration native du React Compiler dans Bun a atterri le 2026-06-20."
date: 2026-06-22
image: "/images/heroes/2026-06-22--oxc-v0-137-react-compiler-treeshake-perf.png"
author: lschvn
tags: ["tooling", "performance"]
tldr:
  - "Oxc crates v0.137.0, publiée le 2026-06-18, livre deux nouvelles passes de treeshaking pour le minifier : « treeshake pure typed arrays and Set/Map array literals » (#23469, Dunqing) et « inline const value for read-only vars » (#22593, Dunqing). La deuxième passe transforme un `const FOO = computeFoo()` suivi de références à `FOO` plus loin en la valeur inlinée, ce qui donne au reste du minifier une chance de plier le résultat, et la première passe supprime les littéraux de tableau de `Uint8Array`, `Map`, `Set` et autres dont les valeurs sont pures et inutilisées."
  - "Le minifier reçoit aussi un rafraîchissement de portée incrémental de longue haleine qui supprime entièrement le collecteur LiveUsageCollector (#23197). Combiné aux correctifs purement perf de la même release (vecteurs de statements pré-dimensionnés dans le lowering TS enum/namespace, vecteurs de props JSX pré-dimensionnés, vérifications d'inlining de template literal en passe unique, évaluation des branches de ternaire en une fois, comptages de nœuds Semantic::stats corrigés et réutilisés dans les builds du mangler), v0.137 est l'une des crates perf les plus denses du projet à ce jour."
  - "La release comporte deux changements cassants d'ESTree (« Make whether to include TS fields a runtime option » #23574 et « ESTree config use methods not consts » #23573), un correctif du React Compiler pour les imports référencés uniquement par une clé calculée (#23586) qui arrive la même semaine que l'intégration native du React Compiler dans Bun, une erreur d'analyseur conviviale pour les éléments JSX adjacents, et un correctif d'analyseur qui traite un commentaire de ligne après `:` comme un commentaire de tête plutôt que de queue."
faq:
  - question: "Quelle est la fonctionnalité phare d'Oxc crates v0.137.0 ?"
    answer: "Deux nouvelles passes de treeshaking pour le minifier : « treeshake pure typed arrays and Set/Map array literals » (#23469) et « inline const value for read-only vars » (#22593). La passe pure-array supprime les littéraux de tableau de `Uint8Array`, `Map`, `Set` et autres dont le contenu est pur et inutilisé, et la passe inline-const substitue la valeur des bindings `const` read-only sur les sites d'utilisation, ce qui permet au reste du minifier de plier le résultat. Les deux sont désactivées par défaut ; la valeur par défaut dans oxc_minifier v0.137 est la même que v0.136, donc les gains sont opt-in via `CompressOptions`."
  - question: "Que change le rafraîchissement de portée incrémental ?"
    answer: "Le collecteur `LiveUsageCollector` était la seule structure d'`oxc_minifier` qui parcourait l'arbre de portée complet à chaque passe du minifier pour déterminer quels symboles étaient encore vivants. Le rafraîchissement de portée incrémental (#23197) découpe cela en mises à jour par statement et saute le parcours complet quand aucun changement en aval n'invalide le cache. L'auteur Dunqing note dans la PR que le collecteur était le plus gros coût constant dans les grosses exécutions de minifier, et que sa suppression élimine la seule passe d'`oxc_minifier` qui s'exécutait encore en O(scope) à chaque entrée de corps de fonction. Les gains de perf sont réels mais dépendent de la taille de l'entrée ; le changement se voit surtout sur des bundles minifiés de quelques centaines de kilo-octets."
  - question: "Quel est le lien entre cette release et le React Compiler ?"
    answer: "Deux des onze entrées de performance de la release sont dans `react_compiler`. La plus grosse est « Borrow binding names in prefilter instead of allocating » (#23471, Yunfei He), qui supprime une allocation de `String` par hit de prefilter sur une déclaration de fonction. Le correctif est « Keep imports referenced only by a computed key » (#23586, Boshen), qui corrige un vrai trou de correction dans le suivi d'imports du React Compiler. Ces changements arrivent la même semaine que [l'intégration native du React Compiler dans Bun](/articles/2026-06-21--bun-react-compiler-bundler-integration-20x) (PR #32504, mergée le 2026-06-20), et le port de Bun tire l'espace de travail Rust amont de `facebook/react` directement plutôt que de passer par un adaptateur Oxc, donc les changements d'Oxc remontent toujours vers le compilateur amont."
  - question: "Quels sont les changements cassants d'ESTree dans v0.137 ?"
    answer: "Deux : « Make whether to include TS fields a runtime option » (#23574, overlookmotel) et « ESTree config use methods not consts » (#23573, overlookmotel). Le premier déplace la décision d'exposer ou non les champs spécifiques à TypeScript dans l'AST ESTree (annotations TS, paramètres de type, nœuds spécifiques à TS) d'une feature `Cargo` au build vers une option runtime sur le builder ESTree. Le second remplace les `const` publics de la struct de config `ESTree` par des méthodes, donc les sites d'appel passent de `config.include_ts_fields` à `config.include_ts_fields()`. Les deux sont de vrais changements cassants pour les crates en aval qui construisent un AST ESTree personnalisé et qui doivent mettre à jour leurs appels de config. Le compilateur lui-même est inchangé ; les changements cassants ne concernent que la couche optionnelle de compatibilité ESTree."
  - question: "Est-ce que v0.137 accélère l'analyseur ?"
    answer: "Marginalement. « Reduce code bloat from verify_modifiers monomorphization » (#23576, Boshen) réduit le gonflement de monomorphisation du chemin chaud de l'analyseur, et le correctif semantic/mangler/minifier lié dans #23352 fait que `Semantic::stats` renvoie des comptages de nœuds corrects que le mangler peut réutiliser au lieu de les recalculer. Ce sont de vrais gains sur des grosses entrées, mais ils ne sont pas benchmarkés dans la release ; le corps de la release ressemble plus à une liste de patches qu'à un rapport de benchmark. Les utilisateurs de la crate standalone `oxc_parser` ne verront probablement pas de différence de temps mural mesurable ; ce sont les utilisateurs d'`oxc_minifier` sur des grosses entrées qui verront les gains, principalement grâce à la suppression de `LiveUsageCollector` et aux vecteurs pré-dimensionnés."
  - question: "Est-ce qu'oxlint 1.71 sera livré sur ces crates ?"
    answer: "Les apps oxlint et oxfmt suivent une cadence hebdomadaire le lundi et tirent la dernière ligne `crates_v0.x` au moment de la release. v0.137 a été publiée le 2026-06-18 (jeudi), et la dernière release d'apps (oxlint v1.70.0 et oxfmt v0.55.0) a été livrée le 2026-06-15, donc la prochaine release d'apps le 2026-06-22 devrait reprendre les gains de perf de v0.137 dans les crates parser, minifier et React Compiler, plus la suppression du live-usage dans `oxc_minifier`."
---

[La release Oxc crates_v0.137.0](https://github.com/oxc-project/oxc/releases/tag/crates_v0.137.0), publiée le 18 juin 2026, livre deux nouvelles passes de treeshaking pour le minifier, un rafraîchissement de portée incrémental de longue haleine, une erreur d'analyseur conviviale pour les éléments JSX adjacents, et un correctif du React Compiler pour les imports référencés uniquement par une clé calculée. La release comporte aussi deux changements cassants de l'API de configuration ESTree et la liste de patches de perf la plus dense du projet à ce jour : onze entrées de performance réparties entre l'analyseur, le minifier, le mangler, le transformer et le React Compiler.

C'est la première release de crates depuis v0.135 le 8 juin et la deuxième depuis que [l'intégration native du React Compiler dans Bun](/articles/2026-06-21--bun-react-compiler-bundler-integration-20x) a été mergée dans `oven-sh/bun` le 20 juin. Le port de Bun tire l'espace de travail Rust amont de `facebook/react` directement, donc les changements d'Oxc ici remontent toujours vers le compilateur amont via le port de Meta et l'adaptateur `react_compiler_oxc` que les autres bundlers reprennent.

## Le titre : deux nouvelles passes de treeshaking pour le minifier

La nouvelle passe que les utilisateurs sentiront en premier est `treeshake pure typed arrays and Set/Map array literals` ([#23469](https://github.com/oxc-project/oxc/pull/23469), Dunqing). Le minifier d'avant v0.137 savait déjà treeshaker un `const x = [1, 2, 3]` dont le contenu était pur, mais il s'arrêtait à la frontière des tableaux typés : un `new Uint8Array([1, 2, 3])` dont les octets étaient inutilisés restait dans la sortie, tout comme un `new Map([["a", 1], ["b", 2]])` dont les entrées n'étaient jamais lues. La passe de v0.137 reconnaît ces constructeurs, parcourt le littéral de tableau interne, et le traite de la même façon que la passe de littéraux de tableau classique : pur + inutilisé => on supprime.

Le complément est `inline const value for read-only vars` ([#22593](https://github.com/oxc-project/oxc/pull/22593), également Dunqing). Le minifier d'avant v0.137 n'inlinait un binding `const` que si le binding était utilisé exactement une fois ; v0.137 inline la valeur sur chaque site d'utilisation quand le binding est un `const` et que la valeur est traitée comme read-only par l'analyse type-aware. Cela donne au reste du minifier (constant folding, conditionnels, simplification de return statements) une chance de plier le résultat. La description de la PR parcourt un exemple travaillé : un `const FOO = computeFoo()` suivi plus loin d'un `if (FOO > 0)` se replie en la comparaison inlinée quand `computeFoo` est une arrow pure qui retourne un littéral, et en une branche à condition constante quand c'est une arrow pure qui retourne une constante.

Les deux passes sont gardées par des flags de `CompressOptions`, désactivées par défaut dans v0.137. Les notes de release sont explicites : le `CompressOptions` par défaut dans oxc_minifier v0.137 correspond à v0.136, donc les gains sont opt-in.

## Le plus gros changement de perf : rafraîchissement de portée incrémental

Le plus gros changement de perf de v0.137 est `Incremental scoping refresh, delete LiveUsageCollector` ([#23197](https://github.com/oxc-project/oxc/pull/23197), Dunqing). `LiveUsageCollector` était la seule structure d'`oxc_minifier` qui parcourait l'arbre de portée complet à chaque passe du minifier pour déterminer quels symboles étaient encore en usage. Le rafraîchissement de portée incrémental découpe cela en mises à jour par statement et saute le parcours complet quand aucun changement en aval n'invalide le cache.

La description de la PR de Dunqing est directe : `LiveUsageCollector` était le plus gros coût constant dans les grosses exécutions de minifier, et la seule passe d'`oxc_minifier` qui s'exécutait encore en O(scope) à chaque entrée de corps de fonction. Sa suppression élimine le seul interne du minifier qui avait besoin de l'arbre de portée complet à chaque entrée, et le reste du minifier peut maintenant utiliser un rafraîchissement par statement moins coûteux. Les notes de release ne donnent pas de chiffre, mais les correctifs de perf liés de la même release racontent la même histoire :

- `Mangler: compile slot sort once instead of per CAPACITY` ([#23577](https://github.com/oxc-project/oxc/pull/23577), Boshen)
- `Parser: reduce code bloat from verify_modifiers monomorphization` ([#23576](https://github.com/oxc-project/oxc/pull/23576), Boshen)
- `ESTree: remove pointless mem::take` ([#23572](https://github.com/oxc-project/oxc/pull/23572), overlookmotel)
- `Transformer: pre-size statement vecs in TS enum & namespace lowering` ([#23516](https://github.com/oxc-project/oxc/pull/23516), Yunfei He)
- `Minifier: compute template-literal inline checks in a single pass` ([#23467](https://github.com/oxc-project/oxc/pull/23467), Yunfei He)
- `Semantic, mangler, minifier: fix Semantic::stats node count and reuse stats in mangler builds` ([#23352](https://github.com/oxc-project/oxc/pull/23352), Boshen)
- `Minifier: evaluate ternary branches once in minimize_conditional_expression` ([#23479](https://github.com/oxc-project/oxc/pull/23479), Yunfei He)
- `Transformer: pre-size JSX props vec to attribute count` ([#23466](https://github.com/oxc-project/oxc/pull/23466), Yunfei He)
- `React Compiler: borrow binding names in prefilter instead of allocating` ([#23471](https://github.com/oxc-project/oxc/pull/23471), Yunfei He)

Le correctif semantic/mangler/minifier de #23352 est celui sur lequel les autres entrées de perf s'appuient : `Semantic::stats` renvoyait auparavant des comptages de nœuds qui ne correspondaient pas à ce que le mangler allait calculer, donc le mangler devait refaire le travail. Le correctif fait correspondre les comptages, et le reste de la release peut les réutiliser. v0.137 est la première release où la pipeline semantic/mangler/minifier est cohérente sur les stats.

## Deux changements cassants de la config ESTree

Les deux changements cassants sont tous les deux dans la couche optionnelle de compatibilité ESTree, pas dans le compilateur lui-même. `Make whether to include TS fields a runtime option` ([#23574](https://github.com/oxc-project/oxc/pull/23574), overlookmotel) déplace la décision d'exposer ou non les champs spécifiques à TypeScript dans l'AST ESTree (annotations TS, paramètres de type, nœuds spécifiques à TS) d'une feature de build `Cargo` vers une option runtime sur le builder ESTree. `ESTree config use methods not consts` ([#23573](https://github.com/oxc-project/oxc/pull/23573), overlookmotel) remplace les `const` publics de la struct de config `ESTree` par des méthodes, donc les sites d'appel passent de `config.include_ts_fields` à `config.include_ts_fields()`.

Les crates en aval qui construisent un AST ESTree personnalisé doivent mettre à jour leurs appels de config. Le compilateur lui-même, l'analyseur, le transformer, le minifier et le React Compiler sont tous inchangés par le remaniement ESTree. La couche ESTree est celle qui permet à Oxc d'émettre un AST qui correspond à la [spec ESTree](https://github.com/estree/estree), ce que consomment des outils comme Rollup, esbuild et la chaîne de loaders `acorn` de webpack.

## Les entrées React Compiler

Les deux entrées React Compiler sont les plus pertinentes par rapport à l'actualité de la veille. `Keep imports referenced only by a computed key` ([#23586](https://github.com/oxc-project/oxc/pull/23586), Boshen) corrige un vrai trou de correction dans le suivi d'imports du React Compiler : un import dont la seule utilisation est le côté droit d'une clé calculée (par exemple, `obj[SomeImport]` où `SomeImport` est un import default renommé) était supprimé, ce qui se compilait en un comportement indéfini dans la HIR du React Compiler. Le correctif maintient l'import en vie dès qu'une clé calculée y résout.

`Borrow binding names in prefilter instead of allocating` ([#23471](https://github.com/oxc-project/oxc/pull/23471), Yunfei He) est une entrée de perf, pas un correctif. Le prefilter est la première passe du React Compiler sur un corps de fonction pour décider si le corps est un candidat à la compilation ; le prefilter allouait auparavant une `String` par hit, ce qui sur une grosse base de code React avec beaucoup de composants s'additionne. Le borrow supprime l'allocation.

Ces changements vont dans l'espace de travail Rust amont de `facebook/react`, pas seulement dans la fork Oxc. [L'intégration native du React Compiler dans Bun](/articles/2026-06-21--bun-react-compiler-bundler-integration-20x) porte l'espace de travail `compiler/crates/` amont directement, donc les entrées React Compiler de v0.137 seront dans la prochaine synchronisation de Bun. Oxlint et oxfmt tirent les dernières crates selon leur cadence hebdomadaire de release, et la [release oxlint 1.70](/articles/2026-06-12--oxc-v0-135-react-compiler-ast-breaking) il y a deux semaines était la première à livrer le port amont du React Compiler comme crate Rust ; v0.137 est la deuxième release de crates à porter du travail de perf et de correction sur le React Compiler.

## Le travail UX de l'analyseur

Deux changements d'analyseur visent l'ergonomie du développeur plutôt que la perf brute. `Parser: add friendly error for adjacent JSX elements` ([#23378](https://github.com/oxc-project/oxc/pull/23378), sapphi-red) remplace l'erreur cryptique « unexpected token » que l'analyseur émettait auparavant quand deux éléments JSX adjacents (par exemple `<a /><b />` au début d'un fichier sans wrapper de fragment explicite) échouaient à parser, par un message qui nomme le problème et pointe sur le token fautif. `Parser: treat a line comment after ':' as leading, not trailing` ([#23515](https://github.com/oxc-project/oxc/pull/23515), Dunqing) corrige un bug d'attribution de commentaires de longue date où un commentaire `// foo` après un `:` était attaché au token précédent au lieu du suivant, ce qui rendait les source maps fausses dans certains cas.

## Deux correctifs de correction du minifier à signaler

Les deux correctifs du minifier sont petits mais du genre qui mord en production :

- `Minifier: keep Object introspection calls on a possible Proxy` ([#23483](https://github.com/oxc-project/oxc/pull/23483), Dunqing) empêche le minifier de supprimer `Object.keys(obj)`, `Object.values(obj)`, `Object.entries(obj)` et `Object.getOwnPropertyDescriptor(obj, key)` quand `obj` pourrait être un `Proxy`, parce que l'appel peut invoquer le trap `ownKeys` ou `getOwnPropertyDescriptor` du proxy et renvoyer des valeurs arbitraires.
- `Minifier: keep new Map/WeakSet/WeakMap with a string argument` ([#23470](https://github.com/oxc-project/oxc/pull/23470), Dunqing) empêche le minifier de supprimer un `new Map([["a", 1]])` dont l'argument littéral est un tableau à clés string d'entrées pures, parce que l'ordre d'itération du constructeur compte et que le minifier le traitait comme un no-op.

Les deux appartiennent à la même famille que la nouvelle passe `treeshake pure typed arrays`, mais en sens inverse : la nouvelle passe est une extension opt-in de ce que le minifier peut prouver comme sûr à supprimer, et les deux correctifs sont des corrections d'endroits où le minifier d'avant v0.137 était trop agressif.

## Ce que v0.137 ne change pas

La release ne change ni les défauts de l'analyseur ou du minifier, ni la surface du transformer, ni l'API publique du React Compiler. Les changements cassants sont confinés à la couche optionnelle de config ESTree. Les API des crates `oxc_ast`, `oxc_parser`, `oxc_semantic`, `oxc_transformer`, `oxc_minifier`, `oxc_mangler` et `oxc_react_compiler` sont toutes rétrocompatibles avec v0.136. La prochaine [release des apps oxlint et oxfmt](https://github.com/oxc-project/oxc/releases) sur la cadence hebdomadaire du lundi reprendra les gains de perf de v0.137 dans les crates parser, minifier et React Compiler, plus la suppression de `LiveUsageCollector` dans `oxc_minifier`.

La release est aussi la deuxième à porter la nouvelle convention de l'équipe Oxc de découper le corps en sections à en-tête emoji (`💥 BREAKING CHANGES`, `🚀 Features`, `🐛 Bug Fixes`, `⚡ Performance`, `📚 Documentation`), qu'[Oxc v0.135](/articles/2026-06-12--oxc-v0-135-react-compiler-ast-breaking) a introduite. Le pattern correspond au [format de changelog de Biome](https://github.com/biomejs/biome/releases) et aux [notes de release de Vite 8](/articles/2026-04-08--vite-8-stable-seven-patches-in-three-weeks), et facilite le scan d'une release pour trouver ce qui compte pour votre code d'un coup d'œil.
