Skip to content

Commit 236e001

Browse files
authored
[dynamicIO] Update prerender to use Fizz prerender (#71580)
Previously the `prerender` function for Fizz was gated to experimental but in our latest React sync we now have access to it in the canary channel. This updates the prerender pathway for non-experimental react to use `prerender` rather than `renderToReadableStream`. `prerender` has a few benefits in that it does breadth first rendering at Suspense boundaries so you can ensure fallback UIs are fully rendered wherever possible if you end up abortint the render. currently stacked on #71579
1 parent 3205aed commit 236e001

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

packages/next/src/server/app-render/app-render.tsx

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,8 +2028,8 @@ async function spawnDynamicValidationInDev(
20282028
const { ServerInsertedHTMLProvider } = createServerInsertedHTML()
20292029
const nonce = '1'
20302030

2031-
const renderToReadableStream = require('react-dom/server.edge')
2032-
.renderToReadableStream as (typeof import('react-dom/server.edge'))['renderToReadableStream']
2031+
const prerender = require('react-dom/static.edge')
2032+
.prerender as (typeof import('react-dom/static.edge'))['prerender']
20332033

20342034
let clientDynamicTracking = createDynamicTrackingState(false)
20352035
let dynamicValidation = createDynamicValidationState()
@@ -2081,29 +2081,30 @@ async function spawnDynamicValidationInDev(
20812081
let hadException = false
20822082
try {
20832083
await prerenderAndAbortInSequentialTasks(
2084-
() => {
2085-
const pendingHTMLStream = workUnitAsyncStorage.run(
2086-
firstAttemptClientPrerenderStore,
2087-
renderToReadableStream,
2088-
<App
2089-
reactServerStream={firstAttemptReactServerStream}
2090-
preinitScripts={() => {}}
2091-
clientReferenceManifest={clientReferenceManifest}
2092-
ServerInsertedHTMLProvider={ServerInsertedHTMLProvider}
2093-
nonce={nonce}
2094-
/>,
2095-
{
2096-
signal: firstAttemptClientController.signal,
2097-
onError: SSROnError,
2098-
}
2099-
)
2100-
pendingHTMLStream.catch(() => {})
2101-
return pendingHTMLStream
2084+
async () => {
2085+
workUnitAsyncStorage
2086+
.run(
2087+
firstAttemptClientPrerenderStore,
2088+
prerender,
2089+
<App
2090+
reactServerStream={firstAttemptReactServerStream}
2091+
preinitScripts={() => {}}
2092+
clientReferenceManifest={clientReferenceManifest}
2093+
ServerInsertedHTMLProvider={ServerInsertedHTMLProvider}
2094+
nonce={nonce}
2095+
/>,
2096+
{
2097+
signal: firstAttemptClientController.signal,
2098+
onError: SSROnError,
2099+
}
2100+
)
2101+
.catch(() => {})
2102+
return null
21022103
},
21032104
() => {
21042105
firstAttemptClientController.abort()
21052106
}
2106-
)
2107+
).catch(() => {})
21072108
} catch (err: unknown) {
21082109
if (firstAttemptClientController.signal.aborted) {
21092110
// We aborted the render normally and can ignore this error
@@ -2153,7 +2154,7 @@ async function spawnDynamicValidationInDev(
21532154
workUnitAsyncStorage
21542155
.run(
21552156
secondAttemptClientPrerenderStore,
2156-
renderToReadableStream,
2157+
prerender,
21572158
<App
21582159
reactServerStream={secondAttemptReactServerStream}
21592160
preinitScripts={() => {}}
@@ -2167,6 +2168,7 @@ async function spawnDynamicValidationInDev(
21672168
}
21682169
)
21692170
.catch(() => {})
2171+
return null
21702172
},
21712173
() => {
21722174
secondAttemptClientController.abort()
@@ -3009,7 +3011,7 @@ async function prerenderToStream(
30093011
let htmlStream
30103012
try {
30113013
htmlStream = await prerenderAndAbortInSequentialTasks(
3012-
() => {
3014+
async () => {
30133015
const teedStream = (
30143016
workUnitAsyncStorage.run(
30153017
// The store to scope
@@ -3029,11 +3031,11 @@ async function prerenderToStream(
30293031
reactServerStream = teedStream[0]
30303032
const rscForSSRStream = teedStream[1]
30313033

3032-
const renderToReadableStream = require('react-dom/server.edge')
3033-
.renderToReadableStream as (typeof import('react-dom/server.edge'))['renderToReadableStream']
3034-
const pendingHTMLStream = workUnitAsyncStorage.run(
3034+
const prerender = require('react-dom/static.edge')
3035+
.prerender as (typeof import('react-dom/static.edge'))['prerender']
3036+
const { prelude } = await workUnitAsyncStorage.run(
30353037
ssrPrerenderStore,
3036-
renderToReadableStream,
3038+
prerender,
30373039
<App
30383040
reactServerStream={rscForSSRStream}
30393041
preinitScripts={preinitScripts}
@@ -3051,8 +3053,7 @@ async function prerenderToStream(
30513053
: [bootstrapScript],
30523054
}
30533055
)
3054-
pendingHTMLStream.catch(() => {})
3055-
return pendingHTMLStream
3056+
return prelude
30563057
},
30573058
() => {
30583059
SSRController.abort(abortReason)

0 commit comments

Comments
 (0)