-
Notifications
You must be signed in to change notification settings - Fork 27.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Segment Cache] Respond with 204 on cache miss
Currently, when the client prefetches a segment, the server responds with a 404 if it cannot fulfill the request. This updates it to respond with a 204 No Content instead, since it's not an error for the client to request a segment whose prefetch hasn't been generated. When responding with 204, the server also sends the 'x-nextjs-postponed' header, but only if PPR is enabled for the route. The client can use the absence of this header to distinguish between a regular cache miss and a miss due to PPR being disabled. In a later PR, I will update the client to use this information to fall back to the non-PPR behavior.
- Loading branch information
Showing
10 changed files
with
140 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
11 changes: 11 additions & 0 deletions
11
test/e2e/app-dir/segment-cache/incremental-opt-in/app/layout.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
export default function RootLayout({ | ||
children, | ||
}: { | ||
children: React.ReactNode | ||
}) { | ||
return ( | ||
<html lang="en"> | ||
<body>{children}</body> | ||
</html> | ||
) | ||
} |
19 changes: 19 additions & 0 deletions
19
test/e2e/app-dir/segment-cache/incremental-opt-in/app/page.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
import Link from 'next/link' | ||
|
||
export default function Page() { | ||
return ( | ||
<ul> | ||
<li> | ||
<Link href="/ppr-enabled">Page with PPR enabled</Link> | ||
</li> | ||
<li> | ||
<Link href="/ppr-enabled/dynamic-param"> | ||
Page with PPR enabled but has dynamic param | ||
</Link> | ||
</li> | ||
<li> | ||
<Link href="/ppr-disabled">Page with PPR disabled</Link> | ||
</li> | ||
</ul> | ||
) | ||
} |
3 changes: 3 additions & 0 deletions
3
test/e2e/app-dir/segment-cache/incremental-opt-in/app/ppr-disabled/page.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export default function PPRDisabled() { | ||
return '(intentionally empty)' | ||
} |
3 changes: 3 additions & 0 deletions
3
test/e2e/app-dir/segment-cache/incremental-opt-in/app/ppr-enabled/[dynamic-param]/page.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export default function Page() { | ||
return '(intentionally empty)' | ||
} |
9 changes: 9 additions & 0 deletions
9
test/e2e/app-dir/segment-cache/incremental-opt-in/app/ppr-enabled/layout.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
export const experimental_ppr = true | ||
|
||
export default function RootLayout({ | ||
children, | ||
}: { | ||
children: React.ReactNode | ||
}) { | ||
return children | ||
} |
3 changes: 3 additions & 0 deletions
3
test/e2e/app-dir/segment-cache/incremental-opt-in/app/ppr-enabled/page.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export default function PPREnabled() { | ||
return '(intentionally empty)' | ||
} |
12 changes: 12 additions & 0 deletions
12
test/e2e/app-dir/segment-cache/incremental-opt-in/next.config.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
/** | ||
* @type {import('next').NextConfig} | ||
*/ | ||
const nextConfig = { | ||
experimental: { | ||
ppr: 'incremental', | ||
dynamicIO: true, | ||
clientSegmentCache: true, | ||
}, | ||
} | ||
|
||
module.exports = nextConfig |
38 changes: 38 additions & 0 deletions
38
test/e2e/app-dir/segment-cache/incremental-opt-in/segment-cache-incremental-opt-in.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import { nextTestSetup } from 'e2e-utils' | ||
|
||
describe('segment cache (incremental opt in)', () => { | ||
const { next, isNextDev, skipped } = nextTestSetup({ | ||
files: __dirname, | ||
skipDeployment: true, | ||
}) | ||
if (isNextDev || skipped) { | ||
test('ppr is disabled', () => {}) | ||
return | ||
} | ||
|
||
// TODO: Replace with e2e test once the client part is implemented | ||
it('prefetch responds with 204 if PPR is disabled for a route', async () => { | ||
await next.browser('/') | ||
const response = await next.fetch('/ppr-disabled', { | ||
headers: { | ||
RSC: '1', | ||
'Next-Router-Prefetch': '1', | ||
'Next-Router-Segment-Prefetch': '/_tree', | ||
}, | ||
}) | ||
expect(response.status).toBe(204) | ||
}) | ||
|
||
it('prefetch sets "Did Postpone" header if PPR is enabled but response is not in cache', async () => { | ||
await next.browser('/') | ||
const response = await next.fetch('/ppr-enabled/dynamic-param', { | ||
headers: { | ||
RSC: '1', | ||
'Next-Router-Prefetch': '1', | ||
'Next-Router-Segment-Prefetch': '/_tree', | ||
}, | ||
}) | ||
expect(response.status).toBe(204) | ||
expect(response.headers.get('x-nextjs-postponed')).toBe('1') | ||
}) | ||
}) |