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 entreNumber(x),+xetparseFloat(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.



