Skip to content

Commit 005f9da

Browse files
hi-ogawaclaude
andcommitted
refactor(rsc): replace wildcard imports with named imports
Replace wildcard imports with specific named imports across examples and documentation: - @vitejs/plugin-rsc/rsc: renderToReadableStream, createTemporaryReferenceSet, etc. - @vitejs/plugin-rsc/browser: createFromReadableStream, createFromFetch, etc. - @vitejs/plugin-rsc/ssr: createFromReadableStream - react-dom/client: hydrateRoot, createRoot - react-dom/server.edge: renderToReadableStream This improves code clarity and import specificity while maintaining full functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 74ec0e0 commit 005f9da

File tree

18 files changed

+199
-143
lines changed

18 files changed

+199
-143
lines changed

packages/plugin-rsc/README.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export default defineConfig({
131131
- [`entry.rsc.tsx`](./examples/starter/src/framework/entry.rsc.tsx)
132132

133133
```tsx
134-
import * as ReactServer from '@vitejs/plugin-rsc/rsc' // re-export of react-server-dom/server.edge and client.edge
134+
import { renderToReadableStream } from '@vitejs/plugin-rsc/rsc' // re-export of react-server-dom/server.edge and client.edge
135135
136136
// the plugin assumes `rsc` entry having default export of request handler
137137
export default async function handler(request: Request): Promise<Response> {
@@ -143,7 +143,7 @@ export default async function handler(request: Request): Promise<Response> {
143143
</body>
144144
</html>
145145
)
146-
const rscStream = ReactServer.renderToReadableStream(root)
146+
const rscStream = renderToReadableStream(root)
147147

148148
// respond direct RSC stream request based on framework's convention
149149
if (request.url.endsWith('.rsc')) {
@@ -173,19 +173,19 @@ export default async function handler(request: Request): Promise<Response> {
173173
- [`entry.ssr.tsx`](./examples/starter/src/framework/entry.ssr.tsx)
174174

175175
```tsx
176-
import * as ReactClient from '@vitejs/plugin-rsc/ssr' // re-export of react-server-dom/client.edge
177-
import * as ReactDOMServer from 'react-dom/server.edge'
176+
import { createFromReadableStream } from '@vitejs/plugin-rsc/ssr' // re-export of react-server-dom/client.edge
177+
import { renderToReadableStream } from 'react-dom/server.edge'
178178

179179
export async function handleSsr(rscStream: ReadableStream) {
180180
// deserialize RSC stream back to React VDOM
181-
const root = await ReactClient.createFromReadableStream(rscStream)
181+
const root = await createFromReadableStream(rscStream)
182182

183183
// helper API to allow referencing browser entry content from SSR environment
184184
const bootstrapScriptContent =
185185
await import.meta.viteRsc.loadBootstrapScriptContent('index')
186186

187187
// render html (traditional SSR)
188-
const htmlStream = ReactDOMServer.renderToReadableStream(root, {
188+
const htmlStream = renderToReadableStream(root, {
189189
bootstrapScriptContent,
190190
})
191191

@@ -196,16 +196,16 @@ export async function handleSsr(rscStream: ReadableStream) {
196196
- [`entry.browser.tsx`](./examples/starter/src/framework/entry.browser.tsx)
197197

198198
```tsx
199-
import * as ReactClient from '@vitejs/plugin-rsc/browser' // re-export of react-server-dom/client.browser
200-
import * as ReactDOMClient from 'react-dom/client'
199+
import { createFromReadableStream } from '@vitejs/plugin-rsc/browser' // re-export of react-server-dom/client.browser
200+
import { hydrateRoot } from 'react-dom/client'
201201

202202
async function main() {
203203
// fetch and deserialize RSC stream back to React VDOM
204204
const rscResponse = await fetch(window.location.href + '.rsc')
205-
const root = await ReactClient.createFromReadableStream(rscResponse.body)
205+
const root = await createFromReadableStream(rscResponse.body)
206206

207207
// hydration (traditional CSR)
208-
ReactDOMClient.hydrateRoot(document, root)
208+
hydrateRoot(document, root)
209209
}
210210

211211
main()
@@ -342,13 +342,11 @@ const htmlStream = await renderToReadableStream(reactNode, {
342342
This event is fired when server modules are updated, which can be used to trigger re-fetching and re-rendering of RSC components on browser.
343343

344344
```js
345-
import * as ReactClient from '@vitejs/plugin-rsc/browser'
345+
import { createFromFetch } from '@vitejs/plugin-rsc/browser'
346346

347347
import.meta.hot.on('rsc:update', async () => {
348348
// re-fetch RSC stream
349-
const rscPayload = await ReactClient.createFromFetch(
350-
fetch(window.location.href + '.rsc'),
351-
)
349+
const rscPayload = await createFromFetch(fetch(window.location.href + '.rsc'))
352350
// re-render ...
353351
})
354352
```

packages/plugin-rsc/examples/basic/src/framework/entry.browser.tsx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
import * as ReactClient from '@vitejs/plugin-rsc/browser'
1+
import {
2+
createFromReadableStream,
3+
createFromFetch,
4+
setServerCallback,
5+
createTemporaryReferenceSet,
6+
encodeReply,
7+
} from '@vitejs/plugin-rsc/browser'
28
import React from 'react'
3-
import * as ReactDOMClient from 'react-dom/client'
9+
import { hydrateRoot } from 'react-dom/client'
410
import { rscStream } from 'rsc-html-stream/client'
511
import type { RscPayload } from './entry.rsc'
612

@@ -10,7 +16,7 @@ async function main() {
1016
let setPayload: (v: RscPayload) => void
1117

1218
// deserialize RSC stream back to React VDOM for CSR
13-
const initialPayload = await ReactClient.createFromReadableStream<RscPayload>(
19+
const initialPayload = await createFromReadableStream<RscPayload>(
1420
// initial RSC stream is injected in SSR stream as <script>...FLIGHT_DATA...</script>
1521
rscStream,
1622
)
@@ -33,21 +39,21 @@ async function main() {
3339

3440
// re-fetch RSC and trigger re-rendering
3541
async function fetchRscPayload() {
36-
const payload = await ReactClient.createFromFetch<RscPayload>(
42+
const payload = await createFromFetch<RscPayload>(
3743
fetch(window.location.href),
3844
)
3945
setPayload(payload)
4046
}
4147

4248
// register a handler which will be internally called by React
4349
// on server function request after hydration.
44-
ReactClient.setServerCallback(async (id, args) => {
50+
setServerCallback(async (id, args) => {
4551
const url = new URL(window.location.href)
46-
const temporaryReferences = ReactClient.createTemporaryReferenceSet()
47-
const payload = await ReactClient.createFromFetch<RscPayload>(
52+
const temporaryReferences = createTemporaryReferenceSet()
53+
const payload = await createFromFetch<RscPayload>(
4854
fetch(url, {
4955
method: 'POST',
50-
body: await ReactClient.encodeReply(args, { temporaryReferences }),
56+
body: await encodeReply(args, { temporaryReferences }),
5157
headers: {
5258
'x-rsc-action': id,
5359
},
@@ -64,7 +70,7 @@ async function main() {
6470
<BrowserRoot />
6571
</React.StrictMode>
6672
)
67-
ReactDOMClient.hydrateRoot(document, browserRoot, {
73+
hydrateRoot(document, browserRoot, {
6874
formState: initialPayload.formState,
6975
})
7076

packages/plugin-rsc/examples/basic/src/framework/entry.rsc.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import * as ReactServer from '@vitejs/plugin-rsc/rsc'
1+
import {
2+
renderToReadableStream,
3+
createTemporaryReferenceSet,
4+
decodeReply,
5+
loadServerAction,
6+
decodeAction,
7+
decodeFormState,
8+
} from '@vitejs/plugin-rsc/rsc'
29
import type { ReactFormState } from 'react-dom/client'
310
import type React from 'react'
411

@@ -40,28 +47,25 @@ export async function handleRequest({
4047
const body = contentType?.startsWith('multipart/form-data')
4148
? await request.formData()
4249
: await request.text()
43-
temporaryReferences = ReactServer.createTemporaryReferenceSet()
44-
const args = await ReactServer.decodeReply(body, { temporaryReferences })
45-
const action = await ReactServer.loadServerAction(actionId)
50+
temporaryReferences = createTemporaryReferenceSet()
51+
const args = await decodeReply(body, { temporaryReferences })
52+
const action = await loadServerAction(actionId)
4653
returnValue = await action.apply(null, args)
4754
} else {
4855
// otherwise server function is called via `<form action={...}>`
4956
// before hydration (e.g. when javascript is disabled).
5057
// aka progressive enhancement.
5158
const formData = await request.formData()
52-
const decodedAction = await ReactServer.decodeAction(formData)
59+
const decodedAction = await decodeAction(formData)
5360
const result = await decodedAction()
54-
formState = await ReactServer.decodeFormState(result, formData)
61+
formState = await decodeFormState(result, formData)
5562
}
5663
}
5764

5865
const url = new URL(request.url)
5966
const rscPayload: RscPayload = { root: getRoot(), formState, returnValue }
6067
const rscOptions = { temporaryReferences }
61-
const rscStream = ReactServer.renderToReadableStream<RscPayload>(
62-
rscPayload,
63-
rscOptions,
64-
)
68+
const rscStream = renderToReadableStream<RscPayload>(rscPayload, rscOptions)
6569

6670
// respond RSC stream without HTML rendering based on framework's convention.
6771
// here we use request header `content-type`.

packages/plugin-rsc/examples/basic/src/framework/entry.ssr.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import * as ReactClient from '@vitejs/plugin-rsc/ssr' // RSC API
1+
import { createFromReadableStream } from '@vitejs/plugin-rsc/ssr' // RSC API
22
import React from 'react'
33
import type { ReactFormState } from 'react-dom/client'
4-
import * as ReactDOMServer from 'react-dom/server.edge'
4+
import { renderToReadableStream } from 'react-dom/server.edge'
55
import { injectRSCPayload } from 'rsc-html-stream/server'
66
import type { RscPayload } from './entry.rsc'
77

@@ -23,7 +23,7 @@ export async function renderHTML(
2323
function SsrRoot() {
2424
// deserialization needs to be kicked off inside ReactDOMServer context
2525
// for ReactDomServer preinit/preloading to work
26-
payload ??= ReactClient.createFromReadableStream<RscPayload>(rscStream1)
26+
payload ??= createFromReadableStream<RscPayload>(rscStream1)
2727
return <FixSsrThenable>{React.use(payload).root}</FixSsrThenable>
2828
}
2929

@@ -34,7 +34,7 @@ export async function renderHTML(
3434
// render html (traditional SSR)
3535
const bootstrapScriptContent =
3636
await import.meta.viteRsc.loadBootstrapScriptContent('index')
37-
const htmlStream = await ReactDOMServer.renderToReadableStream(<SsrRoot />, {
37+
const htmlStream = await renderToReadableStream(<SsrRoot />, {
3838
bootstrapScriptContent: options?.debugNojs
3939
? undefined
4040
: bootstrapScriptContent,

packages/plugin-rsc/examples/basic/src/framework/use-cache-runtime.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import * as ReactRsc from '@vitejs/plugin-rsc/rsc'
1+
import {
2+
createClientTemporaryReferenceSet,
3+
encodeReply,
4+
createTemporaryReferenceSet,
5+
decodeReply,
6+
renderToReadableStream,
7+
createFromReadableStream,
8+
} from '@vitejs/plugin-rsc/rsc'
29

310
// based on
411
// https://github.com/vercel/next.js/pull/70435
@@ -28,26 +35,25 @@ export default function cacheWrapper(fn: (...args: any[]) => Promise<unknown>) {
2835
// those arguments to be included as a cache key and it doesn't achieve
2936
// "use cache static shell + dynamic children props" pattern.
3037
// cf. https://nextjs.org/docs/app/api-reference/directives/use-cache#non-serializable-arguments
31-
const clientTemporaryReferences =
32-
ReactRsc.createClientTemporaryReferenceSet()
33-
const encodedArguments = await ReactRsc.encodeReply(args, {
38+
const clientTemporaryReferences = createClientTemporaryReferenceSet()
39+
const encodedArguments = await encodeReply(args, {
3440
temporaryReferences: clientTemporaryReferences,
3541
})
3642
const serializedCacheKey = await replyToCacheKey(encodedArguments)
3743

3844
// cache `fn` result as stream
3945
// (cache value is promise so that it dedupes concurrent async calls)
4046
const entryPromise = (cacheEntries[serializedCacheKey] ??= (async () => {
41-
const temporaryReferences = ReactRsc.createTemporaryReferenceSet()
42-
const decodedArgs = await ReactRsc.decodeReply(encodedArguments, {
47+
const temporaryReferences = createTemporaryReferenceSet()
48+
const decodedArgs = await decodeReply(encodedArguments, {
4349
temporaryReferences,
4450
})
4551

4652
// run the original function
4753
const result = await fn(...decodedArgs)
4854

4955
// serialize result to a ReadableStream
50-
const stream = ReactRsc.renderToReadableStream(result, {
56+
const stream = renderToReadableStream(result, {
5157
environmentName: 'Cache',
5258
temporaryReferences,
5359
})
@@ -56,7 +62,7 @@ export default function cacheWrapper(fn: (...args: any[]) => Promise<unknown>) {
5662

5763
// deserialized cached stream
5864
const stream = (await entryPromise).get()
59-
const result = ReactRsc.createFromReadableStream(stream, {
65+
const result = createFromReadableStream(stream, {
6066
environmentName: 'Cache',
6167
replayConsoleLogs: true,
6268
temporaryReferences: clientTemporaryReferences,

packages/plugin-rsc/examples/browser-mode/src/framework/entry.browser.tsx

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import * as React from 'react'
2-
import * as ReactDOMClient from 'react-dom/client'
3-
import * as ReactClient from '@vitejs/plugin-rsc/react/browser'
2+
import { createRoot } from 'react-dom/client'
3+
import {
4+
createFromFetch,
5+
setRequireModule,
6+
setServerCallback,
7+
createTemporaryReferenceSet,
8+
encodeReply,
9+
} from '@vitejs/plugin-rsc/react/browser'
410
import type { RscPayload } from './entry.rsc'
511

612
let fetchServer: typeof import('./entry.rsc').fetchServer
713

814
export function initialize(options: { fetchServer: typeof fetchServer }) {
915
fetchServer = options.fetchServer
10-
ReactClient.setRequireModule({
16+
setRequireModule({
1117
load: (id) => import(/* @vite-ignore */ id),
1218
})
1319
}
1420

1521
export async function main() {
1622
let setPayload: (v: RscPayload) => void
1723

18-
const initialPayload = await ReactClient.createFromFetch<RscPayload>(
24+
const initialPayload = await createFromFetch<RscPayload>(
1925
fetchServer(new Request(window.location.href)),
2026
)
2127

@@ -29,14 +35,14 @@ export async function main() {
2935
return payload.root
3036
}
3137

32-
ReactClient.setServerCallback(async (id, args) => {
38+
setServerCallback(async (id, args) => {
3339
const url = new URL(window.location.href)
34-
const temporaryReferences = ReactClient.createTemporaryReferenceSet()
35-
const payload = await ReactClient.createFromFetch<RscPayload>(
40+
const temporaryReferences = createTemporaryReferenceSet()
41+
const payload = await createFromFetch<RscPayload>(
3642
fetchServer(
3743
new Request(url, {
3844
method: 'POST',
39-
body: await ReactClient.encodeReply(args, { temporaryReferences }),
45+
body: await encodeReply(args, { temporaryReferences }),
4046
headers: {
4147
'x-rsc-action': id,
4248
},
@@ -53,5 +59,5 @@ export async function main() {
5359
<BrowserRoot />
5460
</React.StrictMode>
5561
)
56-
ReactDOMClient.createRoot(document.body).render(browserRoot)
62+
createRoot(document.body).render(browserRoot)
5763
}

packages/plugin-rsc/examples/browser-mode/src/framework/entry.rsc.tsx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import * as ReactServer from '@vitejs/plugin-rsc/react/rsc'
1+
import {
2+
setRequireModule,
3+
renderToReadableStream,
4+
createTemporaryReferenceSet,
5+
decodeReply,
6+
loadServerAction,
7+
decodeAction,
8+
decodeFormState,
9+
} from '@vitejs/plugin-rsc/react/rsc'
210
import type React from 'react'
311
import { Root } from '../root'
412
import type { ReactFormState } from 'react-dom/client'
@@ -12,7 +20,7 @@ export type RscPayload = {
1220
declare let __vite_rsc_raw_import__: (id: string) => Promise<unknown>
1321

1422
export function initialize() {
15-
ReactServer.setRequireModule({ load: (id) => __vite_rsc_raw_import__(id) })
23+
setRequireModule({ load: (id) => __vite_rsc_raw_import__(id) })
1624
}
1725

1826
export async function fetchServer(request: Request): Promise<Response> {
@@ -27,24 +35,21 @@ export async function fetchServer(request: Request): Promise<Response> {
2735
const body = contentType?.startsWith('multipart/form-data')
2836
? await request.formData()
2937
: await request.text()
30-
temporaryReferences = ReactServer.createTemporaryReferenceSet()
31-
const args = await ReactServer.decodeReply(body, { temporaryReferences })
32-
const action = await ReactServer.loadServerAction(actionId)
38+
temporaryReferences = createTemporaryReferenceSet()
39+
const args = await decodeReply(body, { temporaryReferences })
40+
const action = await loadServerAction(actionId)
3341
returnValue = await action.apply(null, args)
3442
} else {
3543
const formData = await request.formData()
36-
const decodedAction = await ReactServer.decodeAction(formData)
44+
const decodedAction = await decodeAction(formData)
3745
const result = await decodedAction()
38-
formState = await ReactServer.decodeFormState(result, formData)
46+
formState = await decodeFormState(result, formData)
3947
}
4048
}
4149

4250
const rscPayload: RscPayload = { root: <Root />, formState, returnValue }
4351
const rscOptions = { temporaryReferences }
44-
const rscStream = ReactServer.renderToReadableStream<RscPayload>(
45-
rscPayload,
46-
rscOptions,
47-
)
52+
const rscStream = renderToReadableStream<RscPayload>(rscPayload, rscOptions)
4853

4954
return new Response(rscStream, {
5055
headers: {

0 commit comments

Comments
 (0)