Skip to content

SSR-externalized dependencies resolve a different react-router export condition than app code, producing a duplicate Router context (v8) #15232

Description

@wobsoriano

Reproduction

https://github.com/wobsoriano/clerk-react-router-v8-context-repro

System Info

System:
    OS: macOS 26.5.1
    CPU: (14) arm64 Apple M4 Pro
    Memory: 4.15 GB / 48.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 24.15.0 - /Users/wobsoriano/.vite-plus/bin/node
    npm: 11.12.1 - /Users/wobsoriano/.vite-plus/bin/npm
    pnpm: 11.9.0 - /Users/wobsoriano/.local/state/fnm_multishells/54362_1782257576852/bin/pnpm
    bun: 1.3.13 - /Users/wobsoriano/.bun/bin/bun
    Deno: 2.5.0 - /Users/wobsoriano/.deno/bin/deno
  Browsers:
    Chrome: 149.0.7827.156
    Firefox: 147.0.2
    Safari: 26.5
  npmPackages:
    @react-router/dev: 8.0.0 => 8.0.0
    @react-router/node: 8.0.0 => 8.0.0
    @react-router/serve: 8.0.0 => 8.0.0
    react-router: 8.0.0 => 8.0.0
    vite: ^8.0.3 => 8.1.0

Used Package Manager

npm

Expected Behavior

In react-router dev (framework mode), a node_modules dependency that imports react-router and renders during SSR should share the app's react-router instance. Its useLocation() / useNavigate() / useParams() calls under <ServerRouter> should work, like they do in production.

Actual Behavior

In dev, hooks from an externalized dependency throw during SSR even when rendered inside <ServerRouter>:

useNavigate() may be used only in the context of a component.

v8's conditional exports split react-router into development (dist/development) and default (dist/production).

Workarounds: NODE_OPTIONS='--conditions development' pnpm dev, or ssr.noExternal: ['<dep>']

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions