@@ -1026,6 +1026,17 @@ import.meta.hot.on("rsc:update", () => {
10261026 document.querySelectorAll("vite-error-overlay").forEach((n) => n.close())
10271027});
10281028`
1029+ // remove stylesheet links when css import is removed on rsc envrionment
1030+ code += `import.meta.hot.on("rsc:prune", ${ ( e : vite . PrunePayload ) => {
1031+ const nodes = document . querySelectorAll < HTMLLinkElement > (
1032+ "link[rel='stylesheet']" ,
1033+ )
1034+ nodes . forEach ( ( node ) => {
1035+ if ( e . paths . includes ( node . dataset . rscCssHref ! ) ) {
1036+ node . remove ( )
1037+ }
1038+ } )
1039+ } } );`
10291040 return code
10301041 } ,
10311042 ) ,
@@ -2031,6 +2042,22 @@ function vitePluginRscCss(
20312042 } ,
20322043 {
20332044 name : 'rsc:importer-resources' ,
2045+ configureServer ( server ) {
2046+ // delegate 'prune' event from rsc environment to browser
2047+ const hot = server . environments . rsc ! . hot
2048+ const original = hot . send
2049+ hot . send = function ( this , ...args : any [ ] ) {
2050+ const e = args [ 0 ] as vite . PrunePayload
2051+ if ( e && typeof e === 'object' && e . type === 'prune' ) {
2052+ server . environments . client . hot . send ( {
2053+ type : 'custom' ,
2054+ event : 'rsc:prune' ,
2055+ data : e ,
2056+ } )
2057+ }
2058+ return original . apply ( this , args as any )
2059+ }
2060+ } ,
20342061 async transform ( code , id ) {
20352062 if ( ! code . includes ( 'import.meta.viteRsc.loadCss' ) ) return
20362063
@@ -2175,6 +2202,7 @@ function generateResourcesCode(depsCode: string, manager: RscPluginManager) {
21752202 rel : 'stylesheet' ,
21762203 precedence : 'vite-rsc/importer-resources' ,
21772204 href : href ,
2205+ 'data-rsc-css-href' : href ,
21782206 } ) ,
21792207 ) ,
21802208 RemoveDuplicateServerCss &&
0 commit comments