Skip to content

Commit 29562fb

Browse files
committed
wip
1 parent 96e0391 commit 29562fb

2 files changed

Lines changed: 82 additions & 22 deletions

File tree

packages/plugin-rsc/e2e/import-asset.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ test.describe('viteRsc.importAsset', () => {
2222
`,
2323
),
2424
},
25+
// Remove "index" client entry to test importAsset replacing the convention
26+
'vite.config.base.ts': { cp: 'vite.config.ts' },
27+
'vite.config.ts': /* js */ `
28+
import baseConfig from './vite.config.base.ts'
29+
delete baseConfig.environments.client.build.rollupOptions.input;
30+
export default baseConfig;
31+
`,
2532
},
2633
})
2734
})

packages/plugin-rsc/src/plugin.ts

Lines changed: 75 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,30 +1078,34 @@ export function createRpcClient(params) {
10781078
}
10791079

10801080
const assetDeps = collectAssetDeps(bundle)
1081-
const entry = Object.values(assetDeps).find(
1082-
(v) => v.chunk.name === 'index' && v.chunk.isEntry,
1083-
)
1084-
assert(entry)
1085-
const entryUrl = assetsURL(entry.chunk.fileName, manager)
1086-
const clientReferenceDeps: Record<string, AssetDeps> = {}
1087-
for (const meta of Object.values(manager.clientReferenceMetaMap)) {
1088-
const deps: AssetDeps = assetDeps[meta.groupChunkId!]?.deps ?? {
1089-
js: [],
1090-
css: [],
1081+
1082+
// Check if there are any importAsset entries with isEntry: true
1083+
const importAssetEntries: Array<{
1084+
resolvedId: string
1085+
chunk: Rollup.OutputChunk
1086+
deps: AssetDeps
1087+
}> = []
1088+
for (const metas of Object.values(manager.assetImportMetaMap)) {
1089+
for (const [resolvedId, meta] of Object.entries(metas)) {
1090+
if (meta.isEntry) {
1091+
const chunk = Object.values(bundle).find(
1092+
(c): c is Rollup.OutputChunk =>
1093+
c.type === 'chunk' && c.facadeModuleId === resolvedId,
1094+
)
1095+
if (chunk) {
1096+
const chunkDeps = assetDeps[chunk.fileName]
1097+
if (chunkDeps) {
1098+
importAssetEntries.push({
1099+
resolvedId,
1100+
chunk,
1101+
deps: chunkDeps.deps,
1102+
})
1103+
}
1104+
}
1105+
}
10911106
}
1092-
clientReferenceDeps[meta.referenceKey] = assetsURLOfDeps(
1093-
mergeAssetDeps(deps, entry.deps),
1094-
manager,
1095-
)
1096-
}
1097-
let bootstrapScriptContent: string | RuntimeAsset
1098-
if (typeof entryUrl === 'string') {
1099-
bootstrapScriptContent = `import(${JSON.stringify(entryUrl)})`
1100-
} else {
1101-
bootstrapScriptContent = new RuntimeAsset(
1102-
`"import(" + JSON.stringify(${entryUrl.runtime}) + ")"`,
1103-
)
11041107
}
1108+
11051109
// Compute importAssets from assetImportMetaMap
11061110
const importAssets: Record<string, { url: string | RuntimeAsset }> =
11071111
{}
@@ -1119,6 +1123,55 @@ export function createRpcClient(params) {
11191123
}
11201124
}
11211125

1126+
let bootstrapScriptContent: string | RuntimeAsset = ''
1127+
const clientReferenceDeps: Record<string, AssetDeps> = {}
1128+
1129+
if (importAssetEntries.length > 0) {
1130+
// Use importAsset entries for merging deps into client references
1131+
// Merge all entry deps together
1132+
let entryDeps: AssetDeps = { js: [], css: [] }
1133+
for (const entry of importAssetEntries) {
1134+
entryDeps = mergeAssetDeps(entryDeps, entry.deps)
1135+
}
1136+
for (const meta of Object.values(manager.clientReferenceMetaMap)) {
1137+
const deps: AssetDeps = assetDeps[meta.groupChunkId!]?.deps ?? {
1138+
js: [],
1139+
css: [],
1140+
}
1141+
clientReferenceDeps[meta.referenceKey] = assetsURLOfDeps(
1142+
mergeAssetDeps(deps, entryDeps),
1143+
manager,
1144+
)
1145+
}
1146+
} else {
1147+
// Fall back to "index" entry convention
1148+
const entry = Object.values(assetDeps).find(
1149+
(v) => v.chunk.name === 'index' && v.chunk.isEntry,
1150+
)
1151+
assert(
1152+
entry,
1153+
`[vite-rsc] missing "index" entry. Use importAsset with { entry: true } or configure client entry.`,
1154+
)
1155+
const entryUrl = assetsURL(entry.chunk.fileName, manager)
1156+
for (const meta of Object.values(manager.clientReferenceMetaMap)) {
1157+
const deps: AssetDeps = assetDeps[meta.groupChunkId!]?.deps ?? {
1158+
js: [],
1159+
css: [],
1160+
}
1161+
clientReferenceDeps[meta.referenceKey] = assetsURLOfDeps(
1162+
mergeAssetDeps(deps, entry.deps),
1163+
manager,
1164+
)
1165+
}
1166+
if (typeof entryUrl === 'string') {
1167+
bootstrapScriptContent = `import(${JSON.stringify(entryUrl)})`
1168+
} else {
1169+
bootstrapScriptContent = new RuntimeAsset(
1170+
`"import(" + JSON.stringify(${entryUrl.runtime}) + ")"`,
1171+
)
1172+
}
1173+
}
1174+
11221175
manager.buildAssetsManifest = {
11231176
bootstrapScriptContent,
11241177
clientReferenceDeps,

0 commit comments

Comments
 (0)