@@ -993,6 +993,21 @@ export default assetsManifest.bootstrapScriptContent;
993
993
async function ( ) {
994
994
assert ( this . environment . mode === 'dev' )
995
995
let code = ''
996
+ code += `;(${ ( ) => {
997
+ const nodes = document . querySelectorAll < HTMLStyleElement > ( 'style' )
998
+ nodes . forEach ( ( node ) => {
999
+ if (
1000
+ node . dataset . precedence ?. startsWith (
1001
+ 'vite-rsc/importer-resources/' ,
1002
+ )
1003
+ ) {
1004
+ const id = node . dataset . precedence . slice (
1005
+ 'vite-rsc/importer-resources/' . length ,
1006
+ )
1007
+ node . dataset . viteDevId = id
1008
+ }
1009
+ } )
1010
+ } } )();`
996
1011
// enable hmr only when react plugin is available
997
1012
const resolved = await this . resolve ( '/@react-refresh' )
998
1013
if ( resolved ) {
@@ -2187,8 +2202,13 @@ function vitePluginRscCss(
2187
2202
for ( const file of [ importer , ...result . visitedFiles ] ) {
2188
2203
this . addWatchFile ( file )
2189
2204
}
2190
- return generateResourcesCode2 ( result . styles , manager )
2191
-
2205
+ const jsHrefs = [
2206
+ `/@id/__x00__${ toCssVirtual ( { id : importer , type : 'rsc-browser' } ) } ` ,
2207
+ ]
2208
+ return generateResourcesCode2 (
2209
+ { styles : result . styles , js : jsHrefs } ,
2210
+ manager ,
2211
+ )
2192
2212
// const result = collectCss(server.environments.rsc!, importer)
2193
2213
// for (const file of [importer, ...result.visitedFiles]) {
2194
2214
// this.addWatchFile(file)
@@ -2213,6 +2233,23 @@ function vitePluginRscCss(
2213
2233
`
2214
2234
}
2215
2235
}
2236
+ if ( parsed ?. type === 'rsc-browser' ) {
2237
+ assert ( this . environment . name === 'client' )
2238
+ assert ( this . environment . mode === 'dev' )
2239
+ const importer = parsed . id
2240
+ const result = collectCss ( server . environments . rsc ! , importer )
2241
+ for ( const file of [ importer , ...result . visitedFiles ] ) {
2242
+ this . addWatchFile ( file )
2243
+ }
2244
+ let code = result . ids
2245
+ . map ( ( id ) => id . replace ( / ^ \0 / , '' ) )
2246
+ . map ( ( id ) => `import ${ JSON . stringify ( id ) } ;\n` )
2247
+ . join ( '' )
2248
+ // ensure hmr boundary at this virtual since otherwise non-self accepting css
2249
+ // (e.g. css module) causes full reload
2250
+ code += `if (import.meta.hot) { import.meta.hot.accept() }\n`
2251
+ return code
2252
+ }
2216
2253
} ,
2217
2254
} ,
2218
2255
createVirtualPlugin (
@@ -2249,30 +2286,39 @@ export default function RemoveDuplicateServerCss() {
2249
2286
}
2250
2287
2251
2288
function generateResourcesCode2 (
2252
- styles : Record < string , string > ,
2289
+ deps : { styles : Record < string , string > ; js : string [ ] } ,
2253
2290
manager : RscPluginManager ,
2254
2291
) {
2255
2292
const ResourcesFn = (
2256
2293
React : typeof import ( 'react' ) ,
2257
- styles : Record < string , string > ,
2294
+ deps : { styles : Record < string , string > ; js : string [ ] } ,
2258
2295
RemoveDuplicateServerCss ?: React . FC ,
2259
2296
) => {
2260
2297
return function Resources ( ) {
2261
2298
return React . createElement ( React . Fragment , null , [
2262
- ...Object . entries ( styles ) . map ( ( [ id , content ] ) =>
2299
+ ...Object . entries ( deps . styles ) . map ( ( [ id , content ] ) =>
2263
2300
React . createElement (
2264
2301
'style' ,
2265
2302
{
2266
2303
key : 'css:' + id ,
2267
2304
// https://react.dev/reference/react-dom/components/style#rendering-an-inline-css-stylesheet
2268
2305
href : 'vite-rsc/importer-resources/' + id ,
2269
- precedence : 'vite-rsc/importer-resources' ,
2306
+ precedence : 'vite-rsc/importer-resources/' + id ,
2307
+ // TODO: hoisted style doesn't support arbitrary attributes so they are injected in browser entry
2270
2308
// https://github.com/vitejs/vite/blob/dfd8d8aebec412f56346d078bb00170807f0883e/packages/vite/src/client/client.ts#L504
2271
- 'data-vite-dev-id' : id ,
2309
+ // 'data-vite-dev-id': id,
2272
2310
} ,
2273
2311
content ,
2274
2312
) ,
2275
2313
) ,
2314
+ ...deps . js . map ( ( href : string ) =>
2315
+ React . createElement ( 'script' , {
2316
+ key : 'js:' + href ,
2317
+ type : 'module' ,
2318
+ async : true ,
2319
+ src : href ,
2320
+ } ) ,
2321
+ ) ,
2276
2322
RemoveDuplicateServerCss &&
2277
2323
React . createElement ( RemoveDuplicateServerCss , {
2278
2324
key : 'remove-duplicate-css' ,
2292
2338
2293
2339
export const Resources = (${ ResourcesFn . toString ( ) } )(
2294
2340
__vite_rsc_react__,
2295
- ${ JSON . stringify ( styles ) } ,
2341
+ ${ JSON . stringify ( deps ) } ,
2296
2342
RemoveDuplicateServerCss,
2297
2343
);
2298
2344
`
0 commit comments