From 2356603ca5483c5e26cde65c01b89a33d0a5867b Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 08:31:29 +0900 Subject: [PATCH 01/21] refactor(rsc): remove server optimizeDeps.include --- packages/plugin-rsc/src/plugin.ts | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 7bba9b1ac..5044a54ec 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -306,14 +306,14 @@ export default function vitePluginRsc( noExternal, }, optimizeDeps: { - include: [ - 'react', - 'react-dom', - 'react/jsx-runtime', - 'react/jsx-dev-runtime', - 'react-dom/server.edge', - `${REACT_SERVER_DOM_NAME}/client.edge`, - ], + // include: [ + // 'react', + // 'react-dom', + // 'react/jsx-runtime', + // 'react/jsx-dev-runtime', + // 'react-dom/server.edge', + // `${REACT_SERVER_DOM_NAME}/client.edge`, + // ], exclude: [PKG_NAME], }, }, @@ -332,14 +332,14 @@ export default function vitePluginRsc( noExternal, }, optimizeDeps: { - include: [ - 'react', - 'react-dom', - 'react/jsx-runtime', - 'react/jsx-dev-runtime', - `${REACT_SERVER_DOM_NAME}/server.edge`, - `${REACT_SERVER_DOM_NAME}/client.edge`, - ], + // include: [ + // 'react', + // 'react-dom', + // 'react/jsx-runtime', + // 'react/jsx-dev-runtime', + // `${REACT_SERVER_DOM_NAME}/server.edge`, + // `${REACT_SERVER_DOM_NAME}/client.edge`, + // ], exclude: [PKG_NAME], }, }, From 44a4bf225b719991e364adf669d0a75e63c3a9e7 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 08:50:52 +0900 Subject: [PATCH 02/21] wip --- packages/plugin-rsc/src/plugins/cjs.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index b2b9e85e4..7323d51a4 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -17,7 +17,10 @@ export function cjsModuleRunnerPlugin(): Plugin[] { applyToEnvironment: (env) => env.config.dev.moduleRunnerTransform, async transform(code, id) { if ( - id.includes('/node_modules/') && + (id.includes('/node_modules/') || + id.includes( + '/packages/plugin-rsc/dist/vendor/react-server-dom/', + )) && !id.startsWith(this.environment.config.cacheDir) && /\b(require|exports)\b/.test(code) ) { From 238e83244c5d33373a780aa7c0b4a13d36680d70 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 08:55:21 +0900 Subject: [PATCH 03/21] wip: default import --- packages/plugin-rsc/examples/starter/src/client.tsx | 2 +- .../plugin-rsc/examples/starter/src/framework/entry.ssr.tsx | 2 +- packages/plugin-rsc/src/plugin.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/plugin-rsc/examples/starter/src/client.tsx b/packages/plugin-rsc/examples/starter/src/client.tsx index 29bb5d367..5132aa07d 100644 --- a/packages/plugin-rsc/examples/starter/src/client.tsx +++ b/packages/plugin-rsc/examples/starter/src/client.tsx @@ -1,6 +1,6 @@ 'use client' -import React from 'react' +import * as React from 'react' export function ClientCounter() { const [count, setCount] = React.useState(0) diff --git a/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx b/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx index d4944bc5d..6347b08a1 100644 --- a/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx +++ b/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx @@ -1,5 +1,5 @@ import * as ReactClient from '@vitejs/plugin-rsc/ssr' // RSC API -import React from 'react' +import * as React from 'react' import type { ReactFormState } from 'react-dom/client' import * as ReactDOMServer from 'react-dom/server.edge' import { injectRSCPayload } from 'rsc-html-stream/server' diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 5044a54ec..2953171dd 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -1958,7 +1958,7 @@ function generateResourcesCode(depsCode: string) { } return ` - import __vite_rsc_react__ from "react"; + import * as __vite_rsc_react__ from "react"; export const Resources = (${ResourcesFn.toString()})(__vite_rsc_react__, ${depsCode}); ` } @@ -1983,7 +1983,7 @@ export async function transformRscCssExport(options: { }) if (result.output.hasChanged()) { if (!options.code.includes('__vite_rsc_react__')) { - result.output.prepend(`import __vite_rsc_react__ from "react";`) + result.output.prepend(`import * as __vite_rsc_react__ from "react";`) } result.output.append(` function __vite_rsc_wrap_css__(value, name) { From 7d0b79eb2c4005ff26f3dd9b1732d4dc0d097753 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 08:58:59 +0900 Subject: [PATCH 04/21] chore: comment --- packages/plugin-rsc/src/plugins/cjs.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index 7323d51a4..356691a81 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -18,6 +18,7 @@ export function cjsModuleRunnerPlugin(): Plugin[] { async transform(code, id) { if ( (id.includes('/node_modules/') || + // it's not inside node_modules when developing rsc plugin inside pnpm workspace. id.includes( '/packages/plugin-rsc/dist/vendor/react-server-dom/', )) && From f3dac608b0d7b50f8be736f6ca42c4a00ac429ee Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 09:05:12 +0900 Subject: [PATCH 05/21] Revert "wip: default import" This reverts commit 238e83244c5d33373a780aa7c0b4a13d36680d70. --- packages/plugin-rsc/examples/starter/src/client.tsx | 2 +- .../plugin-rsc/examples/starter/src/framework/entry.ssr.tsx | 2 +- packages/plugin-rsc/src/plugin.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/plugin-rsc/examples/starter/src/client.tsx b/packages/plugin-rsc/examples/starter/src/client.tsx index 5132aa07d..29bb5d367 100644 --- a/packages/plugin-rsc/examples/starter/src/client.tsx +++ b/packages/plugin-rsc/examples/starter/src/client.tsx @@ -1,6 +1,6 @@ 'use client' -import * as React from 'react' +import React from 'react' export function ClientCounter() { const [count, setCount] = React.useState(0) diff --git a/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx b/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx index 6347b08a1..d4944bc5d 100644 --- a/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx +++ b/packages/plugin-rsc/examples/starter/src/framework/entry.ssr.tsx @@ -1,5 +1,5 @@ import * as ReactClient from '@vitejs/plugin-rsc/ssr' // RSC API -import * as React from 'react' +import React from 'react' import type { ReactFormState } from 'react-dom/client' import * as ReactDOMServer from 'react-dom/server.edge' import { injectRSCPayload } from 'rsc-html-stream/server' diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 2953171dd..5044a54ec 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -1958,7 +1958,7 @@ function generateResourcesCode(depsCode: string) { } return ` - import * as __vite_rsc_react__ from "react"; + import __vite_rsc_react__ from "react"; export const Resources = (${ResourcesFn.toString()})(__vite_rsc_react__, ${depsCode}); ` } @@ -1983,7 +1983,7 @@ export async function transformRscCssExport(options: { }) if (result.output.hasChanged()) { if (!options.code.includes('__vite_rsc_react__')) { - result.output.prepend(`import * as __vite_rsc_react__ from "react";`) + result.output.prepend(`import __vite_rsc_react__ from "react";`) } result.output.append(` function __vite_rsc_wrap_css__(value, name) { From 5c23694294ca053fbfe66654e749b76cbb6a8269 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 09:05:24 +0900 Subject: [PATCH 06/21] fix: export default module.exports --- packages/plugin-rsc/src/plugins/cjs.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index 356691a81..f0450f68e 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -60,7 +60,9 @@ export function cjsModuleRunnerPlugin(): Plugin[] { // TODO: can we use cjs-module-lexer to properly define named exports? // for re-exports, we need to eagerly transform dependencies though. // https://github.com/nodejs/node/blob/f3adc11e37b8bfaaa026ea85c1cf22e3a0e29ae9/lib/internal/modules/esm/translators.js#L382-L409 - output.append(`__vite_ssr_exportAll__(module.exports)`) + output.append( + `\n;__vite_ssr_exportAll__(module.exports);\nexport default module.exports;\n`, + ) return { code: output.toString(), map: output.generateMap({ hires: 'boundary' }), From 72d05d00e27378b3c61697790ecbc1eb5b34c4e1 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 09:08:16 +0900 Subject: [PATCH 07/21] fix: warning --- packages/plugin-rsc/src/plugins/cjs.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index f0450f68e..0d1b40c21 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -8,7 +8,12 @@ import { transformCjsToEsm } from '../transforms/cjs' export function cjsModuleRunnerPlugin(): Plugin[] { // use-sync-external-store is known to work fine so don't show warning - const warnedPackages = new Set(['use-sync-external-store']) + const warnedPackages = new Set([ + 'use-sync-external-store', + 'react', + 'react-dom', + '@vitejs/plugin-rsc', + ]) return [ { @@ -74,6 +79,10 @@ export function cjsModuleRunnerPlugin(): Plugin[] { } function extractPackageKey(id: string): string { + if (id.includes('/packages/plugin-rsc/dist/vendor/react-server-dom/')) { + return '@vitejs/plugin-rsc' + } + // .../.yarn/cache/abc/... => abc const yarnMatch = id.match(/\/.yarn\/cache\/([^/]+)/) if (yarnMatch) { From f02e12f60f4d8b1ded059c0c64794ac4b9562a62 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 09:21:18 +0900 Subject: [PATCH 08/21] wip: cf plugin with noDiscovery: true --- .../examples/react-router/cf/vite.config.ts | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts index 8cf7a02f5..99f4a5e26 100644 --- a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts +++ b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts @@ -36,6 +36,21 @@ export default defineConfig({ }, ], }), + { + name: 'no-server-optimize-deps', + configEnvironment: { + order: 'post', + handler(name) { + if (name === 'ssr' || name === 'rsc') { + return { + optimizeDeps: { + noDiscovery: true, + }, + } + } + }, + }, + }, ], environments: { client: { @@ -45,14 +60,14 @@ export default defineConfig({ }, ssr: { optimizeDeps: { - include: ['react-router > cookie', 'react-router > set-cookie-parser'], - exclude: ['react-router'], + // include: ['react-router > cookie', 'react-router > set-cookie-parser'], + // exclude: ['react-router'], }, }, rsc: { optimizeDeps: { - include: ['react-router > cookie', 'react-router > set-cookie-parser'], - exclude: ['react-router'], + // include: ['react-router > cookie', 'react-router > set-cookie-parser'], + // exclude: ['react-router'], }, }, }, From 69209f22b27f77cf13a4b1526699f5eef30d75cb Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 12:09:01 +0900 Subject: [PATCH 09/21] wip --- packages/plugin-rsc/src/plugin.ts | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 5044a54ec..965648676 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -306,14 +306,14 @@ export default function vitePluginRsc( noExternal, }, optimizeDeps: { - // include: [ - // 'react', - // 'react-dom', - // 'react/jsx-runtime', - // 'react/jsx-dev-runtime', - // 'react-dom/server.edge', - // `${REACT_SERVER_DOM_NAME}/client.edge`, - // ], + include: [ + 'react', + // 'react-dom', + // 'react/jsx-runtime', + // 'react/jsx-dev-runtime', + // 'react-dom/server.edge', + // `${REACT_SERVER_DOM_NAME}/client.edge`, + ], exclude: [PKG_NAME], }, }, @@ -332,14 +332,14 @@ export default function vitePluginRsc( noExternal, }, optimizeDeps: { - // include: [ - // 'react', - // 'react-dom', - // 'react/jsx-runtime', - // 'react/jsx-dev-runtime', - // `${REACT_SERVER_DOM_NAME}/server.edge`, - // `${REACT_SERVER_DOM_NAME}/client.edge`, - // ], + include: [ + 'react', + // 'react-dom', + // 'react/jsx-runtime', + // 'react/jsx-dev-runtime', + // `${REACT_SERVER_DOM_NAME}/server.edge`, + // `${REACT_SERVER_DOM_NAME}/client.edge`, + ], exclude: [PKG_NAME], }, }, From de41c1c81bfc72dab53a5133363cb0134fa70263 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 14:42:38 +0900 Subject: [PATCH 10/21] fix(rsc): remove non-optimized server cjs warning --- packages/plugin-rsc/src/plugins/cjs.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index a232f69cb..6ba74ec35 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -5,6 +5,9 @@ import path from 'node:path' import fs from 'node:fs' import * as esModuleLexer from 'es-module-lexer' import { transformCjsToEsm } from '../transforms/cjs' +import { createDebug } from '@hiogawa/utils' + +const debug = createDebug('vite-rsc:cjs') export function cjsModuleRunnerPlugin(): Plugin[] { // use-sync-external-store is known to work fine so don't show warning @@ -43,7 +46,7 @@ export function cjsModuleRunnerPlugin(): Plugin[] { // warning once per package const packageKey = extractPackageKey(id) if (!warnedPackages.has(packageKey)) { - this.warn( + debug( `Found non-optimized CJS dependency in '${this.environment.name}' environment. ` + `It is recommended to add the dependency to 'environments.${this.environment.name}.optimizeDeps.include'.`, ) From e984b2aeb706615cc14ae63f2cbac7f2c5a3eaa7 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 14:46:38 +0900 Subject: [PATCH 11/21] chore: simplify react-router cf config --- packages/plugin-rsc/examples/react-router/cf/vite.config.ts | 2 -- packages/plugin-rsc/src/plugins/cjs.ts | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts index 8cf7a02f5..6895d0c12 100644 --- a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts +++ b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts @@ -45,13 +45,11 @@ export default defineConfig({ }, ssr: { optimizeDeps: { - include: ['react-router > cookie', 'react-router > set-cookie-parser'], exclude: ['react-router'], }, }, rsc: { optimizeDeps: { - include: ['react-router > cookie', 'react-router > set-cookie-parser'], exclude: ['react-router'], }, }, diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index 6ba74ec35..d18ae1923 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -10,8 +10,7 @@ import { createDebug } from '@hiogawa/utils' const debug = createDebug('vite-rsc:cjs') export function cjsModuleRunnerPlugin(): Plugin[] { - // use-sync-external-store is known to work fine so don't show warning - const warnedPackages = new Set(['use-sync-external-store']) + const warnedPackages = new Set() return [ { From 6f4dcb80a0094b15493006cb2308d436f4de8190 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 14:50:41 +0900 Subject: [PATCH 12/21] test: update --- packages/plugin-rsc/e2e/basic.test.ts | 10 +++++++++- packages/plugin-rsc/src/plugins/cjs.ts | 3 +-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/plugin-rsc/e2e/basic.test.ts b/packages/plugin-rsc/e2e/basic.test.ts index 680975568..40bbaf24d 100644 --- a/packages/plugin-rsc/e2e/basic.test.ts +++ b/packages/plugin-rsc/e2e/basic.test.ts @@ -58,7 +58,15 @@ test.describe('dev-non-optimized-cjs', () => { ) }) - const f = useFixture({ root: 'examples/basic', mode: 'dev' }) + const f = useFixture({ + root: 'examples/basic', + mode: 'dev', + cliOptions: { + env: { + DEBUG: 'vite-rsc:cjs', + }, + }, + }) test('show warning', async ({ page }) => { await page.goto(f.url()) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index d18ae1923..a501bbe04 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -46,8 +46,7 @@ export function cjsModuleRunnerPlugin(): Plugin[] { const packageKey = extractPackageKey(id) if (!warnedPackages.has(packageKey)) { debug( - `Found non-optimized CJS dependency in '${this.environment.name}' environment. ` + - `It is recommended to add the dependency to 'environments.${this.environment.name}.optimizeDeps.include'.`, + `non-optimized CJS dependency in '${this.environment.name}' environment: ${id}`, ) warnedPackages.add(packageKey) } From 232cde22356fd69c219c4576cbe0b02d01ae312d Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 14:53:40 +0900 Subject: [PATCH 13/21] test: update --- packages/plugin-rsc/e2e/basic.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin-rsc/e2e/basic.test.ts b/packages/plugin-rsc/e2e/basic.test.ts index 40bbaf24d..5cf1c21f2 100644 --- a/packages/plugin-rsc/e2e/basic.test.ts +++ b/packages/plugin-rsc/e2e/basic.test.ts @@ -70,8 +70,8 @@ test.describe('dev-non-optimized-cjs', () => { test('show warning', async ({ page }) => { await page.goto(f.url()) - expect(f.proc().stderr()).toContain( - `Found non-optimized CJS dependency in 'ssr' environment.`, + expect(f.proc().stderr()).toMatch( + /non-optimized CJS dependency in 'ssr' environment.*@vitejs\/test-dep-cjs\/index.js/, ) }) }) From 783b8007717a6566cfafb481652fa6138a4359c3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 15:12:43 +0900 Subject: [PATCH 14/21] wip --- packages/plugin-rsc/src/plugin.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index a10a88570..30fdba440 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -311,7 +311,7 @@ export default function vitePluginRsc( }, optimizeDeps: { include: [ - 'react', + // 'react', // 'react-dom', // 'react/jsx-runtime', // 'react/jsx-dev-runtime', @@ -337,7 +337,7 @@ export default function vitePluginRsc( }, optimizeDeps: { include: [ - 'react', + // 'react', // 'react-dom', // 'react/jsx-runtime', // 'react/jsx-dev-runtime', From 3e044583ed51c0a4464a73c3c799928dbc70de1f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 11 Aug 2025 15:21:25 +0900 Subject: [PATCH 15/21] tweak --- packages/plugin-rsc/src/plugins/cjs.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/plugin-rsc/src/plugins/cjs.ts b/packages/plugin-rsc/src/plugins/cjs.ts index f35c8e8af..9a65d8f16 100644 --- a/packages/plugin-rsc/src/plugins/cjs.ts +++ b/packages/plugin-rsc/src/plugins/cjs.ts @@ -19,11 +19,7 @@ export function cjsModuleRunnerPlugin(): Plugin[] { applyToEnvironment: (env) => env.config.dev.moduleRunnerTransform, async transform(code, id) { if ( - (id.includes('/node_modules/') || - // it's not inside node_modules when developing rsc plugin inside pnpm workspace. - id.includes( - '/packages/plugin-rsc/dist/vendor/react-server-dom/', - )) && + (id.includes('/node_modules/') || isDevCjs(id)) && !id.startsWith(this.environment.config.cacheDir) && /\b(require|exports)\b/.test(code) ) { @@ -76,7 +72,7 @@ export default module.exports; } function extractPackageKey(id: string): string { - if (id.includes('/packages/plugin-rsc/dist/vendor/react-server-dom/')) { + if (isDevCjs(id)) { return '@vitejs/plugin-rsc' } @@ -97,3 +93,11 @@ function extractPackageKey(id: string): string { } return id } + +// this is needed only when developing package itself within pnpm workspace +function isDevCjs(id: string): boolean { + return ( + !import.meta.url.includes('/node_modules/') && + id.includes('/vendor/react-server-dom/') + ) +} From fd27faf41cab0503c922ccbb7c12e8662a26ffad Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 09:22:07 +0900 Subject: [PATCH 16/21] fix: fix AsyncLocalStorage injection --- packages/plugin-rsc/src/plugin.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index f2c43b19d..dad4f07c3 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -943,12 +943,13 @@ import.meta.hot.on("rsc:update", () => { code.includes('new AsyncLocalStorage()') && !code.includes('__viteRscAyncHooks') ) { - // for build, we cannot use `import` as it confuses rollup commonjs plugin. + // react code can be turned into esm when optimized + const [, , , hasModuleSyntax] = esModuleLexer.parse(code) return ( - (this.environment.mode === 'build' && !isRolldownVite - ? `const __viteRscAyncHooks = require("node:async_hooks");` - : `import * as __viteRscAyncHooks from "node:async_hooks";`) + - `globalThis.AsyncLocalStorage = __viteRscAyncHooks.AsyncLocalStorage;` + + (hasModuleSyntax + ? `import * as __viteRscAsyncHooks from "node:async_hooks";` + : `const __viteRscAsyncHooks = require("node:async_hooks");`) + + `globalThis.AsyncLocalStorage = __viteRscAsyncHooks.AsyncLocalStorage;` + code ) } From 9c0a8bf06d0e62c7092b0b944b2567be61e67585 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 09:27:40 +0900 Subject: [PATCH 17/21] chore: unused --- packages/plugin-rsc/src/plugin.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index dad4f07c3..de3adbb09 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -53,8 +53,6 @@ import { validateImportPlugin } from './plugins/validate-import' import { vitePluginFindSourceMapURL } from './plugins/find-source-map-url' import { parseCssVirtual, toCssVirtual, parseIdQuery } from './plugins/shared' -const isRolldownVite = 'rolldownVersion' in vite - const BUILD_ASSETS_MANIFEST_NAME = '__vite_rsc_assets_manifest.js' type ClientReferenceMeta = { From 944a128183c0a3a5a8a59de705bc97df0b402e5f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 10:03:56 +0900 Subject: [PATCH 18/21] chore: optimizeDeps.exclude react for cf --- packages/plugin-rsc/examples/react-router/cf/vite.config.ts | 4 ++-- packages/plugin-rsc/examples/starter-cf-single/vite.config.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts index 4f77cb175..a595713df 100644 --- a/packages/plugin-rsc/examples/react-router/cf/vite.config.ts +++ b/packages/plugin-rsc/examples/react-router/cf/vite.config.ts @@ -43,12 +43,12 @@ export default defineConfig({ }, ssr: { optimizeDeps: { - exclude: ['react-router'], + exclude: ['react-router', 'react', 'react-dom'], }, }, rsc: { optimizeDeps: { - exclude: ['react-router'], + exclude: ['react-router', 'react', 'react-dom'], }, }, }, diff --git a/packages/plugin-rsc/examples/starter-cf-single/vite.config.ts b/packages/plugin-rsc/examples/starter-cf-single/vite.config.ts index afb3648a8..5efd899b5 100644 --- a/packages/plugin-rsc/examples/starter-cf-single/vite.config.ts +++ b/packages/plugin-rsc/examples/starter-cf-single/vite.config.ts @@ -36,6 +36,7 @@ export default defineConfig({ }, optimizeDeps: { include: ['turbo-stream'], + exclude: ['react', 'react-dom'], }, }, ssr: { From 6a165a22ed05f4d44e03a289c19023657c8fb496 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 11:29:14 +0900 Subject: [PATCH 19/21] Revert "fix: fix AsyncLocalStorage injection" This reverts commit fd27faf41cab0503c922ccbb7c12e8662a26ffad. --- packages/plugin-rsc/src/plugin.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 8e987e37b..bed3037e1 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -970,13 +970,12 @@ import.meta.hot.on("rsc:update", () => { code.includes('new AsyncLocalStorage()') && !code.includes('__viteRscAyncHooks') ) { - // react code can be turned into esm when optimized - const [, , , hasModuleSyntax] = esModuleLexer.parse(code) + // for build, we cannot use `import` as it confuses rollup commonjs plugin. return ( - (hasModuleSyntax - ? `import * as __viteRscAsyncHooks from "node:async_hooks";` - : `const __viteRscAsyncHooks = require("node:async_hooks");`) + - `globalThis.AsyncLocalStorage = __viteRscAsyncHooks.AsyncLocalStorage;` + + (this.environment.mode === 'build' && !isRolldownVite + ? `const __viteRscAyncHooks = require("node:async_hooks");` + : `import * as __viteRscAyncHooks from "node:async_hooks";`) + + `globalThis.AsyncLocalStorage = __viteRscAyncHooks.AsyncLocalStorage;` + code ) } From b7444d2e427e0b9364bdabb5b0685dbee9261d0e Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 11:29:15 +0900 Subject: [PATCH 20/21] Revert "chore: unused" This reverts commit 9c0a8bf06d0e62c7092b0b944b2567be61e67585. --- packages/plugin-rsc/src/plugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index bed3037e1..3d9dab163 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -53,6 +53,8 @@ import { validateImportPlugin } from './plugins/validate-import' import { vitePluginFindSourceMapURL } from './plugins/find-source-map-url' import { parseCssVirtual, toCssVirtual, parseIdQuery } from './plugins/shared' +const isRolldownVite = 'rolldownVersion' in vite + const BUILD_ASSETS_MANIFEST_NAME = '__vite_rsc_assets_manifest.js' type ClientReferenceMeta = { From 4e1713a9799bc79b582bf0da3dd292c4b2eb946f Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 28 Aug 2025 11:29:34 +0900 Subject: [PATCH 21/21] fix: move cjs transform --- packages/plugin-rsc/src/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 3d9dab163..179656a1f 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -959,6 +959,7 @@ import.meta.hot.on("rsc:update", () => { return code }, ), + ...cjsModuleRunnerPlugin(), { // make `AsyncLocalStorage` available globally for React edge build (required for React.cache, ssr preload, etc.) // https://github.com/facebook/react/blob/f14d7f0d2597ea25da12bcf97772e8803f2a394c/packages/react-server/src/forks/ReactFlightServerConfig.dom-edge.js#L16-L19 @@ -991,7 +992,6 @@ import.meta.hot.on("rsc:update", () => { ? [validateImportPlugin()] : []), scanBuildStripPlugin({ manager }), - ...cjsModuleRunnerPlugin(), ] }