@@ -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