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;
|
++prerenderGroup;
|
||||||
|
|
||||||
if (routesManifest?.i18n && isBlocking) {
|
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": [
|
"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",
|
"path": "/dynamic-index/hello/index",
|
||||||
"status": 200,
|
"status": 200,
|
||||||
|
|||||||
Reference in New Issue
Block a user