@@ -956,21 +956,21 @@ function vitePluginUseClient(
956
956
const browserEnvironmentName =
957
957
useClientPluginOptions . environment ?. browser ?? 'client'
958
958
959
+ let optimizerMetadata : CustomOptimizerMetadata | undefined
960
+
959
961
// TODO: warning for late optimizer discovery
960
962
function warnInoncistentClientOptimization (
961
963
ctx : Rollup . TransformPluginContext ,
962
964
id : string ,
963
965
) {
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
+ )
974
974
}
975
975
}
976
976
@@ -1160,6 +1160,104 @@ function vitePluginUseClient(
1160
1160
}
1161
1161
} ,
1162
1162
} ,
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
+ } ,
1163
1261
]
1164
1262
}
1165
1263
0 commit comments