Skip to content

Start: radix-ui import breaks when RSC exists in pnpm/yarn #7589

@jeremy-code

Description

@jeremy-code

Which project does this relate to?

Start

Describe the bug

When a React Server Component is rendered (note in the reproduction, <div>Server Component</div> is simply rendered), and something imports radix-ui, the following error is thrown on build:

Error: [vite]: Rolldown failed to resolve import "@radix-ui/react-switch" from "virtual:vite-rsc/client-references/group/facade:src/router.tsx".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rolldownOptions.external`

This error occurs both on pnpm 11.5.2 and yarn 4.16.0.

The fix is either:

  1. Add "use client"; wherever radix-ui is imported
  2. Add whatever dependencies need to be imported to package.json ("@radix-ui/react-switch" in the reproduction)

Complete minimal reproducer

https://github.com/jeremy-code/tanstack-radix-rsc

Steps to Reproduce the Bug

  1. Use "radix-ui" package
  2. Render RSC (in repro: <div>Server Component</div>)
  3. Build
$ vite build
[1/5] analyze client references...
vite v8.0.16 building rsc environment for production...
? 16 modules transformed.
? built in 57ms
[2/5] analyze server references...
vite v8.0.16 building ssr environment for production...
? 288 modules transformed.
? built in 379ms
[3/5] build rsc environment...
vite v8.0.16 building rsc environment for production...
? 235 modules transformed.
computing gzip size...
dist/server/rsc/assets/styles-CnB0YbZX.css           6.79 kB ? gzip:  2.12 kB
dist/server/rsc/assets/getRsc-C5R062Hw.js            9.87 kB ? gzip:  3.26 kB
dist/server/rsc/assets/createServerFn-BobEx3_D.js   15.14 kB ? gzip:  4.59 kB
dist/server/rsc/index.js                           136.53 kB ? gzip: 29.28 kB
dist/server/rsc/assets/router-CLIglB1Y.js          156.02 kB ? gzip: 37.63 kB

? built in 537ms
[4/5] build client environment...
vite v8.0.16 building client environment for production...
? 264 modules transformed.
computing gzip size...
dist/client/assets/styles-CnB0YbZX.css    6.79 kB ? gzip:   2.12 kB
dist/client/assets/styles-CnB0YbZX.css    6.79 kB ? gzip:   2.12 kB
dist/client/assets/getRsc-QiuN-GFR.js     0.07 kB ? gzip:   0.07 kB
dist/client/assets/router-DL6vnptt.js     0.41 kB ? gzip:   0.29 kB
dist/client/assets/routes-DGUEbE_g.js     8.72 kB ? gzip:   3.61 kB
dist/client/assets/index-Dsutsb6Q.js    344.59 kB ? gzip: 109.32 kB

? Build failed in 348ms
error during build:
Build failed with 1 error:

Error: [vite]: Rolldown failed to resolve import "@radix-ui/react-switch" from "virtual:vite-rsc/client-references/group/facade:src/router.tsx".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rolldownOptions.external`
    at viteLog (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33346:57)
    at file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33382:71
    at onwarn (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/@vitejs+plugin-react@6.0.2_vite@8.0.16_@types+node@22.19.20_jiti@2.7.0_/node_modules/@vitejs/plugin-react/dist/index.js:40:7)
    at file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33382:28
    at onRollupLog (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33377:63)
    at onLog (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33146:4)
    at file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/rolldown@1.0.3/node_modules/rolldown/dist/shared/rolldown-build-CrPk_lZe.mjs:50:26
    at logger (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/rolldown@1.0.3/node_modules/rolldown/dist/shared/rolldown-build-CrPk_lZe.mjs:41:3)
    at aggregateBindingErrorsIntoJsError (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/rolldown@1.0.3/node_modules/rolldown/dist/shared/error-BuvQYXuZ.mjs:48:18)
    at unwrapBindingResult (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/rolldown@1.0.3/node_modules/rolldown/dist/shared/error-BuvQYXuZ.mjs:18:128)
    at #build (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/rolldown@1.0.3/node_modules/rolldown/dist/shared/rolldown-build-CrPk_lZe.mjs:3246:34)
    at async buildEnvironment (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33253:64)
    at async Object.build (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33675:19)
    at async buildApp (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/@vitejs+plugin-rsc@0.5.27_react-dom@19.2.7_react@19.2.7__react@19.2.7_vite@8.0.16_@types+node@22.19.20_jiti@2.7.0_/node_modules/@vitejs/plugin-rsc/dist/plugin-BK29Va7z.js:658:3)
    at async BasicMinimalPluginContext.handler (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/@vitejs+plugin-rsc@0.5.27_react-dom@19.2.7_react@19.2.7__react@19.2.7_vite@8.0.16_@types+node@22.19.20_jiti@2.7.0_/node_modules/@vitejs/plugin-rsc/dist/plugin-BK29Va7z.js:771:43)
    at async Object.buildApp (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/chunks/node.js:33669:5)
    at async CAC.<anonymous> (file:///$HOME/Github/tanstack-radix-rsc/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.20_jiti@2.7.0/node_modules/vite/dist/node/cli.js:777:3) {
  errors: [Getter/Setter]
}
[ELIFECYCLE] Command failed with exit code 1.
yarn build
[1/5] analyze client references...
vite v8.0.16 building rsc environment for production...
✓ 16 modules transformed.
✓ built in 59ms
[2/5] analyze server references...
vite v8.0.16 building ssr environment for production...
✓ 288 modules transformed.
✓ built in 379ms
[3/5] build rsc environment...
vite v8.0.16 building rsc environment for production...
✓ 235 modules transformed.
computing gzip size...
dist/server/rsc/assets/styles-_kF3mkCq.css           8.05 kB │ gzip:  2.35 kB
dist/server/rsc/assets/getRsc-q48-lJ4K.js           10.00 kB │ gzip:  3.26 kB
dist/server/rsc/assets/createServerFn-B6413yml.js   15.59 kB │ gzip:  4.68 kB
dist/server/rsc/index.js                           136.79 kB │ gzip: 29.35 kB
dist/server/rsc/assets/router-C2qD0Fbu.js          157.75 kB │ gzip: 37.78 kB

✓ built in 515ms
[4/5] build client environment...
vite v8.0.16 building client environment for production...
✓ 264 modules transformed.
✗ Build failed in 219ms
error during build:
Build failed with 1 error:

[RESOLVE_ERROR] Could not resolve '@radix-ui/react-switch' in \0virtual:vite-rsc/client-references/group/facade:src/router.tsx
   ╭─[ \0virtual:vite-rsc/client-references/group/facade:src/router.tsx:2:52 ]
   │
 2 │               import * as import_5fe8ff67a435 from "@radix-ui/react-switch";
   │                                                    ────────────┬───────────
   │                                                                ╰───────────── Your application tried to access @radix-ui/react-switch, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.

Required package: @radix-ui/react-switch
Required by: $HOME/Github/tanstack-radix-rsc/virtual:vite-rsc/client-references/group/facade:src/
   │
   │ Help: '\0virtual:vite-rsc/client-references/group/facade:src/router.tsx' is imported by the following path:
   │         - \0virtual:vite-rsc/client-references/group/facade:src/router.tsx
   │         - \0virtual:vite-rsc/client-references
   │         - .yarn/__virtual__/@vitejs-plugin-rsc-virtual-5f5735ead0/3/.local/share/yarn/berry/cache/@vitejs-plugin-rsc-npm-0.5.27-8f7f17eee6-10c0.zip/node_modules/@vitejs/plugin-rsc/dist/browser.js
   │         - \0virtual:tanstack-rsc-browser-decode
   │         - .yarn/__virtual__/@tanstack-react-start-rsc-virtual-4ecf756ce4/3/.local/share/yarn/berry/cache/@tanstack-react-start-rsc-npm-0.1.24-a08dd24c29-10c0.zip/node_modules/@tanstack/react-start-rsc/dist/esm/createServerComponentFromStream.js
   │         - .yarn/__virtual__/@tanstack-react-start-rsc-virtual-4ecf756ce4/3/.local/share/yarn/berry/cache/@tanstack-react-start-rsc-npm-0.1.24-a08dd24c29-10c0.zip/node_modules/@tanstack/react-start-rsc/dist/esm/serialization.client.js
   │         - .yarn/__virtual__/@tanstack-react-start-virtual-81b1bcb7c7/3/.local/share/yarn/berry/cache/@tanstack-react-start-npm-1.168.25-e821f0410d-10c0.zip/node_modules/@tanstack/react-start/dist/esm/rsc/serialization/client.js
   │         - \0virtual:tanstack-start-plugin-adapters/client
   │         - ../../.local/share/yarn/berry/cache/@tanstack-start-client-core-npm-1.170.12-cbef131128-10c0.zip/node_modules/@tanstack/start-client-core/dist/esm/client/hydrateStart.js
   │         - ../../.local/share/yarn/berry/cache/@tanstack-start-client-core-npm-1.170.12-cbef131128-10c0.zip/node_modules/@tanstack/start-client-core/dist/esm/client/index.js
   │         - .yarn/__virtual__/@tanstack-react-start-client-virtual-0c397ddb06/3/.local/share/yarn/berry/cache/@tanstack-react-start-client-npm-1.168.13-188a5f5142-10c0.zip/node_modules/@tanstack/react-start-client/dist/esm/hydrateStart.js
   │         - .yarn/__virtual__/@tanstack-react-start-client-virtual-0c397ddb06/3/.local/share/yarn/berry/cache/@tanstack-react-start-client-npm-1.168.13-188a5f5142-10c0.zip/node_modules/@tanstack/react-start-client/dist/esm/index.js
   │         - .yarn/__virtual__/@tanstack-react-start-virtual-81b1bcb7c7/3/.local/share/yarn/berry/cache/@tanstack-react-start-npm-1.168.25-e821f0410d-10c0.zip/node_modules/@tanstack/react-start/dist/esm/client.js
   │         - .yarn/__virtual__/@tanstack-react-start-virtual-81b1bcb7c7/3/.local/share/yarn/berry/cache/@tanstack-react-start-npm-1.168.25-e821f0410d-10c0.zip/node_modules/@tanstack/react-start/dist/plugin/default-entry/client.tsx
───╯

    at aggregateBindingErrorsIntoJsError (file://$HOME/.local/share/yarn/berry/cache/rolldown-npm-1.0.3-6add5bd31e-10c0.zip/node_modules/rolldown/dist/shared/error-BuvQYXuZ.mjs:48:18)
    at unwrapBindingResult (file://$HOME/.local/share/yarn/berry/cache/rolldown-npm-1.0.3-6add5bd31e-10c0.zip/node_modules/rolldown/dist/shared/error-BuvQYXuZ.mjs:18:128)
    at #build (file://$HOME/.local/share/yarn/berry/cache/rolldown-npm-1.0.3-6add5bd31e-10c0.zip/node_modules/rolldown/dist/shared/rolldown-build-CrPk_lZe.mjs:3246:34)
    at async buildEnvironment (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/vite-virtual-b24d3f36d7/3/.local/share/yarn/berry/cache/vite-npm-8.0.16-a3c339cd2e-10c0.zip/node_modules/vite/dist/node/chunks/node.js:33253:64)
    at async Object.build (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/vite-virtual-b24d3f36d7/3/.local/share/yarn/berry/cache/vite-npm-8.0.16-a3c339cd2e-10c0.zip/node_modules/vite/dist/node/chunks/node.js:33675:19)
    at async buildApp (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/@vitejs-plugin-rsc-virtual-5f5735ead0/3/.local/share/yarn/berry/cache/@vitejs-plugin-rsc-npm-0.5.27-8f7f17eee6-10c0.zip/node_modules/@vitejs/plugin-rsc/dist/plugin-BK29Va7z.js:658:3)
    at async BasicMinimalPluginContext.handler (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/@vitejs-plugin-rsc-virtual-5f5735ead0/3/.local/share/yarn/berry/cache/@vitejs-plugin-rsc-npm-0.5.27-8f7f17eee6-10c0.zip/node_modules/@vitejs/plugin-rsc/dist/plugin-BK29Va7z.js:771:43)
    at async Object.buildApp (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/vite-virtual-b24d3f36d7/3/.local/share/yarn/berry/cache/vite-npm-8.0.16-a3c339cd2e-10c0.zip/node_modules/vite/dist/node/chunks/node.js:33669:5)
    at async CAC.<anonymous> (file://$HOME/Github/tanstack-radix-rsc/.yarn/__virtual__/vite-virtual-b24d3f36d7/3/.local/share/yarn/berry/cache/vite-npm-8.0.16-a3c339cd2e-10c0.zip/node_modules/vite/dist/node/cli.js:777:3) {
  errors: [Getter/Setter]
}

Expected behavior

As a user, I expected the behavior that the import would be resolved correctly without the use of "use client", but I am seeing that an error occurs.

Screenshots or Videos

No response

Platform

  • Router / Start Version: 1.168.25
  • OS: macOS
  • Browser: Chrome
  • Browser Version: 148.0.7778.216
  • Bundler: vite
  • Bundler Version: 8.0.16

Additional context

This doesn't work:

// Switch.tsx
import { Switch as SwitchPrimitive } from "radix-ui";
...

// package.json
  "dependencies": {
    "radix-ui": "^1.5.0",
...

While the following do work:

// Switch.tsx
"use client";
import { Switch as SwitchPrimitive } from "radix-ui";
...

// package.json
  "dependencies": {
    "radix-ui": "^1.5.0",
...
// Switch.tsx
import { Switch as SwitchPrimitive } from "radix-ui";
...

// package.json
  "dependencies": {
    "@radix-ui/react-switch": "^1.3.0",
    "radix-ui": "^1.5.0",
...
// Switch.tsx
import * as SwitchPrimitive from "@radix-ui/react-switch";
...

// package.json
  "dependencies": {
    "@radix-ui/react-switch": "^1.3.0",
    "radix-ui": "^1.5.0",
...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    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