@@ -36,6 +36,7 @@ import {
36
36
cleanUrl ,
37
37
directRequestRE ,
38
38
evalValue ,
39
+ injectQuery ,
39
40
normalizeViteImportAnalysisUrl ,
40
41
prepareError ,
41
42
} from './plugins/vite-utils'
@@ -1923,6 +1924,55 @@ function vitePluginRscCss(
1923
1924
return { ids : [ ...cssIds ] , hrefs, visitedFiles : [ ...visitedFiles ] }
1924
1925
}
1925
1926
1927
+ async function collectCss2 (
1928
+ environment : DevEnvironment ,
1929
+ clientEnvironment : DevEnvironment ,
1930
+ entryId : string ,
1931
+ ) {
1932
+ const visited = new Set < string > ( )
1933
+ const cssIds = new Set < string > ( )
1934
+ const visitedFiles = new Set < string > ( )
1935
+
1936
+ function recurse ( id : string ) {
1937
+ if ( visited . has ( id ) ) {
1938
+ return
1939
+ }
1940
+ visited . add ( id )
1941
+ const mod = environment . moduleGraph . getModuleById ( id )
1942
+ if ( mod ?. file ) {
1943
+ visitedFiles . add ( mod . file )
1944
+ }
1945
+ for ( const next of mod ?. importedModules ?? [ ] ) {
1946
+ if ( next . id ) {
1947
+ if ( isCSSRequest ( next . id ) ) {
1948
+ if ( hasSpecialCssQuery ( next . id ) ) {
1949
+ continue
1950
+ }
1951
+ cssIds . add ( next . id )
1952
+ } else {
1953
+ recurse ( next . id )
1954
+ }
1955
+ }
1956
+ }
1957
+ }
1958
+
1959
+ recurse ( entryId )
1960
+
1961
+ const styles : Record < string , string > = { }
1962
+ for ( const id of cssIds ) {
1963
+ try {
1964
+ const result = await clientEnvironment . transformRequest (
1965
+ injectQuery ( id , 'direct' ) ,
1966
+ )
1967
+ styles [ id ] = result ?. code ?? ''
1968
+ } catch ( e ) {
1969
+ console . error ( `[collectCss failed '${ id } ']` , e )
1970
+ }
1971
+ }
1972
+
1973
+ return { ids : [ ...cssIds ] , styles, visitedFiles : [ ...visitedFiles ] }
1974
+ }
1975
+
1926
1976
function getRscCssTransformFilter ( {
1927
1977
id,
1928
1978
code,
@@ -2122,23 +2172,33 @@ function vitePluginRscCss(
2122
2172
}
2123
2173
}
2124
2174
} ,
2125
- load ( id ) {
2175
+ async load ( id ) {
2126
2176
const { server } = manager
2127
2177
const parsed = parseCssVirtual ( id )
2128
2178
if ( parsed ?. type === 'rsc' ) {
2129
2179
assert ( this . environment . name === 'rsc' )
2130
2180
const importer = parsed . id
2131
2181
if ( this . environment . mode === 'dev' ) {
2132
- const result = collectCss ( server . environments . rsc ! , importer )
2182
+ const result = await collectCss2 (
2183
+ server . environments . rsc ! ,
2184
+ server . environments . client ,
2185
+ importer ,
2186
+ )
2133
2187
for ( const file of [ importer , ...result . visitedFiles ] ) {
2134
2188
this . addWatchFile ( file )
2135
2189
}
2136
- const cssHrefs = result . hrefs . map ( ( href ) => href . slice ( 1 ) )
2137
- const deps = assetsURLOfDeps ( { css : cssHrefs , js : [ ] } , manager )
2138
- return generateResourcesCode (
2139
- serializeValueWithRuntime ( deps ) ,
2140
- manager ,
2141
- )
2190
+ return generateResourcesCode2 ( result . styles , manager )
2191
+
2192
+ // const result = collectCss(server.environments.rsc!, importer)
2193
+ // for (const file of [importer, ...result.visitedFiles]) {
2194
+ // this.addWatchFile(file)
2195
+ // }
2196
+ // const cssHrefs = result.hrefs.map((href) => href.slice(1))
2197
+ // const deps = assetsURLOfDeps({ css: cssHrefs, js: [] }, manager)
2198
+ // return generateResourcesCode(
2199
+ // serializeValueWithRuntime(deps),
2200
+ // manager,
2201
+ // )
2142
2202
} else {
2143
2203
const key = manager . toRelativeId ( importer )
2144
2204
manager . serverResourcesMetaMap [ importer ] = { key }
@@ -2188,6 +2248,55 @@ export default function RemoveDuplicateServerCss() {
2188
2248
]
2189
2249
}
2190
2250
2251
+ function generateResourcesCode2 (
2252
+ styles : Record < string , string > ,
2253
+ manager : RscPluginManager ,
2254
+ ) {
2255
+ const ResourcesFn = (
2256
+ React : typeof import ( 'react' ) ,
2257
+ styles : Record < string , string > ,
2258
+ RemoveDuplicateServerCss ?: React . FC ,
2259
+ ) => {
2260
+ return function Resources ( ) {
2261
+ return React . createElement ( React . Fragment , null , [
2262
+ ...Object . entries ( styles ) . map ( ( [ id , content ] ) =>
2263
+ React . createElement (
2264
+ 'style' ,
2265
+ {
2266
+ key : 'css:' + id ,
2267
+ rel : 'stylesheet' ,
2268
+ precedence : 'vite-rsc/importer-resources' ,
2269
+ // href: href,
2270
+ // 'data-rsc-css-href': href,
2271
+ } ,
2272
+ content ,
2273
+ ) ,
2274
+ ) ,
2275
+ RemoveDuplicateServerCss &&
2276
+ React . createElement ( RemoveDuplicateServerCss , {
2277
+ key : 'remove-duplicate-css' ,
2278
+ } ) ,
2279
+ ] )
2280
+ }
2281
+ }
2282
+
2283
+ return `
2284
+ import __vite_rsc_react__ from "react";
2285
+
2286
+ ${
2287
+ manager . config . command === 'serve'
2288
+ ? `import RemoveDuplicateServerCss from "virtual:vite-rsc/remove-duplicate-server-css";`
2289
+ : `const RemoveDuplicateServerCss = undefined;`
2290
+ }
2291
+
2292
+ export const Resources = (${ ResourcesFn . toString ( ) } )(
2293
+ __vite_rsc_react__,
2294
+ ${ JSON . stringify ( styles ) } ,
2295
+ RemoveDuplicateServerCss,
2296
+ );
2297
+ `
2298
+ }
2299
+
2191
2300
function generateResourcesCode ( depsCode : string , manager : RscPluginManager ) {
2192
2301
const ResourcesFn = (
2193
2302
React : typeof import ( 'react' ) ,
0 commit comments