Should I upgrade to React Router 6 to 7 Migration with Node 20 Floor and Framework Mode Changes now?
Teams on React Router 6 need to decide whether to move to v7 now, defer until runtime prerequisites are met, or use the upgrade as the point to adopt React Router's framework features.
Blockers
- requires_version: package/react-router-7 → runtime/nodejs-20
- requires_version: package/react-router-7 → package/react-18
- requires_version: package/react-router-7 → package/react-dom-18
- Official prerequisites include Node.js 20+ when using Node as the runtime.
- Official prerequisites for the framework plugin path include Vite 5+.
Who this is for
- small-team
- monorepo
Candidates
Stay on latest v6.x first and enable all v7 future flags
As of 2026-03-30, the React Router docs list v6.30.3 for the v6 line and say the v7 upgrade has no breaking changes if all future flags are already enabled. The official v6 upgrade guide explicitly recommends updating to the latest v6.x first so you get the latest future flags and console warnings. React Router v7 requires Node 20, React 18, and React DOM 18, so this path is the lowest-risk choice if your fleet is not yet on that floor. It also lets you absorb behavior changes such as relative splat routing, transition handling, fetcher persistence, form method normalization, partial hydration, and action error revalidation before the package swap.
When to choose
Use this when your main blocker is environment readiness, especially if CI, hosting, or internal tooling is still pinned below Node 20. The decisive factor is whether you want to de-risk the migration incrementally before touching package names and removed APIs.
Tradeoffs
Lowest immediate churn and easiest rollback path, but you stay on the older package layout and delay the consolidated v7 package model.
Cautions
Do not treat this as zero-work. The v6 future flags can require route-tree changes, relative link updates under splat routes, and cleanup of incorrect in-component React.lazy usage before the eventual v7 cutover.
Upgrade to v7 now but stay in library or data mode
As of 2026-03-30, the official docs list React Router 7.13.2 as latest. In v7, the project collapses `react-router-dom`, `@remix-run/react`, `@remix-run/server-runtime`, and `@remix-run/router` into `react-router`; `react-router-dom` is still published as a re-export to ease migration, but the v6 upgrade guide says you only need `react-router` in `package.json`. The v7 changelog also documents removed APIs including `json`, `defer`, and several unstable upload helpers, plus the removal of `installGlobals` because v7 now assumes a modern runtime with native fetch support. DOM-specific imports such as `RouterProvider` and `HydratedRouter` move to `react-router/dom`.
When to choose
Use this when you can already standardize on Node 20 and React 18, but you do not want the structural migration cost of framework mode. The decisive factor is that you want the supported v7 package layout and can handle import and API cleanup now.
Tradeoffs
You get the package consolidation immediately and stay close to the official current line, but you take import churn, API removals, and runtime-floor enforcement in one move.
Cautions
Common runtime-agnostic APIs should now come from `react-router`, while runtime-specific APIs stay in adapter packages such as `@react-router/node`. If you rely on `json`, `defer`, or old adapter re-exports, you need code changes before the upgrade is complete.
Use the v7 migration to adopt framework mode with the Vite plugin
React Router v7 is positioned as a multi-strategy router that can be used as a full React framework, not just a routing library. As of 2026-03-30, the framework installation and adoption docs describe `create-react-router`, the `@react-router/dev` Vite plugin, route modules, automatic route code-splitting, optional static pre-rendering, and optional server rendering. The framework adoption guide says the plugin adds loaders, actions, automatic data revalidation, type-safe route modules, and automatic scroll restoration. Official prerequisites for the framework plugin path include Node.js 20+ when using Node as the runtime and Vite 5+.
When to choose
Use this when you already need file-based route structure, route-module conventions, generated types, or a path to SSR and pre-rendering. The decisive factor is whether you want framework capabilities badly enough to accept a larger app-shape migration now.
Tradeoffs
This gives the biggest long-term platform shift and the most first-party features, but it has the highest migration cost because it changes build tooling, entry points, config files, and route organization.
Cautions
The adoption guide explicitly says the initial setup requires the most work. In framework mode, the changelog also notes lazy route discovery behavior around manifest mismatches after deploys, which can trigger document reloads for undiscovered routes during active sessions.
Try with your AI agent
$ npm install -g pocketlantern $ pocketlantern init # Restart Claude Code, Cursor, or your MCP client, then ask: # "Should I upgrade to React Router 6 to 7 Migration with Node 20 Floor and Framework Mode Changes now?"