@@ -56,6 +56,14 @@ type ClientReferenceMeta = {
56
56
renderedExports : string [ ]
57
57
}
58
58
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
+
59
67
const PKG_NAME = '@vitejs/plugin-rsc'
60
68
const REACT_SERVER_DOM_NAME = `${ PKG_NAME } /vendor/react-server-dom`
61
69
@@ -76,8 +84,8 @@ class RscPluginManager {
76
84
rscBundle ! : Rollup . OutputBundle
77
85
buildAssetsManifest : AssetsManifest | undefined
78
86
isScanBuild : boolean = false
79
- serverReferences : Record < string , string > = { }
80
87
clientReferenceMetaMap : Record < string , ClientReferenceMeta > = { }
88
+ serverReferenceMetaMap : Record < string , ServerRerferenceMeta > = { }
81
89
serverResourcesMetaMap : Record < string , { key : string } > = { }
82
90
}
83
91
@@ -1429,7 +1437,7 @@ function vitePluginUseServer(
1429
1437
)
1430
1438
const enableEncryption =
1431
1439
useServerPluginOptions . enableActionEncryption ?? true
1432
- const { output } = transformServerActionServer_ ( code , ast , {
1440
+ const result = transformServerActionServer_ ( code , ast , {
1433
1441
runtime : ( value , name ) =>
1434
1442
`$$ReactServer.registerServerReference(${ value } , ${ JSON . stringify (
1435
1443
getNormalizedId ( ) ,
@@ -1444,8 +1452,13 @@ function vitePluginUseServer(
1444
1452
`await __vite_rsc_encryption_runtime.decryptActionBoundArgs(${ value } )`
1445
1453
: undefined ,
1446
1454
} )
1455
+ if ( ! result ) return
1456
+ const output = result . output
1447
1457
if ( ! output . hasChanged ( ) ) return
1448
- manager . serverReferences [ getNormalizedId ( ) ] = id
1458
+ manager . serverReferenceMetaMap [ id ] = {
1459
+ importId : id ,
1460
+ referenceKey : getNormalizedId ( ) ,
1461
+ }
1449
1462
const importSource = resolvePackage ( `${ PKG_NAME } /react/rsc` )
1450
1463
output . prepend ( `import * as $$ReactServer from "${ importSource } ";\n` )
1451
1464
if ( enableEncryption ) {
@@ -1480,9 +1493,13 @@ function vitePluginUseServer(
1480
1493
directive : 'use server' ,
1481
1494
rejectNonAsyncFunction : true ,
1482
1495
} )
1496
+ if ( ! result ) return
1483
1497
const output = result ?. output
1484
1498
if ( ! output ?. hasChanged ( ) ) return
1485
- manager . serverReferences [ getNormalizedId ( ) ] = id
1499
+ manager . serverReferenceMetaMap [ id ] = {
1500
+ importId : id ,
1501
+ referenceKey : getNormalizedId ( ) ,
1502
+ }
1486
1503
const name =
1487
1504
this . environment . name === browserEnvironmentName ? 'browser' : 'ssr'
1488
1505
const importSource = resolvePackage ( `${ PKG_NAME } /react/${ name } ` )
@@ -1498,7 +1515,13 @@ function vitePluginUseServer(
1498
1515
if ( this . environment . mode === 'dev' ) {
1499
1516
return { code : `export {}` , map : null }
1500
1517
}
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`
1502
1525
return { code, map : null }
1503
1526
} ) ,
1504
1527
]
@@ -1543,16 +1566,6 @@ function createVirtualPlugin(name: string, load: Plugin['load']) {
1543
1566
} satisfies Plugin
1544
1567
}
1545
1568
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
-
1556
1569
class RuntimeAsset {
1557
1570
runtime : string
1558
1571
constructor ( value : string ) {
0 commit comments