@@ -56,6 +56,14 @@ type ClientReferenceMeta = {
5656 renderedExports : string [ ]
5757}
5858
59+ type ServerRerferenceMeta = {
60+ importId : string
61+ referenceKey : string
62+ // TODO: expose only "use server" exports
63+ // TODO: tree shake unused exports
64+ // exportNames: string[]
65+ }
66+
5967const PKG_NAME = '@vitejs/plugin-rsc'
6068const REACT_SERVER_DOM_NAME = `${ PKG_NAME } /vendor/react-server-dom`
6169
@@ -76,8 +84,8 @@ class RscPluginManager {
7684 rscBundle ! : Rollup . OutputBundle
7785 buildAssetsManifest : AssetsManifest | undefined
7886 isScanBuild : boolean = false
79- serverReferences : Record < string , string > = { }
8087 clientReferenceMetaMap : Record < string , ClientReferenceMeta > = { }
88+ serverReferenceMetaMap : Record < string , ServerRerferenceMeta > = { }
8189 serverResourcesMetaMap : Record < string , { key : string } > = { }
8290}
8391
@@ -1429,7 +1437,7 @@ function vitePluginUseServer(
14291437 )
14301438 const enableEncryption =
14311439 useServerPluginOptions . enableActionEncryption ?? true
1432- const { output } = transformServerActionServer_ ( code , ast , {
1440+ const result = transformServerActionServer_ ( code , ast , {
14331441 runtime : ( value , name ) =>
14341442 `$$ReactServer.registerServerReference(${ value } , ${ JSON . stringify (
14351443 getNormalizedId ( ) ,
@@ -1444,8 +1452,13 @@ function vitePluginUseServer(
14441452 `await __vite_rsc_encryption_runtime.decryptActionBoundArgs(${ value } )`
14451453 : undefined ,
14461454 } )
1455+ if ( ! result ) return
1456+ const output = result . output
14471457 if ( ! output . hasChanged ( ) ) return
1448- manager . serverReferences [ getNormalizedId ( ) ] = id
1458+ manager . serverReferenceMetaMap [ id ] = {
1459+ importId : id ,
1460+ referenceKey : getNormalizedId ( ) ,
1461+ }
14491462 const importSource = resolvePackage ( `${ PKG_NAME } /react/rsc` )
14501463 output . prepend ( `import * as $$ReactServer from "${ importSource } ";\n` )
14511464 if ( enableEncryption ) {
@@ -1480,9 +1493,13 @@ function vitePluginUseServer(
14801493 directive : 'use server' ,
14811494 rejectNonAsyncFunction : true ,
14821495 } )
1496+ if ( ! result ) return
14831497 const output = result ?. output
14841498 if ( ! output ?. hasChanged ( ) ) return
1485- manager . serverReferences [ getNormalizedId ( ) ] = id
1499+ manager . serverReferenceMetaMap [ id ] = {
1500+ importId : id ,
1501+ referenceKey : getNormalizedId ( ) ,
1502+ }
14861503 const name =
14871504 this . environment . name === browserEnvironmentName ? 'browser' : 'ssr'
14881505 const importSource = resolvePackage ( `${ PKG_NAME } /react/${ name } ` )
@@ -1498,7 +1515,13 @@ function vitePluginUseServer(
14981515 if ( this . environment . mode === 'dev' ) {
14991516 return { code : `export {}` , map : null }
15001517 }
1501- const code = generateDynamicImportCode ( manager . serverReferences )
1518+ let code = ''
1519+ for ( const meta of Object . values ( manager . serverReferenceMetaMap ) ) {
1520+ const key = JSON . stringify ( meta . referenceKey )
1521+ const id = JSON . stringify ( meta . importId )
1522+ code += `${ key } : () => import(${ id } ),`
1523+ }
1524+ code = `export default {${ code } };\n`
15021525 return { code, map : null }
15031526 } ) ,
15041527 ]
@@ -1543,16 +1566,6 @@ function createVirtualPlugin(name: string, load: Plugin['load']) {
15431566 } satisfies Plugin
15441567}
15451568
1546- function generateDynamicImportCode ( map : Record < string , string > ) {
1547- let code = Object . entries ( map )
1548- . map (
1549- ( [ key , id ] ) =>
1550- `${ JSON . stringify ( key ) } : () => import(${ JSON . stringify ( id ) } ),` ,
1551- )
1552- . join ( '\n' )
1553- return `export default {${ code } };\n`
1554- }
1555-
15561569class RuntimeAsset {
15571570 runtime : string
15581571 constructor ( value : string ) {
0 commit comments