Skip to content

Commit 947ec55

Browse files
committed
fix fetch cache in restartable render
1 parent bc78a98 commit 947ec55

File tree

1 file changed

+100
-5
lines changed

1 file changed

+100
-5
lines changed

packages/next/src/server/lib/patch-fetch.ts

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,31 @@ export function createPatchedFetcher(
290290
cacheSignal.beginRead()
291291
}
292292

293+
const isStagedRenderingInDev = !!(
294+
process.env.NODE_ENV === 'development' &&
295+
workUnitStore &&
296+
// eslint-disable-next-line no-restricted-syntax
297+
workUnitStore.type === 'request' &&
298+
// TODO: there's probably a cleaner way to detect this.
299+
(workUnitStore.prerenderResumeDataCache ||
300+
workUnitStore.renderResumeDataCache)
301+
)
302+
303+
const isFillingCachesInDev = !!(
304+
isStagedRenderingInDev && workUnitStore.cacheSignal
305+
)
306+
307+
const dynamicInDevStagedRendering = async () => {
308+
if (isFillingCachesInDev) {
309+
// TODO(restart-on-cache-miss): block dynamic more effectively
310+
await waitAtLeastOneReactRenderTask()
311+
await waitAtLeastOneReactRenderTask()
312+
} else if (isStagedRenderingInDev) {
313+
// don't block, but delay
314+
await waitAtLeastOneReactRenderTask()
315+
}
316+
}
317+
293318
const result = getTracer().trace(
294319
isInternal ? NextNodeServerSpan.internalFetch : AppRenderSpan.fetch,
295320
{
@@ -557,6 +582,18 @@ export function createPatchedFetcher(
557582
case 'prerender-ppr':
558583
case 'prerender-legacy':
559584
case 'request':
585+
if (
586+
process.env.NODE_ENV === 'development' &&
587+
isStagedRenderingInDev
588+
) {
589+
if (cacheSignal) {
590+
cacheSignal.endRead()
591+
cacheSignal = null
592+
}
593+
// TODO(restart-on-cache-miss): block dynamic when filling caches
594+
await dynamicInDevStagedRendering()
595+
}
596+
break
560597
case 'cache':
561598
case 'private-cache':
562599
case 'unstable-cache':
@@ -667,9 +704,21 @@ export function createPatchedFetcher(
667704
workStore.route,
668705
'fetch()'
669706
)
707+
case 'request':
708+
if (
709+
process.env.NODE_ENV === 'development' &&
710+
isStagedRenderingInDev
711+
) {
712+
if (cacheSignal) {
713+
cacheSignal.endRead()
714+
cacheSignal = null
715+
}
716+
// TODO(restart-on-cache-miss): block dynamic when filling caches
717+
await dynamicInDevStagedRendering()
718+
}
719+
break
670720
case 'prerender-ppr':
671721
case 'prerender-legacy':
672-
case 'request':
673722
case 'cache':
674723
case 'private-cache':
675724
case 'unstable-cache':
@@ -841,9 +890,23 @@ export function createPatchedFetcher(
841890
normalizedRevalidate,
842891
handleUnlock
843892
)
893+
case 'request':
894+
if (
895+
process.env.NODE_ENV === 'development' &&
896+
isFillingCachesInDev
897+
) {
898+
return createCachedPrerenderResponse(
899+
res,
900+
cacheKey,
901+
incrementalCacheConfig,
902+
incrementalCache,
903+
normalizedRevalidate,
904+
handleUnlock
905+
)
906+
}
907+
// fallthrough
844908
case 'prerender-ppr':
845909
case 'prerender-legacy':
846-
case 'request':
847910
case 'cache':
848911
case 'private-cache':
849912
case 'unstable-cache':
@@ -913,9 +976,16 @@ export function createPatchedFetcher(
913976
// here.
914977
await waitAtLeastOneReactRenderTask()
915978
break
979+
case 'request':
980+
if (
981+
process.env.NODE_ENV === 'development' &&
982+
isStagedRenderingInDev
983+
) {
984+
await dynamicInDevStagedRendering()
985+
}
986+
break
916987
case 'prerender-ppr':
917988
case 'prerender-legacy':
918-
case 'request':
919989
case 'cache':
920990
case 'private-cache':
921991
case 'unstable-cache':
@@ -929,6 +999,7 @@ export function createPatchedFetcher(
929999
await handleUnlock()
9301000
} else {
9311001
// in dev, incremental cache response will be null in case the browser adds `cache-control: no-cache` in the request headers
1002+
// TODO: it seems like we also hit this after revalidates in dev?
9321003
cacheReasonOverride = 'cache-control: no-cache (hard refresh)'
9331004
}
9341005

@@ -995,7 +1066,11 @@ export function createPatchedFetcher(
9951066
}
9961067
}
9971068

998-
if (workStore.isStaticGeneration && init && typeof init === 'object') {
1069+
if (
1070+
(workStore.isStaticGeneration || isStagedRenderingInDev) &&
1071+
init &&
1072+
typeof init === 'object'
1073+
) {
9991074
const { cache } = init
10001075

10011076
// Delete `cache` property as Cloudflare Workers will throw an error
@@ -1017,9 +1092,21 @@ export function createPatchedFetcher(
10171092
workStore.route,
10181093
'fetch()'
10191094
)
1095+
case 'request':
1096+
if (
1097+
process.env.NODE_ENV === 'development' &&
1098+
isStagedRenderingInDev
1099+
) {
1100+
if (cacheSignal) {
1101+
cacheSignal.endRead()
1102+
cacheSignal = null
1103+
}
1104+
// TODO(restart-on-cache-miss): block dynamic when filling caches
1105+
await dynamicInDevStagedRendering()
1106+
}
1107+
break
10201108
case 'prerender-ppr':
10211109
case 'prerender-legacy':
1022-
case 'request':
10231110
case 'cache':
10241111
case 'private-cache':
10251112
case 'unstable-cache':
@@ -1055,6 +1142,14 @@ export function createPatchedFetcher(
10551142
'fetch()'
10561143
)
10571144
case 'request':
1145+
if (
1146+
process.env.NODE_ENV === 'development' &&
1147+
isStagedRenderingInDev
1148+
) {
1149+
// TODO(restart-on-cache-miss): block dynamic when filling caches
1150+
await dynamicInDevStagedRendering()
1151+
}
1152+
break
10581153
case 'cache':
10591154
case 'private-cache':
10601155
case 'unstable-cache':

0 commit comments

Comments
 (0)