From 083e50777526ed729582a349f3d5c6550f25d794 Mon Sep 17 00:00:00 2001 From: SoonIter Date: Tue, 10 Feb 2026 18:01:29 +0800 Subject: [PATCH] chore: update --- packages/core/src/node/utils/reactAlias.ts | 32 +++++++++++++++---- .../core/src/runtime/ssrMdServerEntry.tsx | 6 ++-- packages/core/src/runtime/ssrServerEntry.tsx | 3 +- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/core/src/node/utils/reactAlias.ts b/packages/core/src/node/utils/reactAlias.ts index 48df3dbd06..9f54d4eea7 100644 --- a/packages/core/src/node/utils/reactAlias.ts +++ b/packages/core/src/node/utils/reactAlias.ts @@ -24,11 +24,11 @@ async function detectPackageMajorVersion( return undefined; } -export async function resolveReactRouterDomAlias(): Promise< - Record -> { - const hasInstalled = await detectPackageMajorVersion('react-router-dom'); - const basedir = hasInstalled ? process.cwd() : PACKAGE_ROOT; +export async function resolveReactRouterDomAlias(): Promise<{ + [key: string]: string; +}> { + const majorVersion = await detectPackageMajorVersion('react-router-dom'); + const basedir = majorVersion ? process.cwd() : PACKAGE_ROOT; const alias: Record = {}; const resolver = new Resolver({ @@ -49,8 +49,28 @@ export async function resolveReactRouterDomAlias(): Promise< if (!resolved.path) { throw Error(`'react-router-dom' resolved to empty path`); } + + const routerDomDir = path.dirname(resolved.path); + + // In react-router-dom v6, StaticRouter is exported from + // 'react-router-dom/server', not the main entry. For SSR environments, + // we create a shim that re-exports everything from the main entry plus + // StaticRouter from the server subpath. + if (majorVersion && majorVersion < 7) { + const serverMjsPath = path.join(routerDomDir, 'server.mjs'); + const hasServerMjs = await pathExists(serverMjsPath); + + if (hasServerMjs) { + return { + 'react-router-dom': routerDomDir, + REACT_ROUTER_DOM_SERVER: path.join(routerDomDir, 'server.mjs'), + }; + } + } + return { - 'react-router-dom': path.dirname(resolved.path), + 'react-router-dom': routerDomDir, + REACT_ROUTER_DOM_SERVER: routerDomDir, }; } catch (e) { logger.warn('react-router-dom not found: \n', e); diff --git a/packages/core/src/runtime/ssrMdServerEntry.tsx b/packages/core/src/runtime/ssrMdServerEntry.tsx index bab8bda3e4..f03141e62f 100644 --- a/packages/core/src/runtime/ssrMdServerEntry.tsx +++ b/packages/core/src/runtime/ssrMdServerEntry.tsx @@ -1,5 +1,8 @@ // biome-ignore lint/suspicious/noTsIgnore: bundleless -// @ts-ignore +// @ts-expect-error + +// @ts-expect-error in v7, StaticRouter is exported from the main entry, but in v6 it's exported from 'react-router-dom/server' +import { StaticRouter } from 'REACT_ROUTER_DOM_SERVER'; import { renderToMarkdownString } from '@rspress/core/_private/react'; import { PageContext, @@ -9,7 +12,6 @@ import { withBase, } from '@rspress/core/runtime'; import { type Unhead, UnheadProvider } from '@unhead/react/server'; -import { StaticRouter } from 'react-router-dom'; import { App } from './App'; import { initPageData } from './initPageData'; diff --git a/packages/core/src/runtime/ssrServerEntry.tsx b/packages/core/src/runtime/ssrServerEntry.tsx index 124e8962eb..e2b64a03f4 100644 --- a/packages/core/src/runtime/ssrServerEntry.tsx +++ b/packages/core/src/runtime/ssrServerEntry.tsx @@ -1,3 +1,5 @@ +// @ts-expect-error in v7, StaticRouter is exported from the main entry, but in v6 it's exported from 'react-router-dom/server' +import { StaticRouter } from 'REACT_ROUTER_DOM_SERVER'; import { PassThrough } from 'node:stream'; import { text } from 'node:stream/consumers'; import { @@ -10,7 +12,6 @@ import { import { type Unhead, UnheadProvider } from '@unhead/react/server'; import type { ReactNode } from 'react'; import { renderToPipeableStream } from 'react-dom/server'; -import { StaticRouter } from 'react-router-dom'; import { App } from './App'; import { initPageData } from './initPageData';