This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to release-next, this PR will be updated.
Releases
react-router@7.0.0
Major Changes
Remove the original defer implementation in favor of using raw promises via single fetch and turbo-stream. This removes these exports from React Router: (#11744)
defer
AbortedDeferredError
type TypedDeferredData
UNSAFE_DeferredData
UNSAFE_DEFERRED_SYMBOL,
Collapse @remix-run/router into react-router (#11505)
Collapse react-router-dom into react-router
Collapse @remix-run/server-runtime into react-router
Expose the underlying router promises from the following APIs for compsition in React 19 APIs: (#11521)
useNavigate()
useSubmit
useFetcher().load
useFetcher().submit
useRevalidator.revalidate
Remove future.v7_normalizeFormMethod future flag (#11697)
For Remix consumers migrating to React Router, the crypto global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided from react-router rather than platform-specific packages: (#11837)
PrefetchPageDescriptor replaced by PageLinkDescriptor (#11960)
Consolidate types previously duplicated across @remix-run/router, @remix-run/server-runtime, and @remix-run/react now that they all live in react-router (#12177)
rename createRemixStub to createRoutesStub (#11692)
Remove @remix-run/router deprecated detectErrorBoundary option in favor of mapRouteProperties (#11751)
Add react-router/dom subpath export to properly enable react-dom as an optional peerDependency (#11851)
This ensures that we don't blindly import ReactDOM from "react-dom" in <RouterProvider> in order to access ReactDOM.flushSync(), since that would break createMemoryRouter use cases in non-DOM environments
DOM environments should import from react-router/dom to get the proper component that makes ReactDOM.flushSync() available:
If you are using the Vite plugin, use this in your entry.client.tsx:
import { HydratedRouter } from 'react-router/dom'
If you are not using the Vite plugin and are manually calling createBrowserRouter/createHashRouter:
Update cookie dependency to ^1.0.1 - please see the release notes for any breaking changes (#12172)
Minor Changes
Add support for prerender config in the React Router vite plugin, to support existing SSG use-cases (#11539)
You can use the prerender config to pre-render your .html and .data files at build time and then serve them statically at runtime (either from a running server or a CDN)
prerender can either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.
// react-router.config.ts
import type { Config } from "@react-router/dev/config";
export default {
async prerender() {
let slugs = await fakeGetSlugsFromCms();
// Prerender these paths into `.html` files at build time, and `.data`
// files if they have loaders
return ["/", "/about", ...slugs.map((slug) => `/product/${slug}`)];
},
} satisfies Config;
async function fakeGetSlugsFromCms() {
await new Promise((r) => setTimeout(r, 1000));
return ["shirt", "hat"];
}
[REMOVE] Allow returning undefined from loaders/actions part 2 (#12057)
This is a follow up to #11680 which missed some of the Remix codepaths
Params, loader data, and action data as props for route component exports (#11961)
export default function Component({ params, loaderData, actionData }) {}
export function HydrateFallback({ params }) {}
export function ErrorBoundary({ params, loaderData, actionData }) {}
React Router now generates types for each of your route modules.
You can access those types by importing them from ./+types.<route filename without extension>.
For example:
// app/routes/product.tsx
import type * as Route from "./+types.product";
export function loader({ params }: Route.LoaderArgs) {}
export default function Component({ loaderData }: Route.ComponentProps) {}
This initial implementation targets type inference for:
Params : Path parameters from your routing config in routes.ts including file-based routing
LoaderData : Loader data from loader and/or clientLoader within your route module
ActionData : Action data from action and/or clientAction within your route module
In the future, we plan to add types for the rest of the route module exports: meta, links, headers, shouldRevalidate, etc.
We also plan to generate types for typesafe Links:
<Link to="/products/:id" params={{ id: 1 }} />
// ^^^^^^^^^^^^^ ^^^^^^^^^
// typesafe `to` and `params` based on the available routes in your app
[PRERELEASE] Fix typegen for routes with a client loader but no server loader (#12117)
Remove unneeded dependency on @web3-storage/multipart-parser (#12274)
Fix redirects returned from loaders/actions using data() (#12021)
[PRERELEASE] Fix react-router-serve handling of prerendered HTML files by removing the redirect: false option so it now falls back on the default redirect: true behavior of redirecting from /folder -> /folder/ which will then pick up /folder/index.html from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)
[PRERELEASE] Proxy prerendered loader data into prerender pass for HTML files to avoid double-invocations of the loader at build time
fix(react-router): (v7) fix static prerender of non-ascii characters (#12161)
For Remix consumers migrating to React Router, the crypto global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided from react-router rather than platform-specific packages: (#11837)
Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
Patch Changes
Updated dependencies:
react-router@7.0.0
@react-router/node@7.0.0
@react-router/cloudflare@7.0.0
Major Changes
For Remix consumers migrating to React Router, all exports from @remix-run/cloudflare-pages are now provided for React Router consumers in the @react-router/cloudflare package. There is no longer a separate package for Cloudflare Pages. (#11801)
For Remix consumers migrating to React Router, the crypto global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided from react-router rather than platform-specific packages: (#11837)
Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
Minor Changes
The @remix-run/cloudflare-workers package has been deprecated. Remix consumers migrating to React Router should use the @react-router/cloudflare package directly. For guidance on how to use @react-router/cloudflare within a Cloudflare Workers context, refer to the Cloudflare Workers template. (#11801)
Patch Changes
Updated dependencies:
react-router@7.0.0
@react-router/dev@7.0.0
Major Changes
For Remix consumers migrating to React Router, the vitePlugin and cloudflareDevProxyVitePlugin exports have been renamed and moved. (#11904)
-import {
- vitePlugin as remix,
- cloudflareDevProxyVitePlugin,
-} from "@remix/dev";
+import { reactRouter } from "@react-router/dev/vite";
+import { cloudflareDevProxy } from "@react-router/dev/vite/cloudflare";
node package no longer re-exports from react-router (#11702)
For Remix consumers migrating to React Router who used the Vite plugin's buildEnd hook, the resolved reactRouterConfig object no longer contains a publicPath property since this belongs to Vite, not React Router. (#11575)
For Remix consumers migrating to React Router, the Vite plugin's manifest option has been removed. (#11573)
The manifest option been superseded by the more powerful buildEnd hook since it's passed the buildManifest argument. You can still write the build manifest to disk if needed, but you'll most likely find it more convenient to write any logic depending on the build manifest within the buildEnd hook itself.
If you were using the manifest option, you can replace it with a buildEnd hook that writes the manifest to disk like this:
Consolidate types previously duplicated across @remix-run/router, @remix-run/server-runtime, and @remix-run/react now that they all live in react-router (#12177)
Removed AppData type in favor of inlining unknown in the few locations it was used
Removed ServerRuntimeMeta* types in favor of the Meta* types they were duplicated from
Update default isbot version to v5 and drop support for isbot@3 (#11770)
If you have isbot@4 or isbot@5 in your package.json:
You do not need to make any changes
If you have isbot@3 in your package.json and you have your own entry.server.tsx file in your repo
You do not need to make any changes
You can upgrade to isbot@5 independent of the React Router v7 upgrade
If you have isbot@3 in your package.json and you do not have your own entry.server.tsx file in your repo
You are using the internal default entry provided by React Router v7 and you will need to upgrade to isbot@5 in your package.json
Drop support for Node 18, update minimum Node vestion to 20 (#12171)
Remove installGlobals() as this should no longer be necessary
For Remix consumers migrating to React Router, Vite manifests (i.e. .vite/manifest.json) are now written within each build subdirectory, e.g. build/client/.vite/manifest.json and build/server/.vite/manifest.json instead of build/.vite/client-manifest.json and build/.vite/server-manifest.json. This means that the build output is now much closer to what you'd expect from a typical Vite project. (#11573)
Originally the Remix Vite plugin moved all Vite manifests to a root-level build/.vite directory to avoid accidentally serving them in production, particularly from the client build. This was later improved with additional logic that deleted these Vite manifest files at the end of the build process unless Vite's build.manifest had been enabled within the app's Vite config. This greatly reduced the risk of accidentally serving the Vite manifests in production since they're only present when explicitly asked for. As a result, we can now assume that consumers will know that they need to manage these additional files themselves, and React Router can safely generate a more standard Vite build output.
Minor Changes
Params, loader data, and action data as props for route component exports (#11961)
export default function Component({ params, loaderData, actionData }) {}
export function HydrateFallback({ params }) {}
export function ErrorBoundary({ params, loaderData, actionData }) {}
React Router now generates types for each of your route modules.
You can access those types by importing them from ./+types.<route filename without extension>.
For example:
// app/routes/product.tsx
import type * as Route from "./+types.product";
export function loader({ params }: Route.LoaderArgs) {}
export default function Component({ loaderData }: Route.ComponentProps) {}
This initial implementation targets type inference for:
Params : Path parameters from your routing config in routes.ts including file-based routing
LoaderData : Loader data from loader and/or clientLoader within your route module
ActionData : Action data from action and/or clientAction within your route module
In the future, we plan to add types for the rest of the route module exports: meta, links, headers, shouldRevalidate, etc.
We also plan to generate types for typesafe Links:
<Link to="/products/:id" params={{ id: 1 }} />
// ^^^^^^^^^^^^^ ^^^^^^^^^
// typesafe `to` and `params` based on the available routes in your app
chore: warn instead of error for min node version in CLI (#12270)
chore: re-enable development warnings through a development exports condition. (#12269)
include root "react-dom" module for optimization (#12060)
[PRERELEASE] Fix react-router-serve handling of prerendered HTML files by removing the redirect: false option so it now falls back on the default redirect: true behavior of redirecting from /folder -> /folder/ which will then pick up /folder/index.html from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)
[PRERELEASE] Proxy prerendered loader data into prerender pass for HTML files to avoid double-invocations of the loader at build time
resolve config directory relative to flat output file structure (#12187)
if we are in SAP mode, always render the index.html for hydration (#12268)
fix(react-router): (v7) fix static prerender of non-ascii characters (#12161)
Updated dependencies:
react-router@7.0.0
@react-router/serve@7.0.0
@react-router/node@7.0.0
react-router-dom@7.0.0
Major Changes
Remove the original defer implementation in favor of using raw promises via single fetch and turbo-stream. This removes these exports from React Router: (#11744)
defer
AbortedDeferredError
type TypedDeferredData
UNSAFE_DeferredData
UNSAFE_DEFERRED_SYMBOL,
Use createRemixRouter/RouterProvider in entry.client instead of RemixBrowser (#11469)
Add prefetching support to Link/NavLink when using Remix SSR (#11402)
Enhance ScrollRestoration so it can restore properly on an SSR'd document load (#11401)
Add built-in Remix-style hydration support to RouterProvider. When running from a Remix-SSR'd HTML payload with the proper window variables (__remixContext, __remixManifest, __remixRouteModules), you don't need to pass a router prop and RouterProvider will create the router for you internally. (#11396) (#11400)
Patch Changes
Memoize some RouterProvider internals to reduce uneccesary re-renders (#11817)
For Remix consumers migrating to React Router, the crypto global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided from react-router rather than platform-specific packages: (#11837)
node package no longer re-exports from react-router (#11702)
Patch Changes
[PRERELEASE] Fix react-router-serve handling of prerendered HTML files by removing the redirect: false option so it now falls back on the default redirect: true behavior of redirecting from /folder -> /folder/ which will then pick up /folder/index.html from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)
[PRERELEASE] Proxy prerendered loader data into prerender pass for HTML files to avoid double-invocations of the loader at build time
Update express.static configurations to support prerendering (#11547)
Assets in the build/client/assets folder are served as before, with a 1-year immutable Cache-Control header
Static files outside of assets, such as pre-rendered .html and .data files are not served with a specific Cache-Control header
.data files are served with Content-Type: text/x-turbo
For some reason, when adding this via express.static, it seems to also add a Cache-Control: public, max-age=0 to .data files
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to release-next, this PR will be updated.
Releases
react-router@7.0.0
Major Changes
Remove the original
defer
implementation in favor of using raw promises via single fetch andturbo-stream
. This removes these exports from React Router: (#11744)defer
AbortedDeferredError
type TypedDeferredData
UNSAFE_DeferredData
UNSAFE_DEFERRED_SYMBOL
,@remix-run/router
intoreact-router
(#11505)react-router-dom
intoreact-router
@remix-run/server-runtime
intoreact-router
@remix-run/testing
intoreact-router
Remove single_fetch future flag. (#11522)
Drop support for Node 16, React Router SSR now requires Node 18 or higher (#11391)
Remove
future.v7_startTransition
flag (#11696)useNavigate()
useSubmit
useFetcher().load
useFetcher().submit
useRevalidator.revalidate
Remove
future.v7_normalizeFormMethod
future flag (#11697)For Remix consumers migrating to React Router, the
crypto
global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-router
rather than platform-specific packages: (#11837)createCookie
createCookieSessionStorage
createMemorySessionStorage
createSessionStorage
For consumers running older versions of Node, the
installGlobals
function from@remix-run/node
has been updated to defineglobalThis.crypto
, using Node'srequire('node:crypto').webcrypto
implementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
Imports/Exports cleanup (#11840)
@remix-run/router
AgnosticDataIndexRouteObject
AgnosticDataNonIndexRouteObject
AgnosticDataRouteMatch
AgnosticDataRouteObject
AgnosticIndexRouteObject
AgnosticNonIndexRouteObject
AgnosticRouteMatch
AgnosticRouteObject
TrackedPromise
unstable_AgnosticPatchRoutesOnMissFunction
Action
-> exported asNavigationType
viareact-router
Router
exported asDataRouter
to differentiate from RR's<Router>
getToPathname
(@private
)joinPaths
(@private
)normalizePathname
(@private
)resolveTo
(@private
)stripBasename
(@private
)createBrowserHistory
-> in favor ofcreateBrowserRouter
createHashHistory
-> in favor ofcreateHashRouter
createMemoryHistory
-> in favor ofcreateMemoryRouter
createRouter
createStaticHandler
-> in favor of wrappercreateStaticHandler
in RR DomgetStaticContextFromError
react-router
Hash
Pathname
Search
update minimum node version to 18 (#11690)
Remove
future.v7_prependBasename
from the ionternalized@remix-run/router
package (#11726)Migrate Remix type generics to React Router (#12180)
Route.*
typesRoute.*
typesuseFetcher
previously had an optional generic (used primarily by Remix v2) that expected the data typetypeof loader
/typeof action
)useFetcher<LoaderData>()
useFetcher<typeof loader>()
Remove
future.v7_throwAbortReason
from internalized@remix-run/router
package (#11728)Add
exports
field to all packages (#11675)node package no longer re-exports from react-router (#11702)
renamed RemixContext to FrameworkContext (#11705)
updates the minimum React version to 18 (#11689)
PrefetchPageDescriptor replaced by PageLinkDescriptor (#11960)
@remix-run/router
,@remix-run/server-runtime
, and@remix-run/react
now that they all live inreact-router
(#12177)LoaderFunction
,LoaderFunctionArgs
,ActionFunction
,ActionFunctionArgs
,DataFunctionArgs
,RouteManifest
,LinksFunction
,Route
,EntryRoute
RouteManifest
type used by the "remix" code is now slightly stricter because it is using the former@remix-run/router
RouteManifest
Record<string, Route> -> Record<string, Route | undefined>
AppData
type in favor of inliningunknown
in the few locations it was usedServerRuntimeMeta*
types in favor of theMeta*
types they were duplicated fromfuture.v7_partialHydration
flag (#11725)<RouterProvider fallbackElement>
propfallbackElement
to ahydrateFallbackElement
/HydrateFallback
on your root routefuture.v7_partialHydration
(when usingfallbackElement
),state.navigation
was populated during the initial loadfuture.v7_partialHydration
,state.navigation
remains in an"idle"
state during the initial loadRemove
v7_relativeSplatPath
future flag (#11695)Drop support for Node 18, update minimum Node vestion to 20 (#12171)
installGlobals()
as this should no longer be necessaryRemove remaining future flags (#11820)
v7_skipActionErrorRevalidation
v3_fetcherPersist
,v3_relativeSplatPath
,v3_throwAbortReason
rename createRemixStub to createRoutesStub (#11692)
Remove
@remix-run/router
deprecateddetectErrorBoundary
option in favor ofmapRouteProperties
(#11751)Add
react-router/dom
subpath export to properly enablereact-dom
as an optionalpeerDependency
(#11851)import ReactDOM from "react-dom"
in<RouterProvider>
in order to accessReactDOM.flushSync()
, since that would breakcreateMemoryRouter
use cases in non-DOM environmentsreact-router/dom
to get the proper component that makesReactDOM.flushSync()
available:entry.client.tsx
:import { HydratedRouter } from 'react-router/dom'
createBrowserRouter
/createHashRouter
:import { RouterProvider } from "react-router/dom"
Remove
future.v7_fetcherPersist
flag (#11731)Update
cookie
dependency to^1.0.1
- please see the release notes for any breaking changes (#12172)Minor Changes
prerender
config in the React Router vite plugin, to support existing SSG use-cases (#11539)prerender
config to pre-render your.html
and.data
files at build time and then serve them statically at runtime (either from a running server or a CDN)prerender
can either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.[REMOVE] Allow returning undefined from loaders/actions part 2 (#12057)
Params, loader data, and action data as props for route component exports (#11961)
Remove duplicate
RouterProvider
impliementations (#11679)Typesafety improvements (#12019)
React Router now generates types for each of your route modules. You can access those types by importing them from
./+types.<route filename without extension>
. For example:This initial implementation targets type inference for:
Params
: Path parameters from your routing config inroutes.ts
including file-based routingLoaderData
: Loader data fromloader
and/orclientLoader
within your route moduleActionData
: Action data fromaction
and/orclientAction
within your route moduleIn the future, we plan to add types for the rest of the route module exports:
meta
,links
,headers
,shouldRevalidate
, etc. We also plan to generate types for typesafeLink
s:Check out our docs for more:
Stabilize
unstable_dataStrategy
(#11969)Stabilize
unstable_patchRoutesOnNavigation
(#11970)Patch Changes
No changes (
506329c4e
)[REMOVE] Changeset to bump pre.4 release (#11871)
chore: re-enable development warnings through a
development
exports condition. (#12269)Remove unstable upload handler. (#12015)
[PRERELEASE] Fix typegen for routes with a client loader but no server loader (#12117)
Remove unneeded dependency on @web3-storage/multipart-parser (#12274)
Fix redirects returned from loaders/actions using
data()
(#12021)react-router-serve
handling of prerendered HTML files by removing theredirect: false
option so it now falls back on the defaultredirect: true
behavior of redirecting from/folder
->/folder/
which will then pick up/folder/index.html
from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)fix(react-router): (v7) fix static prerender of non-ascii characters (#12161)
[REMOVE] Rename RemixRouter->DataRouter (#12062)
Replace
substr
withsubstring
(#12080)Remove the deprecated
json
utility (#12146)Response.json
if you still need to construct JSON responses in your appRemove unneeded dependency on source-map (#12275)
@react-router/architect@7.0.0
Major Changes
For Remix consumers migrating to React Router, the
crypto
global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-router
rather than platform-specific packages: (#11837)createCookie
createCookieSessionStorage
createMemorySessionStorage
createSessionStorage
For consumers running older versions of Node, the
installGlobals
function from@remix-run/node
has been updated to defineglobalThis.crypto
, using Node'srequire('node:crypto').webcrypto
implementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
Patch Changes
react-router@7.0.0
@react-router/node@7.0.0
@react-router/cloudflare@7.0.0
Major Changes
@remix-run/cloudflare-pages
are now provided for React Router consumers in the@react-router/cloudflare
package. There is no longer a separate package for Cloudflare Pages. (#11801)For Remix consumers migrating to React Router, the
crypto
global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-router
rather than platform-specific packages: (#11837)createCookie
createCookieSessionStorage
createMemorySessionStorage
createSessionStorage
For consumers running older versions of Node, the
installGlobals
function from@remix-run/node
has been updated to defineglobalThis.crypto
, using Node'srequire('node:crypto').webcrypto
implementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
Minor Changes
@remix-run/cloudflare-workers
package has been deprecated. Remix consumers migrating to React Router should use the@react-router/cloudflare
package directly. For guidance on how to use@react-router/cloudflare
within a Cloudflare Workers context, refer to the Cloudflare Workers template. (#11801)Patch Changes
react-router@7.0.0
@react-router/dev@7.0.0
Major Changes
For Remix consumers migrating to React Router, the
vitePlugin
andcloudflareDevProxyVitePlugin
exports have been renamed and moved. (#11904)Remove single_fetch future flag. (#11522)
update minimum node version to 18 (#11690)
Add
exports
field to all packages (#11675)node package no longer re-exports from react-router (#11702)
For Remix consumers migrating to React Router who used the Vite plugin's
buildEnd
hook, the resolvedreactRouterConfig
object no longer contains apublicPath
property since this belongs to Vite, not React Router. (#11575)For Remix consumers migrating to React Router, the Vite plugin's
manifest
option has been removed. (#11573)The
manifest
option been superseded by the more powerfulbuildEnd
hook since it's passed thebuildManifest
argument. You can still write the build manifest to disk if needed, but you'll most likely find it more convenient to write any logic depending on the build manifest within thebuildEnd
hook itself.If you were using the
manifest
option, you can replace it with abuildEnd
hook that writes the manifest to disk like this:@remix-run/router
,@remix-run/server-runtime
, and@remix-run/react
now that they all live inreact-router
(#12177)LoaderFunction
,LoaderFunctionArgs
,ActionFunction
,ActionFunctionArgs
,DataFunctionArgs
,RouteManifest
,LinksFunction
,Route
,EntryRoute
RouteManifest
type used by the "remix" code is now slightly stricter because it is using the former@remix-run/router
RouteManifest
Record<string, Route> -> Record<string, Route | undefined>
AppData
type in favor of inliningunknown
in the few locations it was usedServerRuntimeMeta*
types in favor of theMeta*
types they were duplicated fromUpdate default
isbot
version to v5 and drop support forisbot@3
(#11770)isbot@4
orisbot@5
in yourpackage.json
:isbot@3
in yourpackage.json
and you have your ownentry.server.tsx
file in your repoisbot@5
independent of the React Router v7 upgradeisbot@3
in yourpackage.json
and you do not have your ownentry.server.tsx
file in your repoisbot@5
in yourpackage.json
Drop support for Node 18, update minimum Node vestion to 20 (#12171)
installGlobals()
as this should no longer be necessaryFor Remix consumers migrating to React Router, Vite manifests (i.e.
.vite/manifest.json
) are now written within each build subdirectory, e.g.build/client/.vite/manifest.json
andbuild/server/.vite/manifest.json
instead ofbuild/.vite/client-manifest.json
andbuild/.vite/server-manifest.json
. This means that the build output is now much closer to what you'd expect from a typical Vite project. (#11573)Originally the Remix Vite plugin moved all Vite manifests to a root-level
build/.vite
directory to avoid accidentally serving them in production, particularly from the client build. This was later improved with additional logic that deleted these Vite manifest files at the end of the build process unless Vite'sbuild.manifest
had been enabled within the app's Vite config. This greatly reduced the risk of accidentally serving the Vite manifests in production since they're only present when explicitly asked for. As a result, we can now assume that consumers will know that they need to manage these additional files themselves, and React Router can safely generate a more standard Vite build output.Minor Changes
Params, loader data, and action data as props for route component exports (#11961)
Remove internal entry.server.spa.tsx implementation (#11681)
Add
prefix
route config helper to@react-router/dev/routes
(#12094)Typesafety improvements (#12019)
React Router now generates types for each of your route modules. You can access those types by importing them from
./+types.<route filename without extension>
. For example:This initial implementation targets type inference for:
Params
: Path parameters from your routing config inroutes.ts
including file-based routingLoaderData
: Loader data fromloader
and/orclientLoader
within your route moduleActionData
: Action data fromaction
and/orclientAction
within your route moduleIn the future, we plan to add types for the rest of the route module exports:
meta
,links
,headers
,shouldRevalidate
, etc. We also plan to generate types for typesafeLink
s:Check out our docs for more:
Patch Changes
development
exports condition. (#12269)react-router-serve
handling of prerendered HTML files by removing theredirect: false
option so it now falls back on the defaultredirect: true
behavior of redirecting from/folder
->/folder/
which will then pick up/folder/index.html
from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)index.html
for hydration (#12268)react-router@7.0.0
@react-router/serve@7.0.0
@react-router/node@7.0.0
react-router-dom@7.0.0
Major Changes
Remove the original
defer
implementation in favor of using raw promises via single fetch andturbo-stream
. This removes these exports from React Router: (#11744)defer
AbortedDeferredError
type TypedDeferredData
UNSAFE_DeferredData
UNSAFE_DEFERRED_SYMBOL
,Use
createRemixRouter
/RouterProvider
inentry.client
instead ofRemixBrowser
(#11469)Remove single_fetch future flag. (#11522)
Remove
future.v7_startTransition
flag (#11696)Remove
future.v7_normalizeFormMethod
future flag (#11697)Allow returning
undefined
from actions and loaders (#11680)update minimum node version to 18 (#11690)
Remove
future.v7_prependBasename
from the ionternalized@remix-run/router
package (#11726)Remove
future.v7_throwAbortReason
from internalized@remix-run/router
package (#11728)Add
exports
field to all packages (#11675)node package no longer re-exports from react-router (#11702)
updates the minimum React version to 18 (#11689)
future.v7_partialHydration
flag (#11725)<RouterProvider fallbackElement>
propfallbackElement
to ahydrateFallbackElement
/HydrateFallback
on your root routefuture.v7_partialHydration
(when usingfallbackElement
),state.navigation
was populated during the initial loadfuture.v7_partialHydration
,state.navigation
remains in an"idle"
state during the initial loadRemove
future.v7_fetcherPersist
flag (#11731)Minor Changes
Link
/NavLink
when using Remix SSR (#11402)ScrollRestoration
so it can restore properly on an SSR'd document load (#11401)RouterProvider
. When running from a Remix-SSR'd HTML payload with the properwindow
variables (__remixContext
,__remixManifest
,__remixRouteModules
), you don't need to pass arouter
prop andRouterProvider
will create therouter
for you internally. (#11396) (#11400)Patch Changes
RouterProvider
internals to reduce uneccesary re-renders (#11817)react-router@7.0.0
@react-router/express@7.0.0
Major Changes
exports
field to all packages (#11675)Drop support for Node 18, update minimum Node vestion to 20 (#12171)
installGlobals()
as this should no longer be necessaryPatch Changes
react-router@7.0.0
@react-router/node@7.0.0
@react-router/node@7.0.0
Major Changes
Remove single_fetch future flag. (#11522)
For Remix consumers migrating to React Router, the
crypto
global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided fromreact-router
rather than platform-specific packages: (#11837)createCookie
createCookieSessionStorage
createMemorySessionStorage
createSessionStorage
For consumers running older versions of Node, the
installGlobals
function from@remix-run/node
has been updated to defineglobalThis.crypto
, using Node'srequire('node:crypto').webcrypto
implementation.Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
createCookieFactory
createSessionStorageFactory
createCookieSessionStorageFactory
createMemorySessionStorageFactory
update minimum node version to 18 (#11690)
Add
exports
field to all packages (#11675)node package no longer re-exports from react-router (#11702)
Drop support for Node 18, update minimum Node vestion to 20 (#12171)
installGlobals()
as this should no longer be necessaryPatch Changes
react-router@7.0.0
@react-router/serve@7.0.0
Major Changes
exports
field to all packages (#11675)Patch Changes
react-router-serve
handling of prerendered HTML files by removing theredirect: false
option so it now falls back on the defaultredirect: true
behavior of redirecting from/folder
->/folder/
which will then pick up/folder/index.html
from disk. See https://expressjs.com/en/resources/middleware/serve-static.html (#12071)Update
express.static
configurations to support prerendering (#11547)build/client/assets
folder are served as before, with a 1-year immutableCache-Control
header.html
and.data
files are not served with a specificCache-Control
header.data
files are served withContent-Type: text/x-turbo
express.static
, it seems to also add aCache-Control: public, max-age=0
to.data
filesUpdated dependencies:
react-router@7.0.0
@react-router/express@7.0.0
@react-router/node@7.0.0
@react-router/fs-routes@7.0.0
Patch Changes
@react-router/dev@7.0.0
@react-router/remix-routes-option-adapter@7.0.0
Patch Changes
@react-router/dev@7.0.0
create-react-router@7.0.0