SWC v1.15.43 intègre le React Compiler comme transformée de première classe, corrige un bug silencieux du minifier sur les littéraux de gabarit, et aligne `unsafe_math` avec Terser

SWC v1.15.43 intègre le React Compiler comme transformée de première classe, corrige un bug silencieux du minifier sur les littéraux de gabarit, et aligne `unsafe_math` avec Terser

lschvn

SWC v1.15.43, publié le 2026-06-22 avec swc_core v71.0.3, est la première release SWC qui livre le React Compiler Rust comme transformée configurable, corrige un bug silencieux du minifier de littéraux de gabarit qui affectait chaque utilisateur de rspack et rsbuild, et aligne le flag minifier unsafe_math avec terser v4.3.11+. La release est le dix-septième patch 1.15.x dans le cycle 1.15 de SWC qui court depuis début 2026 et le premier à atterrir sur swc_core v71.

Le travail principal se trouve dans trois endroits : la passerelle swc_ecma_react_compiler qui fait du React Compiler une transformée SWC de première classe, le correctif concat_tpl des littéraux de gabarit qui ferme le bug silencieux du minifier, et le changement de comportement unsafe_math qui rétablit la parité avec terser. Sept corrections internes du React Compiler, un correctif de portée du brand check ES2022, un correctif parser no-default builds, une entrée de doc sur la portée de sécurité des entrées non fiables, et la suppression des hooks de tracing en production complètent la release.

Le bug de minifier sur les littéraux de gabarit

Le changement le plus impactant pour les utilisateurs dans v1.15.43 est fix(es/minifier): Preserve cooked when concatenating template literals (#11939, kdy1). La passe concat_tpl antérieure à v1.15.43 fusionnait a + b quand les deux côtés étaient des littéraux de gabarit en fusionnant les quasis limites : le dernier quasi du gabarit de gauche était concaténé avec le premier quasi du gabarit de droite, et le quasi fusionné était émis avec raw égal à la concaténation des deux chaînes raw. Le slot cooked n'était pas touché.

Cette asymétrie était le bug. Les passes en aval (eval_tpl_as_str, eval_nested_tpl, compress_tpl) évaluent le gabarit en chaîne via cooked, donc le texte après la dernière interpolation du gabarit de gauche était silencieusement supprimé. Le résultat était faux mais sans erreur de syntaxe, donc il était livré.

Le reproducteur de la description de PR est `<b>${1}</b>` + `<i>${2}</i>`. Avant v1.15.43, le minifier émettait <b>1<i>2</i> (note : le </b> fermant a disparu). La sortie attendue est <b>1</b><i>2</i>. Le même pattern affecte toute concaténation de deux littéraux de gabarit qui contiennent tous les deux au moins une interpolation : `${1}px` + `${2}px` minifié en ${1}${2}px avec le mauvais délimiteur. Le bug ne se déclenchait que lorsque compress: true était activé, qui est la valeur par défaut dans le chemin optimization.minimize de rspack et output.overrideBrowserslist minify de rsbuild.

Le correctif met à jour cooked dans la branche Tpl + Tpl de concat_tpl de la même manière que raw, en tombant à None si le cooked d'un côté est None (ce qui signale une séquence d'échappement invalide). Les branches sœurs Tpl + Str et Str + Tpl fusionnaient déjà correctement cooked ; seule la branche Tpl + Tpl manquait la fusion. La PR ajoute un test de régression exec qui exécute le code original et le code minifié et compare la sortie, plus 49 tests lib et 481 tests exec dans le crate swc_ecma_minifier affecté.

La description de la PR note que le bug remontait aussi via chaque bundler qui enveloppe le minifier JS de SWC, dont rspack et rsbuild. Les utilisateurs qui veulent vérifier le correctif sur une entrée connue défaillante peuvent exécuter le plus petit reproducteur de la PR :

require("@swc/core").minifySync("x = `a${0}]` + `${0}b`", { compress: true }).code
// avant v1.15.43 :  x="a00b";
// après v1.15.43 : x="a0]0b";

Le React Compiler comme transformée SWC de première classe

La fonctionnalité phare est feat(es/react-compiler): Add React Compiler (#11917, kdy1), la PR à 12 986 ajouts et 54 fichiers qui livre le React Compiler Rust comme transformée SWC configurable. L'intégration ajoute le crate passerelle swc_ecma_react_compiler, la couche de conversion d'AST et de portée entre SWC et le React Compiler, le champ de configuration .swcrc jsc.transform.reactCompiler, le relayage des diagnostics depuis la HIR du React Compiler vers le Handler de SWC, et les types d'options JS / WASM. La transformée est verrouillée derrière le feature flag react_compiler dans swc_core v71.0.3 et est actuellement expérimentale.

Le React Compiler Rust lui-même est le travail de facebook/react#36173 (mergée le 2026-06-09, par Mofei Z et l'équipe React Compiler), qui a porté le React Compiler TypeScript original vers Rust comme bibliothèque Babel-AST-in / Babel-AST-out avec trois intégrations d'exemple (Babel, Oxc, SWC). L'architecture utilise un AST de style Babel comme API publique et convertit vers et depuis la représentation native de chaque intégration ; la passerelle de SWC convertit entre l'AST saveur ESTree de SWC et l'AST Rust Babel du React Compiler.

La description de la PR est explicite sur la dépendance crates non encore publiée :

Wait for the React Compiler Rust crates to be published, then replace the temporary git dependencies with published crate versions.

En attendant, l'intégration utilise des références git vers le workspace Rust amont de facebook/react, ce qui signifie que les consommateurs en aval (rspack, rsbuild, utilisateurs SWC personnalisés) doivent builder swc_core depuis une source git s'ils veulent expérimenter. Le titre de la PR est Add React Compiler et l'entrée dans le CHANGELOG est feat(es/react-compiler): Add React Compiler ; la feature est le troisième article d'intégration React Compiler dans la presse spécialisée, après l'intégration bundler de Bun le 2026-06-20 (PR bun#32504) et les hooks treeshake React Compiler d'Oxc v0.137 le 2026-06-18 (PR oxc#23471, oxc#23586).

Le champ de configuration côté utilisateur est jsc.transform.reactCompiler dans .swcrc. La forme est documentée dans la PR mais pas encore dans les docs du crate swc publié ; le flag expérimental est la façon de l'activer.

Le changement de comportement unsafe_math

Le troisième changement principal est fix(es/minifier): Gate Number(x) -> +x on unsafe flag (#11944, avec le suivi dans #11949). Le minifier SWC antérieur à v1.15.43 réécrivait Number(x) en +x dès que unsafe_math: true était activé, même avec unsafe: false. Terser depuis v4.3.11 exigeait à la fois unsafe: true ET unsafe_math: true pour la même réécriture.

L'asymétrie est documentée dans #11944 : une source TypeScript export function foo(x) { return Number(x) } avec unsafe: false, unsafe_math: true minifie en SWC en +x et en terser en Number(x). Les deux sorties diffèrent sur chaque bundle qui utilise la config unsafe-math-only, qui est l'option Terser documentée pour une minification « suffisamment sûre » des expressions mathématiques.

Le correctif v1.15.43 conditionne la réécriture aux deux flags, en alignement avec terser. Le changement casse le comportement des utilisateurs qui s'appuyaient sur le comportement SWC : avec unsafe: false, unsafe_math: true, le minifier préserve désormais Number(x). Le correctif est documenté dans le CHANGELOG et l'entrée de doc sur la portée de sécurité des entrées non fiables (#11937) ajoute une section au README qui clarifie la frontière de sécurité pour les points d'entrée parse et process_print de SWC.

Les correctifs internes du React Compiler

Sept correctifs internes du React Compiler atterrissent à côté de l'intégration passerelle. Les correctifs sont plus petits que la passerelle elle-même mais ils sont le travail qui rend la passerelle utilisable sur des codebases réels.

  • fix(es/react-compiler): Skip TypeScript this pseudo-params in scope collector (#11940, mofeiZ) demande au scope collector d'ignorer les paramètres this synthétiques que tsserver ajoute aux méthodes TypeScript.
  • fix(es/react-compiler): Scope ClassStaticBlock and TsModuleBlock as var boundaries (#11943, mofeiZ) traite ClassStaticBlock (le bloc static { ... } dans les corps de classe ES2022) et TsModuleBlock (le corps de namespace foo { ... } et module foo { ... }) comme des frontières de portée, donc les déclarations internes ne fuitent pas dans la portée englobante.
  • fix(react-compiler): Avoid reporting non-fatal success errors as diagnostics (#11951, mofeiZ) empêche le React Compiler de rapporter ses propres marqueurs de succès comme des erreurs visibles, ce qui produisait une sortie cargo test bruyante.
  • fix(react-compiler): React compiler AST conversion for wrapped assignment targets (#11952, mofeiZ) gère les affectations vers des expressions enveloppées comme (a.b).c = 1, que la passerelle ne parvenait pas précédemment à convertir.
  • fix(react-compiler): Disable parser default features (#11957, mofeiZ) resserre le jeu de features du parser pour que la passerelle ne tire pas des features incompatibles avec le modèle de portée du React Compiler.
  • chore(es/react-compiler): Update forked react compiler to 0.2.0 (#11946) met à jour le React Compiler forké interne vers 0.2.0, ce qui aligne la passerelle avec le compilateur Rust amont.
  • refactor(es/react-compiler): Preserve TS metadata during AST roundtrip (#11950, mofeiZ) conserve les métadonnées spécifiques à TypeScript sur l'AST quand la passerelle effectue l'aller-retour entre l'AST saveur ESTree de SWC et la HIR du React Compiler.

Le feature flag pour le re-export de la transformée React Compiler est feat(swc): Gate react compiler re-export (#11941), ce qui signifie que le module react_compiler du crate swc est derrière le même feature flag react_compiler que le crate passerelle. Les utilisateurs en aval qui veulent les bindings JS / WASM doivent activer les deux.

Le correctif de portée pour les brand checks ES2022

fix(es/es2022): Correct scope for private property brand checks (#11953) resserre le suivi de portée pour le brand check des champs privés ES2022. La syntaxe #field in obj est le check à l'exécution qui décide si un champ privé est accessible depuis un site d'appel donné ; l'implémentation antérieure à v1.15.43 suivait les brand checks au mauvais niveau de portée, ce qui faisait signaler à tort certaines erreurs sur des accès à des champs privés, et acceptait à tort certains autres. Le correctif scope le brand check à la classe où le champ est déclaré, conformément à la spec.

Le correctif est la troisième correction ES2022 dans le cycle SWC 1.15, après le correctif de réécriture super des méthodes privées en v1.15.39 et le correctif de portée des blocs d'initialisation statique en v1.15.41. Les champs privés ES2022 sont toujours un travail en cours dans l'outillage ; le correctif ne change pas la surface du parser, seulement la passe de transformation.

Ce que v1.15.43 ne change pas

La release ne change pas la surface du parser, l'API publique du React Compiler au-delà de la nouvelle transformée, ou les API publiques des crates swc_ecma_*. Les valeurs par défaut CompressOptions du minifier restent celles de v1.15.41 ; le nouveau comportement unsafe_math est conditionné au flag unsafe existant. Le bump swc_core v71.0.3 est le travail qui livre le feature flag react_compiler dans les crates swc_core publiés ; la ligne v71 est la première à le porter.

La release supprime aussi les hooks de tracing en production (refactor: Remove production tracing hooks, #11945, kdy1). Le binaire SWC antérieur à v1.15.43 embarquait des hooks de tracing activables via la variable d'environnement SWC_TRACE pour le débogage en production ; les hooks ajoutaient un coût faible mais mesurable sur chaque appel parse / transform. La release v1.15.43 supprime les hooks entièrement, au prix d'un tracing en production qui n'est plus disponible sans un build debug.

À surveiller

Trois suites sont probables dans les deux à six prochaines semaines. La première est la publication des crates Rust du React Compiler sur crates.io, qui débloque l'intégration de la dépendance git temporaire vers une version publiée et permet à rspack et rsbuild de livrer la transformée dans leurs prochaines releases stables. La deuxième est la prochaine release mineure swc_core (v71.0.4 ou v71.1.0), qui est susceptible de livrer davantage de passes HIR du React Compiler exposées comme transformées SWC. La troisième est la prochaine release crates d'Oxc, prévue lundi 2026-06-29 et qui sera la première release crates hors du cycle v0.137 ; elle est susceptible de porter davantage de hooks React Compiler qui complètent la passerelle SWC.

Questions fréquentes

Astro 7.0.0 stable passe à Vite 8, fait du compilateur Rust la valeur par défaut, ajoute un serveur de dev en arrière-plan pour les agents de code IA, et promeut le cache des routes, le routage avancé et Sätteri au premier plan

Astro 7.0.0, publié le 2026-06-22, livre la branche stable 7.0 après dix semaines de beta. Les principales évolutions : montée vers Vite 8, compilateur Rust par défaut (le compilateur Go est supprimé), pipeline Markdown Sätteri par défaut (remark/rehype ne fait plus partie de l'installation par défaut), routage avancé promu depuis l'experimental (avec src/fetch.ts comme nouveau point d'entrée par défaut), cache des routes promu depuis l'experimental (cache et routeRules de premier niveau, avec les fournisseurs cacheNetlify() et cacheVercel() qui arrivent dans la même release), mode serveur de dev en arrière-plan conçu pour les agents de code IA (astro dev --background, fichier de verrouillage .astro/dev.json, astro dev stop|status|logs), compressHTML: 'jsx' comme nouvelle valeur par défaut, paquet @astrojs/db supprimé, et chaque intégration officielle bumped d'une version majeure (vue 7, react 6, svelte 9, preact 6, solid-js 7, vercel 11, netlify 8, node 11). create-astro@5.1.0, livré dans la même vague, écrit désormais un fichier AGENTS.md dans chaque nouveau projet avec un lien symbolique CLAUDE.md pointant dessus.

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 apps_v1.71.0 et oxfmt apps_v0.56.0, tous deux publiés le 2026-06-22, bouclent le cycle des crates v0.137 côté apps. Oxlint v1.71 reprend la nouvelle passe de minifier `treeshake pure typed arrays` (#23469), le correctif `prefer-query-selector` à sélecteur composé, 28 corrections de bugs de lint (en grande partie le travail de réécriture de fixer de Yunfei He), 13 entrées de performance ancrées sur un refactor de dispatch de règles en buckets (#23450, #23452, #23482-#23486, #23489, #23492), et le démarrage de Tokio uniquement pour le LSP dans oxlint (#23447). Oxfmt v0.56.0 livre 9 corrections de bugs (normalisation CRLF pour le texte supprimé par `// @ts-ignore` dans #23701 et #23702, le correctif de panique de chaîne de membres #23698, la préservation du `export default` avec cast de type #23697) et 3 entrées de performance de formatter qui suppriment les copies d'arena sur le texte bigint, littéral numérique et littéral de chaîne. v1.71 est la première release d'apps depuis v1.70.0 le 2026-06-15, et la dernière avant la release de crates v0.138 qui arrivera le lundi 2026-06-29.

Articles connexes

Plus de couverture avec des sujets et tags en commun.

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
tooling

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 apps_v1.71.0 et oxfmt apps_v0.56.0, tous deux publiés le 2026-06-22, bouclent le cycle des crates v0.137 côté apps. Oxlint v1.71 reprend la nouvelle passe de minifier `treeshake pure typed arrays` (#23469), le correctif `prefer-query-selector` à sélecteur composé, 28 corrections de bugs de lint (en grande partie le travail de réécriture de fixer de Yunfei He), 13 entrées de performance ancrées sur un refactor de dispatch de règles en buckets (#23450, #23452, #23482-#23486, #23489, #23492), et le démarrage de Tokio uniquement pour le LSP dans oxlint (#23447). Oxfmt v0.56.0 livre 9 corrections de bugs (normalisation CRLF pour le texte supprimé par `// @ts-ignore` dans #23701 et #23702, le correctif de panique de chaîne de membres #23698, la préservation du `export default` avec cast de type #23697) et 3 entrées de performance de formatter qui suppriment les copies d'arena sur le texte bigint, littéral numérique et littéral de chaîne. v1.71 est la première release d'apps depuis v1.70.0 le 2026-06-15, et la dernière avant la release de crates v0.138 qui arrivera le lundi 2026-06-29.
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.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

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