mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
cc @icyJoseph @ztanner NOTE: The canary release [`v14.1.1-canary.51`](https://github.com/vercel/next.js/releases/tag/v14.1.1-canary.51) and below work as expected. ### Why? Introduced from #61535, the initial prefetch cache is set based on the `location.pathname`. When a page is loaded WITH the search param, the cache key does not contain information of the search param. The issue is when on a dynamic page reading the `searchParams` value, the value doesn't change if navigated as: ``` /?q=foo --> / ``` The prefetch cache hits, not re-rendering, and the `searchParams` value is not passed properly. ### How? For the prefetch cache, add the `location.search` as well. Since `createPrefetchCacheKey` uses [`createHrefFromUrl`](https://github.com/vercel/next.js/blob/canary/packages/next/src/client/components/router-reducer/create-href-from-url.ts) which includes `location.search`, I'm expecting the change won't affect current cache key behavior. Fixes #64170 Fixes #65030 --------- Co-authored-by: Zack Tanner <[email protected]>
26 lines
889 B
TypeScript
26 lines
889 B
TypeScript
import { nextTestSetup } from 'e2e-utils'
|
|
import { retry } from 'next-test-utils'
|
|
|
|
describe('prefetch-searchparam', () => {
|
|
const { next } = nextTestSetup({
|
|
files: __dirname,
|
|
})
|
|
it('should set prefetch cache properly on different search params', async () => {
|
|
// load WITH search param
|
|
const browser = await next.browser('/?q=foo')
|
|
expect(await browser.elementByCss('p').text()).toBe('{"q":"foo"}')
|
|
|
|
// navigate to different search param, should update the search param
|
|
await browser.elementByCss('[href="/?q=bar"]').click()
|
|
await retry(async () => {
|
|
expect(await browser.elementByCss('p').text()).toBe('{"q":"bar"}')
|
|
})
|
|
|
|
// navigate to home, should clear the searchParams value
|
|
await browser.elementByCss('[href="/"]').click()
|
|
await retry(async () => {
|
|
expect(await browser.elementByCss('p').text()).toBe('{}')
|
|
})
|
|
})
|
|
})
|