Skip to content

Commit e5cd745

Browse files
committed
refactor and ensure keys are set
1 parent 1b46785 commit e5cd745

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

packages/next/src/client/components/router-reducer/reducers/find-head-in-cache.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,19 @@ function findHeadInCacheImpl(
2020
return [cache, keyPrefix]
2121
}
2222

23-
for (const key in parallelRoutes) {
23+
// First try the 'children' parallel route if it exists
24+
// when starting from the "root", this corresponds with the main page component
25+
const parallelRoutesKeys = Object.keys(parallelRoutes).filter(
26+
(key) => key !== 'children'
27+
)
28+
29+
// if we are at the root, we need to check the children slot first
30+
if ('children' in parallelRoutes) {
31+
parallelRoutesKeys.unshift('children')
32+
}
33+
34+
// if we didn't find metadata in the page slot, check the other parallel routes
35+
for (const key of parallelRoutesKeys) {
2436
const [segment, childParallelRoutes] = parallelRoutes[key]
2537
const childSegmentMap = cache.parallelRoutes.get(key)
2638
if (!childSegmentMap) {

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

+8-10
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ interface ParseRequestHeadersOptions {
245245
}
246246

247247
const flightDataPathHeadKey = 'h'
248+
const getFlightViewportKey = (requestId: string) => requestId + 'v'
249+
const getFlightMetadataKey = (requestId: string) => requestId + 'm'
248250

249251
interface ParsedRequestHeaders {
250252
/**
@@ -519,9 +521,9 @@ async function generateDynamicRSCPayload(
519521
isPossibleServerAction={ctx.isPossibleServerAction}
520522
/>
521523
{/* Adding requestId as react key to make metadata remount for each render */}
522-
<ViewportTree key={requestId} />
524+
<ViewportTree key={getFlightViewportKey(requestId)} />
523525
{/* Not add requestId as react key to ensure segment prefetch could result consistently if nothing changed */}
524-
<MetadataTree />
526+
<MetadataTree key={getFlightMetadataKey(requestId)} />
525527
</React.Fragment>
526528
),
527529
injectedCSS: new Set(),
@@ -855,7 +857,7 @@ async function getRSCPayload(
855857
statusCode={ctx.res.statusCode}
856858
isPossibleServerAction={ctx.isPossibleServerAction}
857859
/>
858-
<ViewportTree key={ctx.requestId} />
860+
<ViewportTree key={getFlightViewportKey(ctx.requestId)} />
859861
{/* Not add requestId as react key to ensure segment prefetch could result consistently if nothing changed */}
860862
<MetadataTree />
861863
</React.Fragment>
@@ -944,12 +946,8 @@ async function getErrorRSCPayload(
944946
serveStreamingMetadata: serveStreamingMetadata,
945947
})
946948

947-
const metadata = (
948-
<React.Fragment key={flightDataPathHeadKey}>
949-
{/* Adding requestId as react key to make metadata remount for each render */}
950-
<MetadataTree key={requestId} />
951-
</React.Fragment>
952-
)
949+
// {/* Adding requestId as react key to make metadata remount for each render */}
950+
const metadata = <MetadataTree key={getFlightMetadataKey(requestId)} />
953951

954952
const initialHead = (
955953
<React.Fragment key={flightDataPathHeadKey}>
@@ -959,7 +957,7 @@ async function getErrorRSCPayload(
959957
isPossibleServerAction={ctx.isPossibleServerAction}
960958
/>
961959
{/* Adding requestId as react key to make metadata remount for each render */}
962-
<ViewportTree key={requestId} />
960+
<ViewportTree key={getFlightViewportKey(requestId)} />
963961
{process.env.NODE_ENV === 'development' && (
964962
<meta name="next-error" content="not-found" />
965963
)}

0 commit comments

Comments
 (0)