Oxlint v1.71 et Oxfmt v0.56 livrent les gains des crates v0.137, ajoutent 18 nouvelles règles de linter et domptent la traversée du cycle de vie React avec un refactor en itérateur streamed

Oxlint v1.71 et Oxfmt v0.56 livrent les gains des crates v0.137, ajoutent 18 nouvelles règles de linter et domptent la traversée du cycle de vie React avec un refactor en itérateur streamed

lschvn

Oxlint v1.71.0 et oxfmt v0.56.0 sont sortis ensemble le 22 juin 2026, quatre jours après la release crates_v0.137.0 et une semaine après la release d'apps v1.70.0. La release est la reprise côté apps du cycle des crates v0.137 et la dernière release d'apps avant que la ligne de crates v0.138 n'arrive le lundi 2026-06-29. Le travail phare est le refactor de dispatch de règles en buckets côté linter et la normalisation CRLF + le correctif de panique de chaîne de membres côté formatter.

La release Oxlint comporte 18 nouvelles fonctionnalités, 28 corrections de bugs et 13 entrées de performance. La release Oxfmt comporte 9 corrections de bugs et 3 entrées de performance. Au total : 71 entrées réparties sur les deux apps, dans la moyenne du cycle v1.70 et un peu au-dessus du cycle v1.68.

Le titre : dispatch de règles en buckets

Le changement de performance le plus important de v1.71 est linter: Reuse rule dispatch buckets (#23450, camc314), suivi de linter: Use bucketed dispatch for all files (#23452, camc314). Avant v1.71, le linter émettait un bras de match de RuleEnum par branche de timing à chaque entrée dans une règle, puis réémettait les mêmes bras de match à chaque fichier suivant. Le refactor en buckets déplace les bras de match dans une seule allocation réutilisée entre tous les fichiers d'un run.

L'entrée de performance complémentaire est linter: Emit RuleEnum dispatch match once instead of per timing branch (#23499, Boshen). Ensemble, les deux PR suppriment le coût de configuration par fichier qui dominait le temps mural d'oxlint sur les runs à froid. Le travail de règle lui-même était déjà rapide ; ce qui était coûteux, c'était la comptabilité autour.

La release corrige aussi le coût de démarrage à froid : oxlint: Start Tokio only for LSP (#23447, camc314) déplace le démarrage du runtime asynchrone Tokio hors du chemin CLI. Avant v1.71, oxlint démarrait un runtime Tokio à chaque invocation, même quand le CLI tournait de façon synchrone et n'en avait jamais besoin. Après v1.71, le chemin LSP reçoit toujours un runtime (il en a besoin pour piloter le protocole de language server), et le chemin CLI saute entièrement le coût de démarrage.

La reprise des crates v0.137

La release des crates v0.137 du 18 juin a livré deux nouvelles passes de treeshaking pour le minifier, un rafraîchissement de portée incrémental de longue haleine qui a supprimé LiveUsageCollector, et deux changements cassants d'ESTree. La release d'apps v1.71 reprend les parties visibles par l'utilisateur : minifier: Treeshake pure typed arrays and Set/Map array literals (#23469, Dunqing) est dans le build du minifier de v1.71, avec la suppression de LiveUsageCollector, les correctifs de perf de l'analyseur et les entrées de perf du React Compiler. Les deux changements cassants d'ESTree (#23574, #23573) sont opt-in : ils concernent les crates en aval qui construisent un AST ESTree personnalisé, pas les utilisateurs d'oxlint.

La passe complémentaire de minifier inline const value for read-only vars (#22593) est aussi dans le build du minifier de v1.71. Les deux passes restent désactivées par défaut ; les défauts de CompressOptions du minifier dans v1.71 correspondent à v1.70 / v0.136, donc les gains sont opt-in via la config.

18 nouvelles règles de linter

La release v1.71 livre 18 nouvelles règles de linter réparties sur les catégories ESLint, TypeScript, Node, Unicorn, Vue, JSDoc et React. Les plus importantes :

  • unicorn/prefer-number-coercion (#23497, Shekhu) détecte au moment du lint le problème de cohérence entre Number(x), +x et parseFloat(x).
  • node/no-sync (#23589, fujitani sora) signale les appels synchrones au système de fichiers et aux processus enfants dans les points d'entrée serveur.
  • vue/no-async-in-computed-properties (#23493, bab) comble un vrai trou de correction dans les définitions de computed properties Vue.
  • node/no-mixed-requires (#23539, fujitani sora) signale les styles de require mélangés dans les modules CommonJS.
  • unicorn/max-nested-calls (#23461, arieleli01212) détecte les chaînes de fonctions trop imbriquées.

La release livre aussi le support de schéma pour eslint/no-restricted-properties (#23619, Sysix), node/callback-return (#23615, Sysix), import/extensions (#23557, WaterWhisperer), unicorn/numeric-separators-style (#23554, Mikhail Baev), eslint/prefer-destructuring (#23410, WaterWhisperer), et react/jsx-no-script-url (#23475, WaterWhisperer). Le travail de schéma ouvre des chemins de migration depuis des configs ESLint qui étaient auparavant manuels.

Côté suggestion, linter/typescript: Implement suggestion for no-unnecessary-type-constraint rule (#23646, Mikhail Baev) et linter/jsdoc/require-param-type: Implement fixer (#23513, camc314) ajoutent le support de l'auto-fix pour deux règles qui auparavant ne faisaient que rapporter.

Le refactor du cycle de vie React

La plus grande source de churn d'allocations sur les codebases React avec des composants profondément imbriqués était la traversée de react/no-deprecated et react/jsx-no-undef, qui collectait chaque ancêtre de chaque élément JSX dans un Vec avant de faire le moindre travail de règle. linter: Stream React lifecycle ancestors (#23545, camc314) remplace la collecte en Vec par un itérateur en streaming qui parcourt la chaîne d'ancêtres à la demande.

Combiné à linter: Avoid JSX fragment child collections (#23486, camc314) et linter/oxc/branches-sharing-code: Borrow shared branch suggestion text (#23484, camc314), v1.71 est la première release où les règles de linter liées à React sont allocation-aware sur le chemin chaud. Les trois PR représentent l'essentiel du travail de performance lié à React dans la release.

28 corrections de bugs de lint, en grande partie Yunfei He

Les 28 corrections de bugs de lint dans v1.71 sont dominées par le travail de réécriture de fixer de Yunfei He. Le pattern est le même d'un correctif à l'autre : le linter d'avant v1.71 réécrivait une construction de code en utilisant de la concaténation de chaînes, supprimait des parenthèses que la source avait explicitement ajoutées, ou collait un fragment dans une position qui produisait de la syntaxe invalide. Les correctifs de v1.71 préservent les parenthèses (#23578, #23579), préservent le texte source des opérandes (#23533), sautent les fixes sur des récepteurs qui ne sont pas du type attendu (#23518, #23520, #23527), et préservent les alias d'import (#23568).

Le correctif le plus marquant est la panique parseInt(_, spread). linter/radix: Avoid panic on parseInt with a spread radix argument (#23623, Jerry Zhao) ferme une vraie panique qui se déclenchait quand parseInt(x, ...args) était appelé avec un argument radix calculé. Le même correctif a été appliqué à deux règles voisines dans la même release : linter/prefer-numeric-literals (#23624, Jerry Zhao) et le suivi linter/radix (#23626). Avant v1.71, le linter paniquait et faisait crasher la CI sur les codebases qui utilisaient parseInt avec des arguments radix calculés.

Autres corrections notables : linter/prefer-query-selector: Use a compound selector for multiple classes (#23628, Jerry Zhao) corrige un trou de correction dans prefer-query-selector où un sélecteur multi-classes était réécrit comme une suite de sélecteurs mono-classe, cassant l'intention sémantique ; linter: False positives with non *.setTimeout call in no-confusing-set-timeout (#23444, camc314) empêche la règle de signaler des appels à setTimeout venus d'un import renommé ; et linter/eslint/no-useless-assignment: Handle exceptional control-flow paths (#23544, camc314) ferme un trou de correction où la règle ratait des assignations à l'intérieur de blocs try/finally.

Les changements de formatter

Oxfmt v0.56.0 livre trois changements de fond. Le premier est la normalisation CRLF pour le texte supprimé : formatter_json: Normalize CRLF for suppressed text (#23702, leaysgur) et formatter: Normalize CRLF for suppressed text (#23701, leaysgur) garantissent que les commentaires de suppression comme // @ts-ignore et // oxlint-disable-next-line conservent leurs fins de ligne quand le formatter réécrit le code environnant sur un projet qui mélange CRLF et LF. Le deuxième est le correctif de panique de chaîne de membres : formatter: Member chain panic when tail is merged with comment in dev build (#23698, leaysgur) ferme une panique dans le build dev qui se déclenchait quand la queue d'une chaîne de membres fusionnait avec un commentaire de fin. Le troisième est formatter: Preserve parens with default export and type cast (#23697, leaysgur), qui conserve les parenthèses autour des constructions export default x as Y que le formatter aplatissait auparavant.

Les entrées de perf du formatter sont plus petites mais cohérentes : formatter: Avoid arena copy for already-lowercase bigint literals (#23534, Yunfei He), formatter: Avoid arena copy for borrowed numeric-literal text (#23512, Yunfei He), et formatter: Avoid arena copy for borrowed string-literal text (#23465, Yunfei He) suppriment tous des copies d'arena que le formatter d'avant v0.56 effectuait sur du texte dont le formatter avait déjà déterminé qu'il pouvait être emprunté sans risque.

Ce que v1.71 ne change pas

La release ne change pas les défauts de règles, la surface de l'analyseur ni l'API publique du React Compiler. Les défauts de CompressOptions du minifier correspondent à v1.70 / v0.136. Le serveur LSP gagne le correctif de démarrage de Tokio mais ne gagne pas de nouvelle fonctionnalité de protocole. La prochaine release de crates le lundi 2026-06-29 (v0.138) sera la première à livrer des changements qui ne sont pas dans le cycle v0.137 ; la release d'apps v1.71 boucle le cycle qui a commencé avec crates_v0.135 le 2026-06-08 et qui passe par la release d'apps v1.70 le 2026-06-15.

La release est aussi la troisième à porter le format à sections à emoji (🚀 Features, 🐛 Bug Fixes, ⚡ Performance, 📚 Documentation) de l'équipe Oxc, qu'Oxc v0.135 a introduit. Le pattern correspond au format de changelog Biome et aux notes de release de Vite 8, et facilite le survol d'une release pour trouver ce qui compte pour votre code.

À surveiller

Trois suites sont probables dans les deux à quatre prochaines semaines. La première est la release crates_v0.138.0 le lundi 2026-06-29, qui sera la première release de crates hors du cycle v0.137. La deuxième est la release d'apps correspondante oxlint v1.72.0 et oxfmt v0.57.0 le lundi 2026-07-06, qui reprendra ce que la ligne de crates v0.138 livrera. La troisième est la continuation du refactor de dispatch en buckets de camc314 : la release v1.71 a posé les fondations, mais plusieurs règles utilisent encore le pattern d'allocation par règle que v1.71 a retiré pour la couche de dispatch ; il faut s'attendre à plus de travail de bucketing dans v1.72.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

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
tooling

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

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.
Bun intègre le React Compiler directement dans son bundler, environ 20x plus rapide que le plugin Babel
tooling

Bun intègre le React Compiler directement dans son bundler, environ 20x plus rapide que le plugin Babel

La PR #32504, fusionnée dans oven-sh/bun le 20 juin 2026, transforme le portage Rust amont du React Compiler en transformation intégrée à `bun build`, derrière `--react-compiler` et `Bun.build({ reactCompiler: true })`. Bun porte directement l'espace de travail `compiler/crates/` de `facebook/react` dans une unique crate `src/react_compiler/` (~62 k LOC) plutôt que de passer par Babel, SWC ou Oxc, et sur une grosse base de code React (environ 860 composants, 1400 slots de mémo) la passe du compilateur s'exécute en 465 ms contre 9,15 s pour le plugin Babel. La fonctionnalité est expérimentale, désactivée par défaut, et livrée avec `reactCompilerOutputMode` (client ou ssr) et un script `scripts/sync-react-compiler.sh` pour resynchroniser le portage.
Astro 7.0.0-beta.6 stabilise le cache des routes et fait de la compression d'espaces JSX la valeur par défaut
tooling

Astro 7.0.0-beta.6 stabilise le cache des routes et fait de la compression d'espaces JSX la valeur par défaut

Astro 7.0.0-beta.6 (19 juin 2026) promeut l'API expérimentale de cache des routes au niveau stable racine, supprimant les drapeaux experimental.cache et experimental.routeRules au profit d'une configuration cache de premier niveau et d'un assistant cache. La beta.5 (18 juin) a fait de « jsx » la valeur par défaut de compressHTML, changeant le HTML rendu de tout site qui s'appuyait sur la préservation d'espaces. La beta.6 embarque aussi @astrojs/markdown-satteri 0.3.1-beta.2.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.