Skip to content

Commit e235825

Browse files
allow to control whether CSS links use React's precedence attribute
1 parent caf9bf1 commit e235825

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,12 @@ export type RscPluginOptions = {
238238
/** server chunk which includes a corresponding client reference proxy module */
239239
serverChunk: string
240240
}) => string | undefined
241+
242+
/**
243+
* Controls whether CSS links use React's `precedence` attribute.
244+
* @default true
245+
*/
246+
cssLinkPrecedence?: boolean
241247
}
242248

243249
export type PluginApi = {
@@ -1014,6 +1020,7 @@ export function createRpcClient(params) {
10141020
const manifest: AssetsManifest = {
10151021
bootstrapScriptContent: `import(${serializeValueWithRuntime(entryUrl)})`,
10161022
clientReferenceDeps: {},
1023+
cssLinkPrecedence: rscPluginOptions.cssLinkPrecedence,
10171024
}
10181025
return `export default ${JSON.stringify(manifest, null, 2)}`
10191026
}
@@ -1087,6 +1094,7 @@ export function createRpcClient(params) {
10871094
bootstrapScriptContent,
10881095
clientReferenceDeps,
10891096
serverResources,
1097+
cssLinkPrecedence: rscPluginOptions.cssLinkPrecedence,
10901098
}
10911099
}
10921100
},
@@ -1981,6 +1989,7 @@ export type AssetsManifest = {
19811989
bootstrapScriptContent: string | RuntimeAsset
19821990
clientReferenceDeps: Record<string, AssetDeps>
19831991
serverResources?: Record<string, Pick<AssetDeps, 'css'>>
1992+
cssLinkPrecedence?: boolean
19841993
}
19851994

19861995
export type AssetDeps = {
@@ -1992,6 +2001,7 @@ export type ResolvedAssetsManifest = {
19922001
bootstrapScriptContent: string
19932002
clientReferenceDeps: Record<string, ResolvedAssetDeps>
19942003
serverResources?: Record<string, Pick<ResolvedAssetDeps, 'css'>>
2004+
cssLinkPrecedence?: boolean
19952005
}
19962006

19972007
export type ResolvedAssetDeps = {
@@ -2060,7 +2070,10 @@ function collectAssetDepsInner(
20602070
//
20612071

20622072
function vitePluginRscCss(
2063-
rscCssOptions: Pick<RscPluginOptions, 'rscCssTransform'> = {},
2073+
rscCssOptions: Pick<
2074+
RscPluginOptions,
2075+
'rscCssTransform' | 'cssLinkPrecedence'
2076+
> = {},
20642077
manager: RscPluginManager,
20652078
): Plugin[] {
20662079
function hasSpecialCssQuery(id: string): boolean {
@@ -2320,6 +2333,7 @@ function vitePluginRscCss(
23202333
return generateResourcesCode(
23212334
serializeValueWithRuntime(deps),
23222335
manager,
2336+
{ cssLinkPrecedence: rscCssOptions.cssLinkPrecedence },
23232337
)
23242338
} else {
23252339
const key = manager.toRelativeId(importer)
@@ -2331,6 +2345,7 @@ function vitePluginRscCss(
23312345
key,
23322346
)}]`,
23332347
manager,
2348+
{ cssLinkPrecedence: rscCssOptions.cssLinkPrecedence },
23342349
)}
23352350
`
23362351
}
@@ -2370,19 +2385,25 @@ export default function RemoveDuplicateServerCss() {
23702385
]
23712386
}
23722387

2373-
function generateResourcesCode(depsCode: string, manager: RscPluginManager) {
2388+
function generateResourcesCode(
2389+
depsCode: string,
2390+
manager: RscPluginManager,
2391+
options: { cssLinkPrecedence?: boolean } = {},
2392+
) {
2393+
const usePrecedence = options.cssLinkPrecedence !== false
23742394
const ResourcesFn = (
23752395
React: typeof import('react'),
23762396
deps: ResolvedAssetDeps,
23772397
RemoveDuplicateServerCss?: React.FC,
2398+
precedence?: string,
23782399
) => {
23792400
return function Resources() {
23802401
return React.createElement(React.Fragment, null, [
23812402
...deps.css.map((href: string) =>
23822403
React.createElement('link', {
23832404
key: 'css:' + href,
23842405
rel: 'stylesheet',
2385-
precedence: 'vite-rsc/importer-resources',
2406+
...(precedence ? { precedence } : {}),
23862407
href: href,
23872408
'data-rsc-css-href': href,
23882409
}),
@@ -2408,6 +2429,7 @@ export const Resources = (${ResourcesFn.toString()})(
24082429
__vite_rsc_react__,
24092430
${depsCode},
24102431
RemoveDuplicateServerCss,
2432+
${usePrecedence ? `"vite-rsc/importer-resources"` : `undefined`},
24112433
);
24122434
`
24132435
}

packages/plugin-rsc/src/ssr.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ function preloadDeps(deps: ResolvedAssetDeps) {
6767
for (const href of deps.css) {
6868
ReactDOM.preinit(href, {
6969
as: 'style',
70-
precedence: 'vite-rsc/client-reference',
70+
precedence:
71+
assetsManifest.cssLinkPrecedence !== false
72+
? 'vite-rsc/client-reference'
73+
: undefined,
7174
})
7275
}
7376
}

0 commit comments

Comments
 (0)