mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-10 04:22:12 +00:00
Fix missing .rsc outputs for pages prerenders (#11503)
When generating the outputs for pages when app router is also present we weren't creating the placeholder `.rsc` outputs for all prerender outputs so when a `fallback: false` route was configured in the pages router that could fall through to an app route it causes issues with client-navigation behaving differently than a direct visit. This ensures we add the placeholder `.rsc` outputs for all prerenders so that `fallback: false` pages don't have this unexpected behavior.
This commit is contained in:
5
.changeset/clean-buttons-hunt.md
Normal file
5
.changeset/clean-buttons-hunt.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@vercel/next": patch
|
||||
---
|
||||
|
||||
Fix missing .rsc outputs for pages prerenders
|
||||
@@ -2477,6 +2477,22 @@ export const onPrerenderRoute =
|
||||
});
|
||||
}
|
||||
|
||||
// we need to ensure all prerenders have a matching .rsc output
|
||||
// otherwise routing could fall through unexpectedly for the
|
||||
// fallback: false case as it doesn't have a dynamic route
|
||||
// to catch the `.rsc` request for app -> pages routing
|
||||
if (outputPrerenderPathData?.endsWith('.json') && appDir) {
|
||||
const dummyOutput = new FileBlob({
|
||||
data: '{}',
|
||||
contentType: 'application/json',
|
||||
});
|
||||
const rscKey = `${outputPathPage}.rsc`;
|
||||
const prefetchRscKey = `${outputPathPage}${RSC_PREFETCH_SUFFIX}`;
|
||||
|
||||
prerenders[rscKey] = dummyOutput;
|
||||
prerenders[prefetchRscKey] = dummyOutput;
|
||||
}
|
||||
|
||||
++prerenderGroup;
|
||||
|
||||
if (routesManifest?.i18n && isBlocking) {
|
||||
|
||||
5
packages/next/test/fixtures/00-app-dir-no-ppr/app/nested/[...rest]/page.js
vendored
Normal file
5
packages/next/test/fixtures/00-app-dir-no-ppr/app/nested/[...rest]/page.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export default function Page() {
|
||||
return (
|
||||
<p>nested app router catch-all</p>
|
||||
)
|
||||
}
|
||||
24
packages/next/test/fixtures/00-app-dir-no-ppr/pages/nested/blog-fallback-false/[slug].js
vendored
Normal file
24
packages/next/test/fixtures/00-app-dir-no-ppr/pages/nested/blog-fallback-false/[slug].js
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
export default function Page(props) {
|
||||
return (
|
||||
<>
|
||||
<p>hello from /nested/blog-fallback-false/[slug]</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export function getStaticProps() {
|
||||
return {
|
||||
props: {
|
||||
now: Date.now()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return {
|
||||
paths: [
|
||||
{ params: { slug: 'first' } },
|
||||
],
|
||||
fallback: false
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,50 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/nested/blog-fallback-false/first",
|
||||
"status": 200,
|
||||
"mustContain": "hello from /nested/blog-fallback-false"
|
||||
},
|
||||
{
|
||||
"path": "/nested/blog-fallback-false/first",
|
||||
"status": 200,
|
||||
"mustContain": "{}",
|
||||
"mustNotContain": ":",
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/nested/blog-fallback-false/first.prefetch.rsc"
|
||||
},
|
||||
"headers": {
|
||||
"RSC": 1,
|
||||
"Next-Router-Prefetch": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/nested/blog-fallback-false/first",
|
||||
"status": 200,
|
||||
"mustContain": "{}",
|
||||
"mustNotContain": ":",
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/nested/blog-fallback-false/first.rsc"
|
||||
},
|
||||
"headers": {
|
||||
"RSC": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/nested/blog-fallback-false/non-existent",
|
||||
"status": 200,
|
||||
"mustContain": "nested app router catch-all"
|
||||
},
|
||||
{
|
||||
"path": "/nested/blog-fallback-false/non-existent",
|
||||
"status": 200,
|
||||
"mustContain": ":",
|
||||
"headers": {
|
||||
"RSC": 1,
|
||||
"Next-Router-Prefetch": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/dynamic-index/hello/index",
|
||||
"status": 200,
|
||||
|
||||
Reference in New Issue
Block a user