Skip to content

Commit b077c4a

Browse files
authored
chore(deps): update react-router (#632)
1 parent 4568556 commit b077c4a

File tree

10 files changed

+111
-102
lines changed

10 files changed

+111
-102
lines changed

packages/plugin-rsc/examples/react-router/cf/entry.rsc.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,3 @@ export default {
77
return fetchServer(request)
88
},
99
}
10-
11-
if (import.meta.hot) {
12-
import.meta.hot.accept()
13-
}
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
import handler from '../react-router-vite/entry.ssr'
1+
import { generateHTML } from '../react-router-vite/entry.ssr'
22

33
console.log('[debug:cf-ssr-entry]')
44

5-
// TODO:
6-
// shouldn't "entry.rsc.tsx" be the main server entry
7-
// and optionally call "entry.ssr.tsx" only for rendering html?
8-
95
export default {
106
fetch(request: Request, env: any) {
11-
return handler(request, (request) => env.RSC.fetch(request))
7+
return generateHTML(request, (request) => env.RSC.fetch(request))
128
},
139
}

packages/plugin-rsc/examples/react-router/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
"@vitejs/plugin-rsc": "latest",
1717
"react": "^19.1.0",
1818
"react-dom": "^19.1.0",
19-
"react-router": "0.0.0-experimental-23decd7bc"
19+
"react-router": "7.7.0"
2020
},
2121
"devDependencies": {
2222
"@cloudflare/vite-plugin": "^1.10.0",
23-
"@react-router/dev": "0.0.0-experimental-23decd7bc",
23+
"@react-router/dev": "7.7.0",
2424
"@tailwindcss/typography": "^0.5.16",
2525
"@tailwindcss/vite": "^4.1.11",
2626
"@types/react": "^19.1.8",

packages/plugin-rsc/examples/react-router/react-router-vite/entry.browser.tsx

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,42 @@ import {
44
encodeReply,
55
setServerCallback,
66
} from '@vitejs/plugin-rsc/browser'
7-
import * as React from 'react'
7+
import { startTransition, StrictMode } from 'react'
88
import { hydrateRoot } from 'react-dom/client'
99
import {
10-
unstable_RSCHydratedRouter as RSCHydratedRouter,
11-
type unstable_RSCPayload as RSCPayload,
1210
unstable_createCallServer as createCallServer,
1311
unstable_getRSCStream as getRSCStream,
12+
unstable_RSCHydratedRouter as RSCHydratedRouter,
13+
type unstable_RSCPayload as RSCServerPayload,
1414
} from 'react-router'
1515

16+
// Create and set the callServer function to support post-hydration server actions.
1617
setServerCallback(
1718
createCallServer({
1819
createFromReadableStream,
19-
encodeReply,
2020
createTemporaryReferenceSet,
21+
encodeReply,
2122
}),
2223
)
2324

24-
createFromReadableStream<RSCPayload>(getRSCStream()).then(
25-
(payload: RSCPayload) => {
26-
React.startTransition(() => {
27-
hydrateRoot(
28-
document,
29-
<React.StrictMode>
30-
<RSCHydratedRouter
31-
createFromReadableStream={createFromReadableStream}
32-
payload={payload}
33-
/>
34-
</React.StrictMode>,
35-
)
36-
})
37-
},
38-
)
25+
// Get and decode the initial server payload
26+
createFromReadableStream<RSCServerPayload>(getRSCStream()).then((payload) => {
27+
startTransition(async () => {
28+
const formState =
29+
payload.type === 'render' ? await payload.formState : undefined
30+
31+
hydrateRoot(
32+
document,
33+
<StrictMode>
34+
<RSCHydratedRouter
35+
createFromReadableStream={createFromReadableStream}
36+
payload={payload}
37+
/>
38+
</StrictMode>,
39+
{
40+
// @ts-expect-error - no types for this yet
41+
formState,
42+
},
43+
)
44+
})
45+
})
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { fetchServer } from './entry.rsc'
2+
3+
export default async function handler(request: Request) {
4+
// Import the generateHTML function from the client environment
5+
const ssr = await import.meta.viteRsc.loadModule<
6+
typeof import('./entry.ssr')
7+
>('ssr', 'index')
8+
9+
return ssr.generateHTML(request, fetchServer)
10+
}

packages/plugin-rsc/examples/react-router/react-router-vite/entry.rsc.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
createTemporaryReferenceSet,
33
decodeAction,
4+
decodeFormState,
45
decodeReply,
56
loadServerAction,
67
renderToReadableStream,
@@ -9,14 +10,19 @@ import { unstable_matchRSCServerRequest as matchRSCServerRequest } from 'react-r
910

1011
import routes from 'virtual:react-router-routes'
1112

12-
export async function fetchServer(request: Request): Promise<Response> {
13-
return await matchRSCServerRequest({
13+
export function fetchServer(request: Request) {
14+
return matchRSCServerRequest({
15+
// Provide the React Server touchpoints.
1416
createTemporaryReferenceSet,
15-
decodeReply,
1617
decodeAction,
18+
decodeFormState,
19+
decodeReply,
1720
loadServerAction,
21+
// The incoming request.
1822
request,
23+
// The app routes.
1924
routes,
25+
// Encode the match with the React Server implementation.
2026
generateResponse(match, options) {
2127
return new Response(renderToReadableStream(match.payload, options), {
2228
status: match.statusCode,

packages/plugin-rsc/examples/react-router/react-router-vite/entry.ssr.single.tsx

Lines changed: 0 additions & 8 deletions
This file was deleted.

packages/plugin-rsc/examples/react-router/react-router-vite/entry.ssr.tsx

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,36 @@
11
import { createFromReadableStream } from '@vitejs/plugin-rsc/ssr'
2-
import * as ReactDomServer from 'react-dom/server.edge'
2+
import { renderToReadableStream as renderHTMLToReadableStream } from 'react-dom/server.edge'
33
import {
4-
unstable_RSCStaticRouter as RSCStaticRouter,
54
unstable_routeRSCServerRequest as routeRSCServerRequest,
5+
unstable_RSCStaticRouter as RSCStaticRouter,
66
} from 'react-router'
77

8-
export default async function handler(
8+
export async function generateHTML(
99
request: Request,
1010
fetchServer: (request: Request) => Promise<Response>,
1111
): Promise<Response> {
12-
const bootstrapScriptContent =
13-
await import.meta.viteRsc.loadBootstrapScriptContent('index')
14-
return routeRSCServerRequest({
12+
return await routeRSCServerRequest({
13+
// The incoming request.
1514
request,
15+
// How to call the React Server.
1616
fetchServer,
17-
createFromReadableStream: (body) => createFromReadableStream(body),
18-
renderHTML(getPayload) {
19-
return ReactDomServer.renderToReadableStream(
17+
// Provide the React Server touchpoints.
18+
createFromReadableStream,
19+
// Render the router to HTML.
20+
async renderHTML(getPayload) {
21+
const payload = await getPayload()
22+
const formState =
23+
payload.type === 'render' ? await payload.formState : undefined
24+
25+
const bootstrapScriptContent =
26+
await import.meta.viteRsc.loadBootstrapScriptContent('index')
27+
28+
return await renderHTMLToReadableStream(
2029
<RSCStaticRouter getPayload={getPayload} />,
2130
{
2231
bootstrapScriptContent,
32+
// @ts-expect-error - no types for this yet
33+
formState,
2334
},
2435
)
2536
},

packages/plugin-rsc/examples/react-router/vite.config.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,8 @@ export default defineConfig({
1717
rsc({
1818
entries: {
1919
client: './react-router-vite/entry.browser.tsx',
20-
ssr: './react-router-vite/entry.ssr.single.tsx',
21-
rsc: './react-router-vite/entry.rsc.tsx',
22-
},
23-
serverHandler: {
24-
environmentName: 'ssr',
25-
entryName: 'index',
20+
ssr: './react-router-vite/entry.ssr.tsx',
21+
rsc: './react-router-vite/entry.rsc.single.tsx',
2622
},
2723
}),
2824
inspect(),

0 commit comments

Comments
 (0)