Skip to content

Commit 7e31ad0

Browse files
committed
refactor: add serverReferenceMetaMap
1 parent 751fb27 commit 7e31ad0

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ class RscPluginManager {
8282
rscBundle!: Rollup.OutputBundle
8383
buildAssetsManifest: AssetsManifest | undefined
8484
isScanBuild: boolean = false
85-
serverReferences: Record<string, string> = {}
8685
clientReferenceMetaMap: Record<string, ClientReferenceMeta> = {}
8786
serverReferenceMetaMap: Record<string, ServerRerferenceMeta> = {}
8887
serverResourcesMetaMap: Record<string, { key: string }> = {}
@@ -1436,7 +1435,7 @@ function vitePluginUseServer(
14361435
)
14371436
const enableEncryption =
14381437
useServerPluginOptions.enableActionEncryption ?? true
1439-
const { output } = transformServerActionServer_(code, ast, {
1438+
const result = transformServerActionServer_(code, ast, {
14401439
runtime: (value, name) =>
14411440
`$$ReactServer.registerServerReference(${value}, ${JSON.stringify(
14421441
getNormalizedId(),
@@ -1451,8 +1450,14 @@ function vitePluginUseServer(
14511450
`await __vite_rsc_encryption_runtime.decryptActionBoundArgs(${value})`
14521451
: undefined,
14531452
})
1453+
if (!result) return
1454+
const output = result.output
14541455
if (!output.hasChanged()) return
1455-
manager.serverReferences[getNormalizedId()] = id
1456+
manager.serverReferenceMetaMap[id] = {
1457+
importId: id,
1458+
referenceKey: getNormalizedId(),
1459+
exportNames: 'names' in result ? result.names : result.exportNames,
1460+
}
14561461
const importSource = resolvePackage(`${PKG_NAME}/react/rsc`)
14571462
output.prepend(`import * as $$ReactServer from "${importSource}";\n`)
14581463
if (enableEncryption) {
@@ -1487,9 +1492,14 @@ function vitePluginUseServer(
14871492
directive: 'use server',
14881493
rejectNonAsyncFunction: true,
14891494
})
1495+
if (!result) return
14901496
const output = result?.output
14911497
if (!output?.hasChanged()) return
1492-
manager.serverReferences[getNormalizedId()] = id
1498+
manager.serverReferenceMetaMap[id] = {
1499+
importId: id,
1500+
referenceKey: getNormalizedId(),
1501+
exportNames: result.exportNames,
1502+
}
14931503
const name =
14941504
this.environment.name === browserEnvironmentName ? 'browser' : 'ssr'
14951505
const importSource = resolvePackage(`${PKG_NAME}/react/${name}`)
@@ -1505,7 +1515,19 @@ function vitePluginUseServer(
15051515
if (this.environment.mode === 'dev') {
15061516
return { code: `export {}`, map: null }
15071517
}
1508-
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+
const exports = meta.exportNames.join(',')
1523+
code += `
1524+
${key}: async () => {
1525+
const {${exports}} = await import(${id});
1526+
return {${exports}};
1527+
},
1528+
`
1529+
}
1530+
code = `export default {${code}};\n`
15091531
return { code, map: null }
15101532
}),
15111533
]
@@ -1550,16 +1572,6 @@ function createVirtualPlugin(name: string, load: Plugin['load']) {
15501572
} satisfies Plugin
15511573
}
15521574

1553-
function generateDynamicImportCode(map: Record<string, string>) {
1554-
let code = Object.entries(map)
1555-
.map(
1556-
([key, id]) =>
1557-
`${JSON.stringify(key)}: () => import(${JSON.stringify(id)}),`,
1558-
)
1559-
.join('\n')
1560-
return `export default {${code}};\n`
1561-
}
1562-
15631575
class RuntimeAsset {
15641576
runtime: string
15651577
constructor(value: string) {

0 commit comments

Comments
 (0)