diff --git a/packages/plugin-rsc/src/core/ssr.ts b/packages/plugin-rsc/src/core/ssr.ts index 68a847a36..afdc6ffa0 100644 --- a/packages/plugin-rsc/src/core/ssr.ts +++ b/packages/plugin-rsc/src/core/ssr.ts @@ -6,6 +6,10 @@ let init = false export function setRequireModule(options: { load: (id: string) => unknown + /** + * Called EVERY time a module is requested + */ + onLoad?: (id: string) => void }): void { if (init) return init = true @@ -15,6 +19,8 @@ export function setRequireModule(options: { }) const clientRequire = (id: string) => { + const cleanId = removeReferenceCacheTag(id) + options.onLoad?.(cleanId) return requireModule(id) } ;(globalThis as any).__vite_rsc_client_require__ = clientRequire diff --git a/packages/plugin-rsc/src/ssr.tsx b/packages/plugin-rsc/src/ssr.tsx index 752a1a51f..fcdad5f80 100644 --- a/packages/plugin-rsc/src/ssr.tsx +++ b/packages/plugin-rsc/src/ssr.tsx @@ -9,6 +9,29 @@ export { createServerConsumerManifest } from './core/ssr' export * from './react/ssr' +/** + * Callback type for client reference dependency notifications. + * Called during SSR when a client component's dependencies are loaded. + */ +export type OnClientReferenceDeps = (deps: { + js: readonly string[] + css: readonly string[] +}) => void + +// Registered callback for client reference deps +let onClientReferenceDepsCallback: OnClientReferenceDeps | undefined + +/** + * Register a callback to be notified when client reference dependencies are loaded. + * Called during SSR when a client component is accessed. + * + */ +export function setOnClientReferenceDeps( + callback: OnClientReferenceDeps | undefined, +): void { + onClientReferenceDepsCallback = callback +} + initialize() function initialize(): void { @@ -38,6 +61,17 @@ function initialize(): void { return wrapResourceProxy(mod, deps) } }, + // Called EVERY time a module is requested (not memoized). + // Notify framework callback for per-request asset collection. + onLoad: (id) => { + if (!import.meta.env.__vite_rsc_build__) return + if (onClientReferenceDepsCallback) { + const deps = assetsManifest.clientReferenceDeps[id] + if (deps) { + onClientReferenceDepsCallback({ js: deps.js, css: deps.css }) + } + } + }, }) }