Skip to content

Commit c2549ce

Browse files
feat(plugin-rsc): add callback to be notified when client reference dependencies are loaded (#1065)
Co-authored-by: Hiroshi Ogawa <hi.ogawa.zz@gmail.com>
1 parent d143cd5 commit c2549ce

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

packages/plugin-rsc/src/core/ssr.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ let init = false
66

77
export function setRequireModule(options: {
88
load: (id: string) => unknown
9+
/**
10+
* Called EVERY time a module is requested
11+
* @experimental
12+
*/
13+
onLoad?: (id: string) => void
914
}): void {
1015
if (init) return
1116
init = true
@@ -15,6 +20,8 @@ export function setRequireModule(options: {
1520
})
1621

1722
const clientRequire = (id: string) => {
23+
const cleanId = removeReferenceCacheTag(id)
24+
options.onLoad?.(cleanId)
1825
return requireModule(id)
1926
}
2027
;(globalThis as any).__vite_rsc_client_require__ = clientRequire

packages/plugin-rsc/src/ssr.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@ export { createServerConsumerManifest } from './core/ssr'
99

1010
export * from './react/ssr'
1111

12+
/**
13+
* Callback type for client reference dependency notifications.
14+
* Called during SSR when a client component's dependencies are loaded.
15+
* @experimental
16+
*/
17+
export type OnClientReference = (reference: {
18+
id: string
19+
deps: ResolvedAssetDeps
20+
}) => void
21+
22+
// Registered callback for client reference deps
23+
let onClientReference: OnClientReference | undefined
24+
25+
/**
26+
* Register a callback to be notified when client reference dependencies are loaded.
27+
* Called during SSR when a client component is accessed.
28+
* @experimental
29+
*/
30+
export function setOnClientReference(
31+
callback: OnClientReference | undefined,
32+
): void {
33+
onClientReference = callback
34+
}
35+
1236
initialize()
1337

1438
function initialize(): void {
@@ -38,6 +62,17 @@ function initialize(): void {
3862
return wrapResourceProxy(mod, deps)
3963
}
4064
},
65+
// Called EVERY time a module is requested (not memoized).
66+
// Notify framework callback for per-request asset collection.
67+
onLoad: (id) => {
68+
if (!import.meta.env.__vite_rsc_build__) return
69+
if (onClientReference) {
70+
const deps = assetsManifest.clientReferenceDeps[id]
71+
if (deps) {
72+
onClientReference({ id, deps: { js: deps.js, css: deps.css } })
73+
}
74+
}
75+
},
4176
})
4277
}
4378

0 commit comments

Comments
 (0)