Skip to content

Commit 9988f54

Browse files
authored
refactor(rsc): simplify plugin state for server reference (#751)
1 parent 232be7b commit 9988f54

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5967
const PKG_NAME = '@vitejs/plugin-rsc'
6068
const 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-
15561569
class RuntimeAsset {
15571570
runtime: string
15581571
constructor(value: string) {

0 commit comments

Comments
 (0)