From a735eab310b2303f6ce71c9164a01b27f0c12851 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Aug 2025 12:22:06 +0900 Subject: [PATCH 1/9] fix(rsc): remove duplicate server css on initial render --- packages/plugin-rsc/src/plugin.ts | 48 +++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 1181c7d1..0e1d0060 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -1910,6 +1910,34 @@ export function vitePluginRscCss( } }, }, + createVirtualPlugin( + 'vite-rsc/remove-duplicate-server-css', + async function () { + assert.equal(this.environment.mode, 'dev') + function removeFn() { + document + .querySelectorAll("link[rel='stylesheet']") + .forEach((node) => { + if ( + node instanceof HTMLElement && + node.dataset.precedence?.startsWith('vite-rsc/') + ) { + node.remove() + } + }) + } + return `\ +"use client" +import React from "react"; +export default function RemoveDuplicateServerCss() { + React.useEffect(() => { + (${removeFn.toString()})(); + }, []); + return null; +} +` + }, + ), ] } @@ -1940,6 +1968,7 @@ function generateResourcesCode(depsCode: string) { const ResourcesFn = ( React: typeof import('react'), deps: ResolvedAssetDeps, + RemoveDuplicateServerCss?: React.FC, ) => { return function Resources() { return React.createElement(React.Fragment, null, [ @@ -1960,14 +1989,27 @@ function generateResourcesCode(depsCode: string) { src: href, }), ), + RemoveDuplicateServerCss && + React.createElement(RemoveDuplicateServerCss, { key: '' }), ]) } } return ` - import __vite_rsc_react__ from "react"; - export const Resources = (${ResourcesFn.toString()})(__vite_rsc_react__, ${depsCode}); - ` +import __vite_rsc_react__ from "react"; + +${ + config.mode === 'serve' + ? `import RemoveDuplicateServerCss from "virtual:vite-rsc/remove-duplicate-server-css"` + : `const RemoveDuplicateServerCss = undefined;` +} + +export const Resources = (${ResourcesFn.toString()})( + __vite_rsc_react__, + ${depsCode}, + RemoveDuplicateServerCss, +); +` } export async function transformRscCssExport(options: { From cadf8499b10393f32cdbf5098f409e2f61f7b86c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Aug 2025 12:24:37 +0900 Subject: [PATCH 2/9] chore: cleanup --- packages/plugin-rsc/src/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 0e1d0060..52cd8230 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -2000,7 +2000,7 @@ import __vite_rsc_react__ from "react"; ${ config.mode === 'serve' - ? `import RemoveDuplicateServerCss from "virtual:vite-rsc/remove-duplicate-server-css"` + ? `import RemoveDuplicateServerCss from "virtual:vite-rsc/remove-duplicate-server-css";` : `const RemoveDuplicateServerCss = undefined;` } From f5102896b5193518e2741942a7ac0a20d00bc3b7 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Aug 2025 12:31:37 +0900 Subject: [PATCH 3/9] chore: tweak --- packages/plugin-rsc/src/plugin.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 52cd8230..dd495445 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -1913,6 +1913,8 @@ export function vitePluginRscCss( createVirtualPlugin( 'vite-rsc/remove-duplicate-server-css', async function () { + // Remove duplicate css during dev due to server rendered and client inline