From 6532f13a556384d699cf63978161f0b1e9d1f5da Mon Sep 17 00:00:00 2001 From: James Opstad <13586373+jamesopstad@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:20:24 +0100 Subject: [PATCH 1/2] Use getOptimizeDepsEntries for server environment --- .../vite/optimize-deps-entries.ts | 10 ++++++---- packages/react-router-dev/vite/plugin.ts | 20 +++++++------------ packages/react-router-dev/vite/rsc/plugin.ts | 3 ++- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/packages/react-router-dev/vite/optimize-deps-entries.ts b/packages/react-router-dev/vite/optimize-deps-entries.ts index 50e840369b..66bd466d6f 100644 --- a/packages/react-router-dev/vite/optimize-deps-entries.ts +++ b/packages/react-router-dev/vite/optimize-deps-entries.ts @@ -4,13 +4,15 @@ import { resolveRelativeRouteFilePath } from "./resolve-relative-route-file-path import { getVite } from "./vite"; export function getOptimizeDepsEntries({ - entryClientFilePath, + entryFilePath, reactRouterConfig, + isClientEnvironment, }: { - entryClientFilePath: string; + entryFilePath: string; reactRouterConfig: ResolvedReactRouterConfig; + isClientEnvironment: boolean; }) { - if (!reactRouterConfig.future.unstable_optimizeDeps) { + if (isClientEnvironment && !reactRouterConfig.future.unstable_optimizeDeps) { return []; } @@ -18,7 +20,7 @@ export function getOptimizeDepsEntries({ const viteMajorVersion = parseInt(vite.version.split(".")[0], 10); return [ - vite.normalizePath(entryClientFilePath), + vite.normalizePath(entryFilePath), ...Object.values(reactRouterConfig.routes).map((route) => resolveRelativeRouteFilePath(route, reactRouterConfig), ), diff --git a/packages/react-router-dev/vite/plugin.ts b/packages/react-router-dev/vite/plugin.ts index 81cd7e0bb3..4883a71b73 100644 --- a/packages/react-router-dev/vite/plugin.ts +++ b/packages/react-router-dev/vite/plugin.ts @@ -1321,8 +1321,9 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { }, optimizeDeps: { entries: getOptimizeDepsEntries({ - entryClientFilePath: ctx.entryClientFilePath, + entryFilePath: ctx.entryClientFilePath, reactRouterConfig: ctx.reactRouterConfig, + isClientEnvironment: true, }), include: [ // Pre-bundle React dependencies to avoid React duplicates, @@ -1437,8 +1438,6 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { ? isSsrBundleEnvironmentName(name) : name === "ssr") ) { - const vite = getVite(); - return { resolve: { external: @@ -1453,16 +1452,11 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { optimizeDeps: options.optimizeDeps?.noDiscovery === false ? { - entries: [ - vite.normalizePath(ctx.entryServerFilePath), - ...Object.values(ctx.reactRouterConfig.routes).map( - (route) => - resolveRelativeRouteFilePath( - route, - ctx.reactRouterConfig, - ), - ), - ], + entries: getOptimizeDepsEntries({ + entryFilePath: ctx.entryServerFilePath, + reactRouterConfig: ctx.reactRouterConfig, + isClientEnvironment: false, + }), include: [ "react", "react/jsx-dev-runtime", diff --git a/packages/react-router-dev/vite/rsc/plugin.ts b/packages/react-router-dev/vite/rsc/plugin.ts index 73510358dc..a6a5ffcabf 100644 --- a/packages/react-router-dev/vite/rsc/plugin.ts +++ b/packages/react-router-dev/vite/rsc/plugin.ts @@ -132,8 +132,9 @@ export function reactRouterRSCVitePlugin(): Vite.PluginOption[] { }, optimizeDeps: { entries: getOptimizeDepsEntries({ - entryClientFilePath: defaultEntries.client, + entryFilePath: defaultEntries.client, reactRouterConfig: config, + isClientEnvironment: true, }), esbuildOptions: { jsx: "automatic", From 3c80252aecc25f324ca6803d07eb297984873035 Mon Sep 17 00:00:00 2001 From: James Opstad <13586373+jamesopstad@users.noreply.github.com> Date: Mon, 17 Nov 2025 11:57:26 +0000 Subject: [PATCH 2/2] Add changeset --- .changeset/silver-hotels-raise.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silver-hotels-raise.md diff --git a/.changeset/silver-hotels-raise.md b/.changeset/silver-hotels-raise.md new file mode 100644 index 0000000000..9f8a263b08 --- /dev/null +++ b/.changeset/silver-hotels-raise.md @@ -0,0 +1,5 @@ +--- +"@react-router/dev": patch +--- + +Ensure paths passed to `optimizeDeps.entries` are escaped in the ssr environment