React Router v8 promeut ses Future Flags en valeurs par défaut, passe en ESM uniquement et abandonne `react-router-dom`

React Router v8 promeut ses Future Flags en valeurs par défaut, passe en ESM uniquement et abandonne `react-router-dom`

lschvn

React Router v8.0.0 est sorti le 17 juin 2026, suivi d'un correctif v8.0.1 le lendemain. C'est la première version majeure sous le modèle de gouvernance ouverte du projet et la première d'un rythme annuel planifié, délibérément calée sur la fenêtre de fin de vie de Node 20. Node 22 lui-même est prévu pour atteindre sa fin de vie autour de mai 2027, ce qui est la cible que l'équipe fixe pour la v9. L'élément principal n'est pas tant une fonctionnalité unique qu'une promotion : le travail de la stratégie de développement des API est de rendre les versions majeures ennuyeuses en livrant les changements cassants tôt derrière des Future Flags, et la v8 est la version où chaque indicateur future.v8_* de la v7 devient la valeur par défaut.

Les Future Flags sont promues en valeurs par défaut

Si vous aviez adopté tous les indicateurs futurs actifs en v7, la surface d'API de la v8 est largement inchangée, parce que ces indicateurs sont supprimés ou promus en configuration de premier niveau et que leur comportement est désormais inconditionnel. Les indicateurs qui ont été promus :

  • future.v8_trailingSlashAwareDataRequests disparaît ; les URL de requêtes de données sensibles au slash final sont la valeur par défaut.
  • future.v8_passThroughRequests disparaît ; la request entrante brute est désormais toujours transmise à loader et action. Utilisez le paramètre url quand vous voulez l'URL normalisée sans les détails internes de React Router comme les suffixes .data et les paramètres de recherche _routes.
  • future.v8_middleware disparaît ; le middleware s'exécute toujours. Le context passé aux loaders, actions et middlewares est toujours un RouterContextProvider, getLoadContext dans un serveur personnalisé doit en retourner un plutôt qu'un objet simple, le type MiddlewareEnabled est supprimé, et l'astuce d'augmentation interface Future { v8_middleware: true } n'est plus nécessaire pour typer context en Data Mode.
  • future.v8_viteEnvironmentApi disparaît ; le chemin de build via l'API Vite Environment est obligatoire, ce qui explique pourquoi la v8 requiert Vite 7+ et pourquoi l'ancienne implémentation de pré-rendu a été remplacée par le flux du serveur de prévisualisation Vite.
  • future.v8_splitRouteModules devient une option de configuration de premier niveau splitRouteModules et vaut true par défaut. Mettez-la à false pour garder les modules de route dans un seul chunk, ou à "enforce" pour exiger que chaque route soit découplable.

L'idée de « promotion » est la véritable histoire. Les future flags permettent à l'équipe de livrer un changement cassant dans une mineure de v7, de laisser les utilisateurs l'adopter et faire remonter leurs retours, puis de basculer la valeur par défaut dans la majeure avec un an de validation en production derrière elle. La v8 est la version qui concrétise ce pipeline.

Nouvelles bases minimales : Node 22.22, React 19.2.7, Vite 7 et ESM uniquement

La v8 fixe une nouvelle politique de base minimale qu'il vaut la peine de lire en détail. React Router prend désormais officiellement en charge toutes les versions Active LTS de Node et uniquement la dernière branche mineure de Maintenance LTS, ce qui lui permet de relever rapidement le plancher Maintenance LTS quand un correctif de sécurité paraît (comme lors des versions de sécurité Node.js de juin 2026) et d'adopter les fonctionnalités Active LTS qui sont rétroportées. Pour le lancement, ce plancher est Node 22.22.0+, aux côtés de React 19.2.7+ et Vite 7+.

Pour moderniser la bibliothèque, tous les paquets publiés sont désormais en ESM uniquement et les champs target/lib du tsconfig sont passés de ES2020 à ES2022 partout. Cette décision ESM uniquement n'est pas cosmétique : c'est elle qui a débloqué les réécritures d'adaptateurs ci-dessous, parce que les adaptateurs pouvaient enfin consommer directement d'autres paquets en ESM uniquement.

react-router-dom disparaît, ainsi que quelques API dépréciées

La suppression la plus visible est react-router-dom. En v7, les API DOM avaient été regroupées dans react-router/dom, et react-router-dom n'était conservé que comme couche de réexportation pour que les importations existantes de v6 continuent de fonctionner. La couche disparaît en v8. Toute importation restante de react-router-dom doit être déplacée : RouterProvider et HydratedRouter proviennent de react-router/dom, tout le reste de react-router.

Trois autres suppressions complètent la liste. Les champs data dépréciés passés aux fonctions meta des modules de route disparaissent ; utilisez loaderData à la place sur MetaArgs et sur chaque élément de MetaArgs.matches (#14931). Le proxy de développement Cloudflare à @react-router/dev/vite/cloudflare est supprimé au profit de @cloudflare/vite-plugin, ce qui abandonne aussi wrangler@3 comme dépendance de paire de @react-router/dev. Et le champ interne hasErrorBoundary injecté sur router.routes disparaît ; le routeur déduit désormais les limites d'erreur directement, et hasErrorBoundary n'est plus accepté sur RouteObject, DataRouteObject, les props JSX de <Route>, ni les définitions de route lazy (#15074).

Internes des adaptateurs : fetch natif, node-fetch-server, tsdown, TypeScript 6

La couche d'adaptateurs a reçu une réécriture discrète qui compte pour quiconque fait tourner React Router sur Node ou génère des applications avec create-react-router. @react-router/node et @react-router/serve passent de @mjackson/node-fetch-server à @remix-run/node-fetch-server, et create-react-router remplace @remix-run/web-fetch par le fetch natif de Node. L'effet de bord pratique : create-react-router ne prend plus en charge la variable d'environnement HTTPS_PROXY que l'ancien polyfill basé sur node-fetch honorait (#14929), ce qu'il est bon de savoir si votre CI se trouve derrière un proxy d'entreprise.

Côté build, le build des paquets a migré de tsup vers tsdown et l'outillage TypeScript est passé à TypeScript 6, tout en préservant les fichiers de modules individuels dans les artefacts publiés afin que les API publiques et les chemins d'import documentés restent inchangés (#15092). @react-router/dev a remplacé cookie et set-cookie-parser par cookie-es, supprimé la dépendance vite-node au profit des API natives de module runner de Vite, et mis à jour une longue traîne de dépendances (Babel en 7.29, react-refresh en 0.18, es-module-lexer en 2.1, chokidar en 5). L'adaptateur Express requiert désormais Express ^4.22.2 || ^5, et @react-router/serve est passé à Express 5.2.1.

Le chemin de mise à jour

Pour la plupart des équipes, la mise à jour est mécanique si les future flags de v7 étaient déjà activées. Le travail consiste à : monter Node en 22.22+, React en 19.2.7+ et Vite en 7+ ; remplacer toute importation persistante de react-router-dom ; renommer data en loaderData dans les fonctions meta ; et s'assurer que getLoadContext retourne un RouterContextProvider. La version v7.18.0 du 16 juin a également livré un correctif de logique de vérification CSRF qui constitue un potentiel « correctif cassant » derrière un reverse proxy : la vérification lit désormais le host depuis l'URL de la requête plutôt que depuis les en-têtes HTTP, donc les applications @react-router/serve ou @react-router/express sans trust proxy activé peuvent avoir besoin d'ajouter l'hôte interne à allowedActionOrigins. Testez les requêtes de mutation dans le cadre de la mise à jour.

La v8.0.1 (18 juin) est un correctif de nettoyage unique qui supprime l'export de type AppLoadContext obsolète hérité de v7, maintenant que le contexte de requête passe toujours par RouterContextProvider (#15207). Elle arrive un jour après la majeure, qui elle-même arrive la même semaine que vue-router atteint sa branche v5. Le rythme annuel et le pipeline des future flags font que la prochaine majeure devrait ressembler beaucoup à celle-ci : la plupart des ruptures auront déjà été livrées dans une mineure de v8, et la v9 se contentera essentiellement de basculer les valeurs par défaut.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

Oxc v0.134 : oxlint v1.68 Ajoute des Règles Vue et des Contrôles TypeScript Accessor
frameworks

Oxc v0.134 : oxlint v1.68 Ajoute des Règles Vue et des Contrôles TypeScript Accessor

La version de juin d'Oxc publie oxlint v1.68.0 avec deux nouvelles règles Vue, une règle lint method-signature-style pour TypeScript, et des améliorations du parser pour rejecter les déclarations en contexte ambient.
SWC v1.15.26 : le compilateur JavaScript propulsé par Rust continue d'avancer
frameworks

SWC v1.15.26 : le compilateur JavaScript propulsé par Rust continue d'avancer

Le compilateur JavaScript/TypeScript écrit en Rust publié par swc-project sort la v1.15.26 avec des corrections de bugs, des améliorations de performance et une intégration toujours plus profonde dans l'écosystème Node.js.
JetBrains Ouvrir le Coffre : JavaScript et TypeScript Disponibles Gratuitement dans IntelliJ IDEA
frameworks

JetBrains Ouvrir le Coffre : JavaScript et TypeScript Disponibles Gratuitement dans IntelliJ IDEA

Depuis mars 2026, IntelliJ IDEA v2026.1 intègre gratuitement les fonctionnalités JavaScript, TypeScript, HTML, CSS et React basique, auparavant réservées à l'abonnement Ultimate payant. Nuance : Angular, Vue et le débogage avancé restent payants.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

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