diff --git a/packages/plugin-rsc/examples/starter/vite.config.ts b/packages/plugin-rsc/examples/starter/vite.config.ts index 99837202c..f4e5035b6 100644 --- a/packages/plugin-rsc/examples/starter/vite.config.ts +++ b/packages/plugin-rsc/examples/starter/vite.config.ts @@ -1,7 +1,7 @@ import rsc from '@vitejs/plugin-rsc' import react from '@vitejs/plugin-react' import { defineConfig } from 'vite' -// import inspect from "vite-plugin-inspect"; +import inspect from 'vite-plugin-inspect' export default defineConfig({ plugins: [ @@ -20,7 +20,7 @@ export default defineConfig({ // use https://github.com/antfu-collective/vite-plugin-inspect // to understand internal transforms required for RSC. - // inspect(), + inspect(), ], // specify entry point for each environment. diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 1181c7d1e..fb0c08b48 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -1849,14 +1849,24 @@ export function vitePluginRscCss( parseIdQuery(id).query['importer']!, ) if (this.environment.mode === 'dev') { + const environment = server.environments.rsc! const result = collectCss(server.environments.rsc!, importer) - const cssHrefs = result.hrefs.map((href) => href.slice(1)) - const jsHrefs = [ - '@id/__x00__virtual:vite-rsc/importer-resources-browser?importer=' + - encodeURIComponent(importer), - ] - const deps = assetsURLOfDeps({ css: cssHrefs, js: jsHrefs }) - return generateResourcesCode(serializeValueWithRuntime(deps)) + for (const id of result.ids) { + const mod = environment.moduleGraph.getModuleById(id) + console.log(mod) + } + // const cssHrefs = result.hrefs.map((href) => href.slice(1)) + const cssHmrJs = `@id/__x00__virtual:vite-rsc/importer-resources-browser?importer=${encodeURIComponent(importer)}` + // const jsHrefs = [ + // '@id/__x00__virtual:vite-rsc/importer-resources-browser?importer=' + + // encodeURIComponent(importer), + // ] + // const deps = assetsURLOfDeps({ css: cssHrefs, js: jsHrefs }) + // return generateResourcesCode(serializeValueWithRuntime(deps)) + return generateResourcesCodeDev({ + css: [], + js: [assetsURL(cssHmrJs) as string], + }) } else { const key = normalizePath(path.relative(config.root, importer)) serverResourcesMetaMap[importer] = { key } @@ -1936,6 +1946,46 @@ function collectModuleDependents(mods: EnvironmentModuleNode[]) { return [...visited] } +function generateResourcesCodeDev(deps: { + css: { id: string; content: string }[] + js: string[] +}) { + const ResourcesFn = ( + React: typeof import('react'), + deps: Parameters[0], + ) => { + return function Resources() { + return React.createElement(React.Fragment, null, [ + ...deps.css.map((v) => + React.createElement( + 'style', + { + key: 'css:' + v.id, + 'data-vite-dev-id': v.id, + precedence: 'vite-rsc/importer-resources', + }, + v.content, + ), + ), + // js is only for dev to forward css import on browser to have hmr + ...deps.js.map((href: string) => + React.createElement('script', { + key: 'js:' + href, + type: 'module', + async: true, + src: href, + }), + ), + ]) + } + } + + return ` + import __vite_rsc_react__ from "react"; + export const Resources = (${ResourcesFn.toString()})(__vite_rsc_react__, ${JSON.stringify(deps)}); + ` +} + function generateResourcesCode(depsCode: string) { const ResourcesFn = ( React: typeof import('react'), @@ -1951,6 +2001,7 @@ function generateResourcesCode(depsCode: string) { href: href, }), ), + // TODO: remove // js is only for dev to forward css import on browser to have hmr ...deps.js.map((href: string) => React.createElement('script', { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed7386735..00b76f297 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1864,6 +1864,9 @@ packages: '@napi-rs/wasm-runtime@1.0.1': resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1892,9 +1895,16 @@ packages: resolution: {integrity: sha512-3rzy1bJAZ4s7zV9TKT60x119RwJDCDqEtCwK/Zc2qlm7wGhiIUxLLYUhE/mN91yB0u1kxm5sh4NjU12sPqQTpg==} engines: {node: '>=6.9.0'} + '@oxc-project/runtime@0.81.0': + resolution: {integrity: sha512-zm/LDVOq9FEmHiuM8zO4DWirv0VP2Tv2VsgaiHby9nvpq+FVrcqNYgv+TysLKOITQXWZj/roluTxFvpkHP0Iuw==} + engines: {node: '>=6.9.0'} + '@oxc-project/types@0.80.0': resolution: {integrity: sha512-xxHQm8wfCv2e8EmtaDwpMeAHOWqgQDAYg+BJouLXSQt5oTKu9TIXrgNMGSrM2fLvKmECsRd9uUFAAD+hPyootA==} + '@oxc-project/types@0.81.0': + resolution: {integrity: sha512-CnOqkybZK8z6Gx7Wb1qF7AEnSzbol1WwcIzxYOr8e91LytGOjo0wCpgoYWZo8sdbpqX+X+TJayIzo4Pv0R/KjA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1960,36 +1970,71 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-Gs+313LfR4Ka3hvifdag9r44WrdKQaohya7ZXUXzARF7yx0atzFlVZjsvxtKAw1Vmtr4hB/RjUD1jf73SW7zDw==} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': resolution: {integrity: sha512-BHfHJ8Nb5G7ZKJl6pimJacupONT4F7w6gmQHw41rouAnJF51ORDwGefWeb6OMLzGmJwzxlIVPERfnJf1EsMM7A==} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-W8oMqzGcI7wKPXUtS3WJNXzbghHfNiuM1UBAGpVb+XlUCgYRQJd2PRGP7D3WGql3rR3QEhUvSyAuCBAftPQw6Q==} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.31': resolution: {integrity: sha512-4MiuRtExC08jHbSU/diIL+IuQP+3Ck1FbWAplK+ysQJ7fxT3DMxy5FmnIGfmhaqow8oTjb2GEwZJKgTRjZL1Vw==} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.32': + resolution: {integrity: sha512-pM4c4sKUk37noJrnnDkJknLhCsfZu7aWyfe67bD0GQHfzAPjV16wPeD9CmQg4/0vv+5IfHYaa4VE536xbA+W0Q==} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': resolution: {integrity: sha512-nffC1u7ccm12qlAea8ExY3AvqlaHy/o/3L4p5Es8JFJ3zJSs6e3DyuxGZZVdl9EVwsLxPPTvioIl4tEm2afwyw==} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': + resolution: {integrity: sha512-M8SUgFlYb5kJJWcFC8gUMRiX4WLFxPKMed3SJ2YrxontgIrEcpizPU8nLNVsRYEStoSfKHKExpQw3OP6fm+5bw==} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': resolution: {integrity: sha512-LHmAaB3rB1GOJuHscKcL2Ts/LKLcb3YWTh2uQ/876rg/J9WE9kQ0kZ+3lRSYbth/YL8ln54j4JZmHpqQY3xptQ==} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': + resolution: {integrity: sha512-FuQpbNC/hE//bvv29PFnk0AtpJzdPdYl5CMhlWPovd9g3Kc3lw9TrEPIbL7gRPUdhKAiq6rVaaGvOnXxsa0eww==} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': resolution: {integrity: sha512-oTDZVfqIAjLB2I1yTiLyyhfPPO6dky33sTblxTCpe+ZT55WizN3KDoBKJ4yXG8shI6I4bRShVu29Xg0yAjyQYw==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': + resolution: {integrity: sha512-hRZygRlaGCjcNTNY9GV7dDI18sG1dK3cc7ujHq72LoDad23zFDUGMQjiSxHWK+/r92iMV+j2MiHbvzayxqynsg==} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': resolution: {integrity: sha512-duJ3IkEBj9Xe9NYW1n8Y3483VXHGi8zQ0ZsLbK8464EJUXLF7CXM8Ry+jkkUw+ZvA+Zu1E/+C6p2Y6T9el0C9g==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': + resolution: {integrity: sha512-HzgT6h+CXLs+GKAU0Wvkt3rvcv0CmDBsDjlPhh4GHysOKbG9NjpKYX2zvjx671E9pGbTvcPpwy7gGsy7xpu+8g==} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': resolution: {integrity: sha512-qdbmU5QSZ0uoLZBYMxiHsMQmizqtzFGTVPU5oyU1n0jU0Mo+mkSzqZuL8VBnjHOHzhVxZsoAGH9JjiRzCnoGVA==} cpu: [arm64] @@ -2000,34 +2045,72 @@ packages: cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': + resolution: {integrity: sha512-Ab/wbf6gdzphDbsg51UaxsC93foQ7wxhtg0SVCXd25BrV4MAJ1HoDtKN/f4h0maFmJobkqYub2DlmoasUzkvBg==} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': resolution: {integrity: sha512-zRm2YmzFVqbsmUsyyZnHfJrOlQUcWS/FJ5ZWL8Q1kZh5PnLBrTVZNpakIWwAxpN5gNEi9MmFd5YHocVJp8ps1Q==} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': + resolution: {integrity: sha512-VoxqGEfh5A1Yx+zBp/FR5QwAbtzbuvky2SVc+ii4g1gLD4zww6mt/hPi5zG+b88zYPFBKHpxMtsz9cWqXU5V5Q==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': + resolution: {integrity: sha512-qZ1ViyOUDGbiZrSAJ/FIAhYUElDfVxxFW6DLT/w4KeoZN3HsF4jmRP95mXtl51/oGrqzU9l9Q2f7/P4O/o2ZZA==} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': resolution: {integrity: sha512-fM1eUIuHLsNJXRlWOuIIex1oBJ89I0skFWo5r/D3KSJ5gD9MBd3g4Hp+v1JGohvyFE+7ylnwRxSUyMEeYpA69A==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': + resolution: {integrity: sha512-hEkG3wD+f3wytV0lqwb/uCrXc4r4Ny/DWJFJPfQR3VeMWplhWGgSHNwZc2Q7k86Yi36f9NNzzWmrIuvHI9lCVw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': resolution: {integrity: sha512-4nftR9V2KHH3zjBwf6leuZZJQZ7v0d70ogjHIqB3SDsbDLvVEZiGSsSn2X6blSZRZeJSFzK0pp4kZ67zdZXwSw==} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-k3MvDf8SiA7uP2ikP0unNouJ2YCrnwi7xcVW+RDgMp5YXVr3Xu6svmT3HGn0tkCKUuPmf+uy8I5uiHt5qWQbew==} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': resolution: {integrity: sha512-0TQcKu9xZVHYALit+WJsSuADGlTFfOXhnZoIHWWQhTk3OgbwwbYcSoZUXjRdFmR6Wswn4csHtJGN1oYKeQ6/2g==} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-wAi/FxGh7arDOUG45UmnXE1sZUa0hY4cXAO2qWAjFa3f7bTgz/BqwJ7XN5SUezvAJPNkME4fEpInfnBvM25a0w==} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': resolution: {integrity: sha512-3zMICWwpZh1jrkkKDYIUCx/2wY3PXLICAS0AnbeLlhzfWPhCcpNK9eKhiTlLAZyTp+3kyipoi/ZSVIh+WDnBpQ==} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': + resolution: {integrity: sha512-Ej0i4PZk8ltblZtzVK8ouaGUacUtxRmTm5S9794mdyU/tYxXjAJNseOfxrnHpMWKjMDrOKbqkPqJ52T9NR4LQQ==} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.31': resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} + '@rolldown/pluginutils@1.0.0-beta.32': + resolution: {integrity: sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==} + '@rollup/plugin-replace@6.0.2': resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} engines: {node: '>=14.0.0'} @@ -4289,6 +4372,10 @@ packages: resolution: {integrity: sha512-M2Q+RfG0FMJeSW3RSFTbvtjGVTcQpTQvN247D0EMSsPkpZFoinopR9oAnQiwgogQyzDuvKNnbyCbQQlmNAzSoQ==} hasBin: true + rolldown@1.0.0-beta.32: + resolution: {integrity: sha512-vxI2sPN07MMaoYKlFrVva5qZ1Y7DAZkgp7MQwTnyHt4FUMz9Sh+YeCzNFV9JYHI6ZNwoGWLCfCViE3XVsRC1cg==} + hasBin: true + rollup@4.44.1: resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5732,6 +5819,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true + '@napi-rs/wasm-runtime@1.0.3': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5775,8 +5869,12 @@ snapshots: '@oxc-project/runtime@0.80.0': {} + '@oxc-project/runtime@0.81.0': {} + '@oxc-project/types@0.80.0': {} + '@oxc-project/types@0.81.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -5866,49 +5964,95 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.31': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.32': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.32': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.31': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.32': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.32': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.32': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.32': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.32': + optional: true + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.32': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.32': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.32': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': dependencies: '@napi-rs/wasm-runtime': 1.0.1 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.32': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.32': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.32': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.32': + optional: true + '@rolldown/pluginutils@1.0.0-beta.31': {} + '@rolldown/pluginutils@1.0.0-beta.32': {} + '@rollup/plugin-replace@6.0.2(rollup@4.44.1)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.44.1) @@ -8225,7 +8369,7 @@ snapshots: rfdc@1.4.1: {} - rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.31)(typescript@5.9.2): + rolldown-plugin-dts@0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 @@ -8235,7 +8379,7 @@ snapshots: debug: 4.4.1 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.31 + rolldown: 1.0.0-beta.32 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -8280,6 +8424,28 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.31 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.31 + rolldown@1.0.0-beta.32: + dependencies: + '@oxc-project/runtime': 0.81.0 + '@oxc-project/types': 0.81.0 + '@rolldown/pluginutils': 1.0.0-beta.32 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.32 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.32 + '@rolldown/binding-darwin-x64': 1.0.0-beta.32 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.32 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.32 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.32 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.32 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.32 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.32 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.32 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.32 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.32 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.32 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.32 + rollup@4.44.1: dependencies: '@types/estree': 1.0.8 @@ -8569,8 +8735,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.31 - rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.31)(typescript@5.9.2) + rolldown: 1.0.0-beta.32 + rolldown-plugin-dts: 0.15.6(rolldown@1.0.0-beta.32)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14