From 82fd22b24fa90c884e5dcb84e30812439bfe6847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=90=E8=97=A4=E6=98=AD=E6=96=87?= Date: Sun, 16 Jul 2023 20:27:02 +0900 Subject: [PATCH 1/6] fix: Add `Next-Url` to http vary in consideration of intercept routes. --- packages/next/src/client/components/app-router-headers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/client/components/app-router-headers.ts b/packages/next/src/client/components/app-router-headers.ts index 0ef9942f6b965..f8d042317f049 100644 --- a/packages/next/src/client/components/app-router-headers.ts +++ b/packages/next/src/client/components/app-router-headers.ts @@ -7,7 +7,7 @@ export const NEXT_URL = 'Next-Url' as const export const FETCH_CACHE_HEADER = 'x-vercel-sc-headers' as const export const RSC_CONTENT_TYPE_HEADER = 'text/x-component' as const export const RSC_VARY_HEADER = - `${RSC}, ${NEXT_ROUTER_STATE_TREE}, ${NEXT_ROUTER_PREFETCH}` as const + `${RSC}, ${NEXT_ROUTER_STATE_TREE}, ${NEXT_ROUTER_PREFETCH}, ${NEXT_URL}` as const export const FLIGHT_PARAMETERS = [ [RSC], From eb885445c2fdb90c81fcf77744f53e81c2d394cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=90=E8=97=A4=E6=98=AD=E6=96=87?= Date: Mon, 17 Jul 2023 11:36:44 +0900 Subject: [PATCH 2/6] add `Next-Url` to cache query hash --- .../client/components/router-reducer/fetch-server-response.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/next/src/client/components/router-reducer/fetch-server-response.ts b/packages/next/src/client/components/router-reducer/fetch-server-response.ts index 46602ece29b72..689d27df7798f 100644 --- a/packages/next/src/client/components/router-reducer/fetch-server-response.ts +++ b/packages/next/src/client/components/router-reducer/fetch-server-response.ts @@ -72,6 +72,7 @@ export async function fetchServerResponse( [ headers[NEXT_ROUTER_PREFETCH] || '0', headers[NEXT_ROUTER_STATE_TREE], + headers[NEXT_URL], ].join(',') ) From 961eb6f815197518a5a3a0fd7c47effa236298f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=90=E8=97=A4=E6=98=AD=E6=96=87?= Date: Fri, 21 Jul 2023 21:55:41 +0900 Subject: [PATCH 3/6] Added test case: `_rsc` is calculated based on `Next-Url --- .../app-prefetch/app/dashboard/page.js | 5 +++ .../app-dir/app-prefetch/prefetching.test.ts | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/test/e2e/app-dir/app-prefetch/app/dashboard/page.js b/test/e2e/app-dir/app-prefetch/app/dashboard/page.js index 4a56f8e04184c..8ad248aa42420 100644 --- a/test/e2e/app-dir/app-prefetch/app/dashboard/page.js +++ b/test/e2e/app-dir/app-prefetch/app/dashboard/page.js @@ -1,3 +1,5 @@ +import Link from 'next/link' + export const revalidate = 0 async function getData() { @@ -12,6 +14,9 @@ export default async function DashboardPage(props) { return ( <>

{message}

+ + To Static Page + ) } diff --git a/test/e2e/app-dir/app-prefetch/prefetching.test.ts b/test/e2e/app-dir/app-prefetch/prefetching.test.ts index 189d27acc6f64..aa948c2a44cbc 100644 --- a/test/e2e/app-dir/app-prefetch/prefetching.test.ts +++ b/test/e2e/app-dir/app-prefetch/prefetching.test.ts @@ -157,6 +157,44 @@ createNextDescribe( ).toBe(1) }) + it('should fetch again when a static page was prefetched when navigating to different `Next-Url`', async () => { + const browser = await next.browser('/404', browserConfigWithFixedTime) + let staticPageRequests: string[] = [] + + browser.on('request', (req) => { + const url = new URL(req.url()) + if (url.toString().includes(`/static-page?${NEXT_RSC_UNION_QUERY}=`)) { + staticPageRequests.push(`${url.pathname}${url.search}`) + } + }) + await browser.eval('location.href = "/"') + await browser.eval( + `window.nd.router.prefetch("/static-page", {kind: "auto"})` + ) + await check(() => { + return staticPageRequests.length === 1 + ? 'success' + : JSON.stringify(staticPageRequests) + }, 'success') + + // Unable to clear router cache so mpa navigation + await browser.eval('location.href = "/dashboard"') + await browser.eval( + `window.nd.router.prefetch("/static-page", {kind: "auto"})` + ) + await check(() => { + return staticPageRequests.length === 2 + ? 'success' + : JSON.stringify(staticPageRequests) + }, 'success') + + console.log('requests', staticPageRequests) + expect(staticPageRequests[0]).toMatch('/static-page?_rsc=') + expect(staticPageRequests[1]).toMatch('/static-page?_rsc=') + // `_rsc` does not match because it depends on the `Next-Url` + expect(staticPageRequests[0]).not.toBe(staticPageRequests[1]) + }) + it('should not prefetch for a bot user agent', async () => { const browser = await next.browser('/404') let requests: string[] = [] From d5494c4c3b22b6ac097fb4c022ab54aa1adcab73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=90=E8=97=A4=E6=98=AD=E6=96=87?= Date: Fri, 21 Jul 2023 22:00:13 +0900 Subject: [PATCH 4/6] rename test case: `_rsc` is calculated based on `Next-Url` --- test/e2e/app-dir/app-prefetch/prefetching.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/e2e/app-dir/app-prefetch/prefetching.test.ts b/test/e2e/app-dir/app-prefetch/prefetching.test.ts index aa948c2a44cbc..c178023da5bfc 100644 --- a/test/e2e/app-dir/app-prefetch/prefetching.test.ts +++ b/test/e2e/app-dir/app-prefetch/prefetching.test.ts @@ -157,7 +157,7 @@ createNextDescribe( ).toBe(1) }) - it('should fetch again when a static page was prefetched when navigating to different `Next-Url`', async () => { + it('`_rsc` is calculated based on `Next-Url`', async () => { const browser = await next.browser('/404', browserConfigWithFixedTime) let staticPageRequests: string[] = [] @@ -188,7 +188,6 @@ createNextDescribe( : JSON.stringify(staticPageRequests) }, 'success') - console.log('requests', staticPageRequests) expect(staticPageRequests[0]).toMatch('/static-page?_rsc=') expect(staticPageRequests[1]).toMatch('/static-page?_rsc=') // `_rsc` does not match because it depends on the `Next-Url` From e55f692d313a841d9b477e30049c5a92cd40bef3 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Sat, 22 Jul 2023 22:11:29 +0200 Subject: [PATCH 5/6] Update test --- test/e2e/app-dir/app-prefetch/prefetching.test.ts | 2 +- test/e2e/app-dir/app/index.test.ts | 8 ++++---- test/integration/dynamic-routing/test/index.test.js | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/test/e2e/app-dir/app-prefetch/prefetching.test.ts b/test/e2e/app-dir/app-prefetch/prefetching.test.ts index c178023da5bfc..71bdc82549408 100644 --- a/test/e2e/app-dir/app-prefetch/prefetching.test.ts +++ b/test/e2e/app-dir/app-prefetch/prefetching.test.ts @@ -157,7 +157,7 @@ createNextDescribe( ).toBe(1) }) - it('`_rsc` is calculated based on `Next-Url`', async () => { + it('should calculate `_rsc` query based on `Next-Url`', async () => { const browser = await next.browser('/404', browserConfigWithFixedTime) let staticPageRequests: string[] = [] diff --git a/test/e2e/app-dir/app/index.test.ts b/test/e2e/app-dir/app/index.test.ts index 831bc3dedd420..66e77aad46ff6 100644 --- a/test/e2e/app-dir/app/index.test.ts +++ b/test/e2e/app-dir/app/index.test.ts @@ -256,8 +256,8 @@ createNextDescribe( expect(res.headers.get('x-edge-runtime')).toBe('1') expect(res.headers.get('vary')).toBe( isNextDeploy - ? 'RSC, Next-Router-State-Tree, Next-Router-Prefetch' - : 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Accept-Encoding' + ? 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url' + : 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url, Accept-Encoding' ) }) @@ -269,8 +269,8 @@ createNextDescribe( }) expect(res.headers.get('vary')).toBe( isNextDeploy - ? 'RSC, Next-Router-State-Tree, Next-Router-Prefetch' - : 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Accept-Encoding' + ? 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url' + : 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url, Accept-Encoding' ) }) diff --git a/test/integration/dynamic-routing/test/index.test.js b/test/integration/dynamic-routing/test/index.test.js index 2699e64d2bc6e..417e5317b36db 100644 --- a/test/integration/dynamic-routing/test/index.test.js +++ b/test/integration/dynamic-routing/test/index.test.js @@ -1462,7 +1462,8 @@ function runTests({ dev }) { rsc: { header: 'RSC', contentTypeHeader: 'text/x-component', - varyHeader: 'RSC, Next-Router-State-Tree, Next-Router-Prefetch', + varyHeader: + 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url', }, }) }) From b536ae84cfc2e6270dffe16b96bc00519fc0df37 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Sat, 22 Jul 2023 22:48:34 +0200 Subject: [PATCH 6/6] fix test --- test/integration/custom-routes/test/index.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/custom-routes/test/index.test.js b/test/integration/custom-routes/test/index.test.js index eda2ebfc65d66..0a28aa5f21698 100644 --- a/test/integration/custom-routes/test/index.test.js +++ b/test/integration/custom-routes/test/index.test.js @@ -2658,7 +2658,8 @@ const runTests = (isDev = false, isTurbo = false) => { rsc: { header: 'RSC', contentTypeHeader: 'text/x-component', - varyHeader: 'RSC, Next-Router-State-Tree, Next-Router-Prefetch', + varyHeader: + 'RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url', }, }) })