---
title: "React Router v8 promeut ses Future Flags en valeurs par défaut, passe en ESM uniquement et abandonne `react-router-dom`"
description: "React Router v8.0.0 (17 juin 2026) est la première version majeure sous le modèle de gouvernance ouverte (Open Governance) du projet et la première d'un rythme annuel planifié. Chaque indicateur `future.v8_*` de la v7 devient la valeur par défaut (middleware toujours activé, requêtes pass-through, API Vite Environment, découpage des modules de route), la base minimale passe à Node 22.22+, React 19.2.7+ et Vite 7+, tous les paquets sont publiés en ESM uniquement avec une cible ES2022, `react-router-dom` est supprimé, et les adaptateurs Node basculent vers un serveur fetch maintenu par Remix tandis que `create-react-router` abandonne son polyfill fetch pour le `fetch` natif."
date: 2026-06-19
image: "/images/heroes/2026-06-19--react-router-v8-major-release-future-flags-esm.png"
author: lschvn
tags: ["frameworks", "tooling", "typescript"]
tldr:
  - "React Router v8.0.0 est sorti le 17 juin 2026, suivi d'un correctif v8.0.1 le 18. 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é, calé sur la fin de vie de Node 20 et visant la v9 pour environ mai 2027, conjointement avec la fin de vie de Node 22. La stratégie de développement des API promeut chaque indicateur `future.v8_*` en valeur par défaut, donc les applications qui avaient adopté ces indicateurs en v7 ne constatent presque aucun changement d'API."
  - "La base minimale monte à Node 22.22.0+, React 19.2.7+ et Vite 7+. Tous les paquets publiés sont désormais en ESM uniquement, avec les champs `target`/`lib` du tsconfig passés de ES2020 à ES2022. `react-router-dom` est supprimé (importez depuis `react-router` et `react-router/dom`), les champs `data` dépréciés de `meta` disparaissent au profit de `loaderData`, et le proxy de développement Cloudflare ainsi que le champ interne `hasErrorBoundary` sont abandonnés."
  - "Le middleware est désormais toujours activé, ce qui signifie que `context` est toujours une instance de `RouterContextProvider` et que `getLoadContext` doit en retourner une plutôt qu'un objet simple. Les adaptateurs `node` et `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, ce qui supprime discrètement la prise en charge de `HTTPS_PROXY`. Le build des paquets est passé de `tsup` à `tsdown` sur TypeScript 6."
faq:
  - question: "La mise à jour vers React Router v8 est-elle un changement cassant ?"
    answer: "Seulement si vous avez ignoré les future flags de la v7. La stratégie de développement des API de React Router publie d'abord les changements cassants derrière des indicateurs `future.v8_*`, donc les applications qui avaient adopté tous les indicateurs actifs en v7 ne constatent presque aucun changement de surface d'API en v8, puisque ces indicateurs sont supprimés (ou promus en configuration de premier niveau) et que leur comportement devient la valeur par défaut. Les ruptures inconditionnelles sont les élévations de base minimale (Node 22.22+, React 19.2.7+, Vite 7+), la suppression de `react-router-dom`, la suppression des champs `data` dépréciés de `meta` au profit de `loaderData`, et le contrat du middleware toujours activé où `getLoadContext` doit retourner un `RouterContextProvider` au lieu d'un objet simple."
  - question: "Pourquoi React Router v8 requiert-il Node 22.22, React 19.2.7 et Vite 7 ?"
    answer: "La v8 fixe une nouvelle politique de base minimale : elle prend en charge toutes les versions Active LTS de Node ainsi que uniquement la dernière branche mineure de Maintenance LTS, ce qui permet au projet d'adopter les fonctionnalités Active LTS rétroportées et de relever rapidement le plancher Maintenance LTS quand un correctif de sécurité paraît. Node 22.22+ est ce plancher au lancement, calé sur la fin de vie de Node 20 ; le projet planifie la v9 autour de mai 2027 pour suivre la fin de vie de Node 22. React 19.2.7+ et Vite 7+ sont requis parce que la v8 utilise inconditionnellement l'API Vite Environment (auparavant un indicateur) et cible une version moderne de React."
  - question: "Qu'est devenu `react-router-dom` en v8 ?"
    answer: "Il est supprimé. 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 faciliter la migration de v6 vers v7. En v8, la couche disparaît, donc toute importation restante de `react-router-dom` doit être déplacée : `RouterProvider` et `HydratedRouter` proviennent de `react-router/dom`, et tout le reste de `react-router`."
  - question: "React Router v8 est-il en ESM uniquement ?"
    answer: "Oui. Les paquets publiés sous `packages/` ont été basculés en ESM uniquement, et les champs `target`/`lib` du tsconfig ont été passés de ES2020 à ES2022 partout. Le fait d'être en ESM uniquement est aussi ce qui a permis les réécritures d'adaptateurs : `@react-router/node` et `@react-router/serve` ont pu abandonner `@mjackson/node-fetch-server` pour `@remix-run/node-fetch-server`, et `create-react-router` a pu abandonner `@remix-run/web-fetch` pour le `fetch` natif de Node."
  - question: "Que signifie le fait que le middleware soit toujours activé en v8 ?"
    answer: "L'indicateur `future.v8_middleware` est supprimé et le middleware s'exécute inconditionnellement. Le `context` passé à `loader`, `action` et `middleware` est toujours une instance de `RouterContextProvider`, donc `getLoadContext` dans un serveur personnalisé doit retourner un `RouterContextProvider` plutôt qu'un objet simple. Le type `MiddlewareEnabled` (auparavant `UNSAFE_MiddlewareEnabled`) et l'astuce d'augmentation de module `interface Future { v8_middleware: true }` pour typer `context` en Data Mode ne sont plus nécessaires."
---

[React Router v8.0.0](https://github.com/remix-run/react-router/releases/tag/react-router%408.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](https://remix.run/blog/rr-governance) 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](https://nodejs.org/en/about/previous-releases) 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](https://reactrouter.com/upgrading/v7), 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+](/articles/2026-06-15--vite-8-1-beta-wasm-esm-chunk-importmap) 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](/articles/2026-06-18--node-js-june-2026-security-releases)) 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`](https://github.com/remix-run/react-router/pull/15076). 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](https://github.com/remix-run/react-router/pull/14931)). Le proxy de développement Cloudflare à `@react-router/dev/vite/cloudflare` est supprimé au profit de [`@cloudflare/vite-plugin`](https://developers.cloudflare.com/workers/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](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/releases/tag/react-router%407.18.0) 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](https://github.com/remix-run/react-router/pull/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](/articles/2026-04-06--nuxt-4-4-vue-router-v5-typed-layout-props-28x-faster-dev-routing). 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.
