Skip to content

Commit 2640add

Browse files
authored
fix(rsc): include non-entry optimized modules for optimizeDeps.exclude suggestion (#740)
1 parent 5b28ba5 commit 2640add

File tree

1 file changed

+108
-10
lines changed

1 file changed

+108
-10
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 108 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -956,21 +956,21 @@ function vitePluginUseClient(
956956
const browserEnvironmentName =
957957
useClientPluginOptions.environment?.browser ?? 'client'
958958

959+
let optimizerMetadata: CustomOptimizerMetadata | undefined
960+
959961
// TODO: warning for late optimizer discovery
960962
function warnInoncistentClientOptimization(
961963
ctx: Rollup.TransformPluginContext,
962964
id: string,
963965
) {
964-
const { depsOptimizer } = server.environments.client
965-
if (depsOptimizer) {
966-
for (const dep of Object.values(depsOptimizer.metadata.optimized)) {
967-
if (dep.src === id) {
968-
ctx.warn(
969-
`client component dependency is inconsistently optimized. ` +
970-
`It's recommended to add the dependency to 'optimizeDeps.exclude'.`,
971-
)
972-
}
973-
}
966+
// path in metafile is relative to cwd
967+
// https://github.com/vitejs/vite/blob/dd96c2cd831ecba3874458b318ad4f0a7f173736/packages/vite/src/node/optimizer/index.ts#L644
968+
id = normalizePath(path.relative(process.cwd(), id))
969+
if (optimizerMetadata?.ids.includes(id)) {
970+
ctx.warn(
971+
`client component dependency is inconsistently optimized. ` +
972+
`It's recommended to add the dependency to 'optimizeDeps.exclude'.`,
973+
)
974974
}
975975
}
976976

@@ -1160,6 +1160,104 @@ function vitePluginUseClient(
11601160
}
11611161
},
11621162
},
1163+
...customOptimizerMetadataPlugin({
1164+
setMetadata: (metadata) => {
1165+
optimizerMetadata = metadata
1166+
},
1167+
}),
1168+
]
1169+
}
1170+
1171+
type CustomOptimizerMetadata = {
1172+
ids: string[]
1173+
}
1174+
1175+
function customOptimizerMetadataPlugin({
1176+
setMetadata,
1177+
}: {
1178+
setMetadata: (metadata: CustomOptimizerMetadata) => void
1179+
}): Plugin[] {
1180+
const MEATADATA_FILE = '_metadata-rsc.json'
1181+
1182+
type EsbuildPlugin = NonNullable<
1183+
NonNullable<ResolvedConfig['optimizeDeps']['esbuildOptions']>['plugins']
1184+
>[number]
1185+
1186+
function optimizerPluginEsbuild(): EsbuildPlugin {
1187+
return {
1188+
name: 'vite-rsc-metafile',
1189+
setup(build) {
1190+
build.onEnd((result) => {
1191+
// skip scan
1192+
if (!result.metafile?.inputs || !build.initialOptions.outdir) return
1193+
1194+
const ids = Object.keys(result.metafile.inputs)
1195+
const metadata: CustomOptimizerMetadata = { ids }
1196+
setMetadata(metadata)
1197+
fs.writeFileSync(
1198+
path.join(build.initialOptions.outdir, MEATADATA_FILE),
1199+
JSON.stringify(metadata, null, 2),
1200+
)
1201+
})
1202+
},
1203+
}
1204+
}
1205+
1206+
function optimizerPluginRolldown(): Rollup.Plugin {
1207+
return {
1208+
name: 'vite-rsc-metafile',
1209+
writeBundle(options) {
1210+
assert(options.dir)
1211+
const ids = [...this.getModuleIds()].map((id) =>
1212+
path.relative(process.cwd(), id),
1213+
)
1214+
const metadata: CustomOptimizerMetadata = { ids }
1215+
setMetadata(metadata)
1216+
fs.writeFileSync(
1217+
path.join(options.dir!, MEATADATA_FILE),
1218+
JSON.stringify(metadata, null, 2),
1219+
)
1220+
},
1221+
}
1222+
}
1223+
1224+
return [
1225+
{
1226+
name: 'rsc:use-client:optimizer-metadata',
1227+
apply: 'serve',
1228+
config() {
1229+
return {
1230+
environments: {
1231+
client: {
1232+
optimizeDeps:
1233+
'rolldownVersion' in this.meta
1234+
? ({
1235+
rolldownOptions: {
1236+
plugins: [optimizerPluginRolldown()],
1237+
},
1238+
} as any)
1239+
: {
1240+
esbuildOptions: {
1241+
plugins: [optimizerPluginEsbuild()],
1242+
},
1243+
},
1244+
},
1245+
},
1246+
}
1247+
},
1248+
configResolved(config) {
1249+
// https://github.com/vitejs/vite/blob/84079a84ad94de4c1ef4f1bdb2ab448ff2c01196/packages/vite/src/node/optimizer/index.ts#L941
1250+
const file = path.join(config.cacheDir, 'deps', MEATADATA_FILE)
1251+
if (fs.existsSync(file)) {
1252+
try {
1253+
const metadata = JSON.parse(fs.readFileSync(file, 'utf-8'))
1254+
setMetadata(metadata)
1255+
} catch (e) {
1256+
this.warn(`failed to load '${file}'`)
1257+
}
1258+
}
1259+
},
1260+
},
11631261
]
11641262
}
11651263

0 commit comments

Comments
 (0)