Skip to content

Commit 1b8f127

Browse files
committed
wip
1 parent a25198f commit 1b8f127

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

packages/plugin-rsc/src/plugin.ts

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,21 @@ export default assetsManifest.bootstrapScriptContent;
993993
async function () {
994994
assert(this.environment.mode === 'dev')
995995
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+
}})();`
9961011
// enable hmr only when react plugin is available
9971012
const resolved = await this.resolve('/@react-refresh')
9981013
if (resolved) {
@@ -2187,8 +2202,13 @@ function vitePluginRscCss(
21872202
for (const file of [importer, ...result.visitedFiles]) {
21882203
this.addWatchFile(file)
21892204
}
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+
)
21922212
// const result = collectCss(server.environments.rsc!, importer)
21932213
// for (const file of [importer, ...result.visitedFiles]) {
21942214
// this.addWatchFile(file)
@@ -2213,6 +2233,23 @@ function vitePluginRscCss(
22132233
`
22142234
}
22152235
}
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+
}
22162253
},
22172254
},
22182255
createVirtualPlugin(
@@ -2249,30 +2286,39 @@ export default function RemoveDuplicateServerCss() {
22492286
}
22502287

22512288
function generateResourcesCode2(
2252-
styles: Record<string, string>,
2289+
deps: { styles: Record<string, string>; js: string[] },
22532290
manager: RscPluginManager,
22542291
) {
22552292
const ResourcesFn = (
22562293
React: typeof import('react'),
2257-
styles: Record<string, string>,
2294+
deps: { styles: Record<string, string>; js: string[] },
22582295
RemoveDuplicateServerCss?: React.FC,
22592296
) => {
22602297
return function Resources() {
22612298
return React.createElement(React.Fragment, null, [
2262-
...Object.entries(styles).map(([id, content]) =>
2299+
...Object.entries(deps.styles).map(([id, content]) =>
22632300
React.createElement(
22642301
'style',
22652302
{
22662303
key: 'css:' + id,
22672304
// https://react.dev/reference/react-dom/components/style#rendering-an-inline-css-stylesheet
22682305
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
22702308
// 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,
22722310
},
22732311
content,
22742312
),
22752313
),
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+
),
22762322
RemoveDuplicateServerCss &&
22772323
React.createElement(RemoveDuplicateServerCss, {
22782324
key: 'remove-duplicate-css',
@@ -2292,7 +2338,7 @@ ${
22922338
22932339
export const Resources = (${ResourcesFn.toString()})(
22942340
__vite_rsc_react__,
2295-
${JSON.stringify(styles)},
2341+
${JSON.stringify(deps)},
22962342
RemoveDuplicateServerCss,
22972343
);
22982344
`

packages/plugin-rsc/src/plugins/shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
type CssVirtual = {
22
id: string
3-
type: 'ssr' | 'rsc'
3+
type: 'ssr' | 'rsc' | 'rsc-browser'
44
}
55

66
export function toCssVirtual({ id, type }: CssVirtual) {

0 commit comments

Comments
 (0)