Skip to content

Conversation

@acdlite
Copy link
Contributor

@acdlite acdlite commented Dec 13, 2025

Based on:


hmr-refresh-reducer is identical to refresh-reducer except for the fact that it doesn't evict the prefetch cache. So this refactors both implementations to call the same shared function.

This merges the logic inside updateCacheNodeOnPopstateRestoration
into the function used for all other navigation types.

The main difference between history traversal navigations and other
navigation types is our treatment of dynamic data. History traversal
operations are allowed to reuse dynamic data regardless of its freshness
or staleness. So I've updated the `shouldRefreshDynamicData` argument
to be an enum that accounts for our various freshness policies. As of
now, there are three: Default, HistoryTraversal, and RefreshAll.

This is part of an ongoing series of refactors to unify all navigation
types into a single flow, both to simplify the implementation, and
to ensure the behavior is consistent.
Internal refactor. When navigating to an unknown URL whose route is not
already in the  cache, we will have already received data from the
server _before_ we construct the next CacheNode tree. This is
essentially the same as  when a Server Action triggers a navigation and
sends back data in the same response. So, this updates the
implementation so both cases are handled the same way: by passing in
"seed" data into the function that constructs the next CacheNode tree.
Updates the NavigationTask type to represent the full tree, rather than
just the patch. Then we can reuse the logic in
convertServerPatchToFullTree to line up the server response with the
pending CacheNodes.

No behavioral changes, just cleans up the implementation by using the
new function added in the previous commit.
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Dec 13, 2025

Failing test suites

Commit: 97d40c7 | About building and testing Next.js

pnpm test-start test/e2e/app-dir/concurrent-navigations/mismatching-prefetch.test.ts (job)

  • mismatching prefetch > recovers when a navigation redirects to a different route than the one that was prefetched (DD)
Expand output

● mismatching prefetch › recovers when a navigation redirects to a different route than the one that was prefetched

Expected sequence of responses does not match:

- Expected
+ Received

  Array [
    "Dynamic page b",
-   "Dynamic page b",
  ]

NOTE: Assertions are checked in order, so if an expectation is missing, it may have actually appeared earlier in the sequence than expected. Make sure the order is correct.

  39 |       // When we click the link to navigate, the navigation will redirect to
  40 |       // a different route than the one that was prefetched.
> 41 |       await act(
     |             ^
  42 |         async () => {
  43 |           const link = await browser.elementByCss(
  44 |             'a[href="/mismatching-prefetch/dynamic-page/a?mismatch-redirect=./b"]'

  at Object.act (e2e/app-dir/concurrent-navigations/mismatching-prefetch.test.ts:41:13)

pnpm test-dev test/e2e/app-dir/use-cache-dev/use-cache-dev.test.ts (job)

  • use-cache-dev > should update cached data after editing a file (DD)
Expand output

● use-cache-dev › should update cached data after editing a file

expect(received).toBe(expected) // Object.is equality

Expected: "0.18769222347396397"
Received: "0.7116321785199107"

  44 |
  45 |         // Cached via server components HMR cache:
> 46 |         expect(newFetchedRandom).toBe(initialFetchedRandom)
     |                                  ^
  47 |
  48 |         // Edited value:
  49 |         expect(newText).toBe('bar')

  at toBe (e2e/app-dir/use-cache-dev/use-cache-dev.test.ts:46:34)
  at retry (lib/next-test-utils.ts:797:14)
  at Object.<anonymous> (e2e/app-dir/use-cache-dev/use-cache-dev.test.ts:38:7)

pnpm test-dev test/development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts (job)

  • server-components-hmr-cache > edge runtime > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > edge runtime > in after() > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > edge runtime > with cacheMaxMemorySize set to 0 > should still use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > in after() > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > with cacheMaxMemorySize set to 0 > should still use cached fetch calls for fast refresh requests (DD)
Expand output

● server-components-hmr-cache › edge runtime › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.3553061973875451"
Received: "0.0455482051997429"

  34 |
  35 |           const valueAfterPatch = await browser.elementById('value').text()
> 36 |           expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                    ^
  37 |         }
  38 |       )
  39 |     })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:36:36)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:25:7)

● server-components-hmr-cache › edge runtime › in after() › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.12463179760772625"
Received: "0.5307654292303214"

  72 |
  73 |             const valueAfterPatch = getLoggedAfterValue()
> 74 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                      ^
  75 |           }
  76 |         )
  77 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:74:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:63:9)

● server-components-hmr-cache › edge runtime › with cacheMaxMemorySize set to 0 › should still use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.9511198220026049"
Received: "0.22005651237088197"

  141 |             // HMR cache should still work even with cacheMaxMemorySize: 0
  142 |             const valueAfterPatch = await browser.elementById('value').text()
> 143 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
      |                                      ^
  144 |           }
  145 |         )
  146 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:143:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:132:9)

● server-components-hmr-cache › node runtime › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.19555473422687886"
Received: "0.6339762499511881"

  34 |
  35 |           const valueAfterPatch = await browser.elementById('value').text()
> 36 |           expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                    ^
  37 |         }
  38 |       )
  39 |     })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:36:36)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:25:7)

● server-components-hmr-cache › node runtime › in after() › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.8532763750157184"
Received: "0.27887937985161937"

  72 |
  73 |             const valueAfterPatch = getLoggedAfterValue()
> 74 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                      ^
  75 |           }
  76 |         )
  77 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:74:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:63:9)

● server-components-hmr-cache › node runtime › with cacheMaxMemorySize set to 0 › should still use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.02040143423040508"
Received: "0.10931251633035433"

  141 |             // HMR cache should still work even with cacheMaxMemorySize: 0
  142 |             const valueAfterPatch = await browser.elementById('value').text()
> 143 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
      |                                      ^
  144 |           }
  145 |         )
  146 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:143:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:132:9)

pnpm test-dev-turbo test/development/app-dir/hmr-intercept-routes/hmr-intercept-routes.test.ts (turbopack) (job)

  • server-components-hmr-cache > edge runtime > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > edge runtime > in after() > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > edge runtime > with cacheMaxMemorySize set to 0 > should still use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > in after() > should use cached fetch calls for fast refresh requests (DD)
  • server-components-hmr-cache > node runtime > with cacheMaxMemorySize set to 0 > should still use cached fetch calls for fast refresh requests (DD)
Expand output

● server-components-hmr-cache › edge runtime › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.6956896708448426"
Received: "0.5938553475289219"

  34 |
  35 |           const valueAfterPatch = await browser.elementById('value').text()
> 36 |           expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                    ^
  37 |         }
  38 |       )
  39 |     })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:36:36)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:25:7)

● server-components-hmr-cache › edge runtime › in after() › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.6753958669200053"
Received: "0.44313893100698154"

  72 |
  73 |             const valueAfterPatch = getLoggedAfterValue()
> 74 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                      ^
  75 |           }
  76 |         )
  77 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:74:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:63:9)

● server-components-hmr-cache › edge runtime › with cacheMaxMemorySize set to 0 › should still use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.022182724765944517"
Received: "0.3438848118969615"

  141 |             // HMR cache should still work even with cacheMaxMemorySize: 0
  142 |             const valueAfterPatch = await browser.elementById('value').text()
> 143 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
      |                                      ^
  144 |           }
  145 |         )
  146 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:143:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:132:9)

● server-components-hmr-cache › node runtime › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.24425165291594841"
Received: "0.2498169860527546"

  34 |
  35 |           const valueAfterPatch = await browser.elementById('value').text()
> 36 |           expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                    ^
  37 |         }
  38 |       )
  39 |     })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:36:36)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:25:7)

● server-components-hmr-cache › node runtime › in after() › should use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.8880519540196046"
Received: "0.6857711142843339"

  72 |
  73 |             const valueAfterPatch = getLoggedAfterValue()
> 74 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
     |                                      ^
  75 |           }
  76 |         )
  77 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:74:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:63:9)

● server-components-hmr-cache › node runtime › with cacheMaxMemorySize set to 0 › should still use cached fetch calls for fast refresh requests

expect(received).toEqual(expected) // deep equality

Expected: "0.34605791971038946"
Received: "0.4971428300246701"

  141 |             // HMR cache should still work even with cacheMaxMemorySize: 0
  142 |             const valueAfterPatch = await browser.elementById('value').text()
> 143 |             expect(valueBeforePatch).toEqual(valueAfterPatch)
      |                                      ^
  144 |           }
  145 |         )
  146 |       })

  at toEqual (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:143:38)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (development/app-dir/server-components-hmr-cache/server-components-hmr-cache.test.ts:132:9)

pnpm test-dev test/e2e/app-dir/logging/fetch-logging.test.ts (job)

  • app-dir - fetch logging > should not log requests for HMR refreshes (DD)
  • app-dir - logging > with fetches default logging > when logging.fetches.hmrRefreshes is true > should log requests for HMR refreshes (DD)
  • app-dir - logging > with fetches verbose logging > when logging.fetches.hmrRefreshes is true > should log requests for HMR refreshes (DD)
  • app-dir - logging > with verbose logging for edge runtime > when logging.fetches.hmrRefreshes is true > should log requests for HMR refreshes (DD)
Expand output

● app-dir - fetch logging › should not log requests for HMR refreshes

expect(received).not.toInclude(expected)

Expected string to not include:
  " │ GET "
Received:
  " GET /fetch-no-store 200 in 212ms (compile: 34ms, proxy.ts: 4ms, render: 174ms)
 │ GET https://next-data-api-endpoint.vercel.app/api/random?request-input 200 in 156ms (cache skip)
 │ │ Cache skipped reason: (cache: no-store)
"

  67 |             const logs = stripAnsi(next.cliOutput.slice(outputIndex))
  68 |             expect(logs).toInclude(' GET /fetch-no-store')
> 69 |             expect(logs).not.toInclude(` │ GET `)
     |                              ^
  70 |             // TODO: remove custom duration in case we increase the default.
  71 |           }, 5000)
  72 |         }

  at toInclude (e2e/app-dir/logging/fetch-logging.test.ts:69:30)
  at retry (lib/next-test-utils.ts:797:14)
  at e2e/app-dir/logging/fetch-logging.test.ts:64:11
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:60:7)

● app-dir - logging › with fetches verbose logging › when logging.fetches.hmrRefreshes is true › should log requests for HMR refreshes

expect(received).toInclude(expected)

Expected string to include:
  " │ GET https://next-data-api-endpoint.vercel.app/api/random?request-input 200 in 1ms (HMR cache)"
Received:
  " GET /fetch-no-store 200 in 1ms (compile: 1ms, proxy.ts: 1ms, render: 1ms)
 │ GET https://next-data-api-endpoint.vercel.app/api/random?request-input 200 in 1ms (cache skip)
 │ │ Cache skipped reason: (cache: no-store)
"

  322 |
  323 |                   expect(logs).toInclude(' GET /fetch-no-store')
> 324 |                   expect(logs).toInclude(
      |                                ^
  325 |                     ` │ GET ${expectedUrl}?request-input 200 in 1ms (HMR cache)`
  326 |                   )
  327 |                   // TODO: remove custom duration in case we increase the default.

  at toInclude (e2e/app-dir/logging/fetch-logging.test.ts:324:32)
  at retry (lib/next-test-utils.ts:797:14)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:307:13)

● app-dir - logging › with fetches default logging › when logging.fetches.hmrRefreshes is true › should log requests for HMR refreshes

expect(received).toInclude(expected)

Expected string to include:
  " │ GET https://next-data-api-en../api/random?request-input 200 in 1ms (HMR cache)"
Received:
  " GET /fetch-no-store 200 in 1ms (compile: 1ms, proxy.ts: 1ms, render: 1ms)
 │ GET https://next-data-api-en../api/random?request-input 200 in 1ms (cache skip)
 │ │ Cache skipped reason: (cache: no-store)
"

  322 |
  323 |                   expect(logs).toInclude(' GET /fetch-no-store')
> 324 |                   expect(logs).toInclude(
      |                                ^
  325 |                     ` │ GET ${expectedUrl}?request-input 200 in 1ms (HMR cache)`
  326 |                   )
  327 |                   // TODO: remove custom duration in case we increase the default.

  at toInclude (e2e/app-dir/logging/fetch-logging.test.ts:324:32)
  at retry (lib/next-test-utils.ts:797:14)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:307:13)

● app-dir - logging › with verbose logging for edge runtime › when logging.fetches.hmrRefreshes is true › should log requests for HMR refreshes

expect(received).toInclude(expected)

Expected string to include:
  " │ GET https://next-data-api-endpoint.vercel.app/api/random?request-input 200 in 1ms (HMR cache)"
Received:
  " GET /fetch-no-store 200 in 1ms (proxy.ts: 1ms)
 │ GET https://next-data-api-endpoint.vercel.app/api/random?request-input 200 in 1ms (cache skip)
 │ │ Cache skipped reason: (cache: no-store)
"

  322 |
  323 |                   expect(logs).toInclude(' GET /fetch-no-store')
> 324 |                   expect(logs).toInclude(
      |                                ^
  325 |                     ` │ GET ${expectedUrl}?request-input 200 in 1ms (HMR cache)`
  326 |                   )
  327 |                   // TODO: remove custom duration in case we increase the default.

  at toInclude (e2e/app-dir/logging/fetch-logging.test.ts:324:32)
  at retry (lib/next-test-utils.ts:797:14)
  at NextDevInstance.patchFile (lib/next-modes/base.ts:716:9)
  at NextDevInstance.patchFile (lib/next-modes/next-dev.ts:303:16)
  at Object.<anonymous> (e2e/app-dir/logging/fetch-logging.test.ts:307:13)

pnpm test-dev-turbo test/development/app-dir/ssr-only-error/ssr-only-error.test.ts (turbopack) (job)

  • ssr-only-error > should show ssr only error in error overlay (DD)
Expand output

● ssr-only-error › should show ssr only error in error overlay

expect(received).toMatchInlineSnapshot(snapshot)

Snapshot name: `ssr-only-error should show ssr only error in error overlay 1`

- Snapshot  - 11
+ Received  +  1

- {
-   "description": "SSR only error",
-   "environmentLabel": null,
-   "label": "Runtime Error",
-   "source": "app/page.tsx (5:11) @ Component
- > 5 |     throw new Error('SSR only error')
-     |           ^",
-   "stack": [
-     "Component app/page.tsx (5:11)",
-   ],
- }
+ "Redbox did not open."

  11 |
  12 |     // TODO(veil): Missing Owner Stack (NDX-905)
> 13 |     await expect(browser).toDisplayCollapsedRedbox(`
     |                           ^
  14 |      {
  15 |        "description": "SSR only error",
  16 |        "environmentLabel": null,

  at Object.toDisplayCollapsedRedbox (development/app-dir/ssr-only-error/ssr-only-error.test.ts:13:27)

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Dec 13, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
buildDuration 17.1s 14.9s N/A
buildDurationCached 13.8s 10.8s N/A
nodeModulesSize 457 MB 457 MB N/A
nextStartRea..uration (ms) 713ms 711ms N/A
Client Bundles (main, webpack) Overall increase ⚠️
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
4765.HASH.js gzip 169 B 169 B
6566-HASH.js gzip 5.4 kB 5.38 kB N/A
7740-HASH.js gzip 53.2 kB 53 kB N/A
8258-HASH.js gzip 4.47 kB 4.48 kB N/A
b0b1acf2-HASH.js gzip 62.3 kB 62.3 kB N/A
framework-HASH.js gzip 59.7 kB 59.7 kB N/A
main-app-HASH.js gzip 254 B 252 B N/A
main-HASH.js gzip 38.5 kB 38.8 kB ⚠️ +260 B
webpack-HASH.js gzip 1.69 kB 1.69 kB
Overall change 40.4 kB 40.6 kB ⚠️ +260 B
Legacy Client Bundles (polyfills)
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
_app-HASH.js gzip 193 B 192 B N/A
_error-HASH.js gzip 181 B 182 B N/A
css-HASH.js gzip 335 B 336 B N/A
dynamic-HASH.js gzip 1.81 kB 1.8 kB N/A
edge-ssr-HASH.js gzip 254 B 256 B N/A
head-HASH.js gzip 350 B 350 B
hooks-HASH.js gzip 385 B 383 B N/A
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 259 B 259 B
link-HASH.js gzip 2.5 kB 2.5 kB N/A
routerDirect..HASH.js gzip 320 B 317 B N/A
script-HASH.js gzip 386 B 384 B N/A
withRouter-HASH.js gzip 315 B 314 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 1.29 kB 1.29 kB
Client Build Manifests
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
_buildManifest.js gzip 737 B 735 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
index.html gzip 522 B 524 B N/A
link.html gzip 537 B 538 B N/A
withRouter.html gzip 518 B 520 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size Overall increase ⚠️
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
edge-ssr.js gzip 124 kB 125 kB ⚠️ +385 B
page.js gzip 236 kB 237 kB ⚠️ +1.11 kB
Overall change 360 kB 362 kB ⚠️ +1.5 kB
Middleware size
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
middleware-b..fest.js gzip 657 B 656 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 32.8 kB 32.8 kB N/A
edge-runtime..pack.js gzip 846 B 846 B
Overall change 846 B 846 B
Next Runtimes Overall increase ⚠️
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
app-page-exp...dev.js gzip 301 kB 302 kB ⚠️ +309 B
app-page-exp..prod.js gzip 155 kB 155 kB N/A
app-page-tur...dev.js gzip 301 kB 301 kB ⚠️ +318 B
app-page-tur..prod.js gzip 155 kB 155 kB N/A
app-page-tur...dev.js gzip 298 kB 298 kB ⚠️ +317 B
app-page-tur..prod.js gzip 153 kB 153 kB N/A
app-page.run...dev.js gzip 298 kB 298 kB ⚠️ +316 B
app-page.run..prod.js gzip 153 kB 153 kB N/A
app-route-ex...dev.js gzip 68.6 kB 68.6 kB
app-route-ex..prod.js gzip 47.5 kB 47.5 kB
app-route-tu...dev.js gzip 68.7 kB 68.7 kB
app-route-tu..prod.js gzip 47.5 kB 47.5 kB
app-route-tu...dev.js gzip 68.3 kB 68.3 kB
app-route-tu..prod.js gzip 47.2 kB 47.2 kB
app-route.ru...dev.js gzip 68.2 kB 68.2 kB
app-route.ru..prod.js gzip 47.2 kB 47.2 kB
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 328 B 328 B
dist_client_...dev.js gzip 320 B 320 B
dist_client_...dev.js gzip 318 B 318 B
pages-api-tu...dev.js gzip 41 kB 41 kB
pages-api-tu..prod.js gzip 31.1 kB 31.1 kB
pages-api.ru...dev.js gzip 41 kB 41 kB
pages-api.ru..prod.js gzip 31.1 kB 31.1 kB
pages-turbo....dev.js gzip 50.5 kB 50.5 kB
pages-turbo...prod.js gzip 38 kB 38 kB
pages.runtim...dev.js gzip 50.5 kB 50.5 kB
pages.runtim..prod.js gzip 38 kB 38 kB
server.runti..prod.js gzip 59.8 kB 59.8 kB
Overall change 2.04 MB 2.05 MB ⚠️ +1.26 kB
build cache Overall increase ⚠️
vercel/next.js canary acdlite/next.js re-implement-hmr-refresh Change
0.pack gzip 3.1 MB 3.62 MB ⚠️ +515 kB
index.pack gzip 94 kB 98 kB ⚠️ +4.01 kB
Overall change 3.2 MB 3.72 MB ⚠️ +519 kB
Diff details
Diff for page.js

Diff too large to display

Diff for middleware.js

Diff too large to display

Diff for edge-ssr.js

Diff too large to display

Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
       numHashes: NaN,
       bitArray: [],
     },
-    "/": ["static\u002Fchunks\u002Fpages\u002Findex-8312816003c836ca.js"],
+    "/": ["static\u002Fchunks\u002Fpages\u002Findex-0eb0f30aae464b15.js"],
     "/_error": [
-      "static\u002Fchunks\u002Fpages\u002F_error-108d239ccbd01df3.js",
+      "static\u002Fchunks\u002Fpages\u002F_error-7503b65793aeda9f.js",
     ],
     "/css": [
       "static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
-      "static\u002Fchunks\u002Fpages\u002Fcss-c7999ca7b397642c.js",
+      "static\u002Fchunks\u002Fpages\u002Fcss-14b4ec2febaa617d.js",
     ],
     "/dynamic": [
-      "static\u002Fchunks\u002Fpages\u002Fdynamic-1bf1b522b071e22a.js",
+      "static\u002Fchunks\u002Fpages\u002Fdynamic-24891a28ecfaf61d.js",
     ],
     "/edge-ssr": [
-      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-9f01876339e3437b.js",
+      "static\u002Fchunks\u002Fpages\u002Fedge-ssr-f68757662e8cc4b5.js",
     ],
-    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-edae0400cfdbe933.js"],
-    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-c11320a657ec666d.js"],
+    "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-25d6de8fe25c2526.js"],
+    "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-34de3af84d413de3.js"],
     "/image": [
-      "static\u002Fchunks\u002F8258-9768ab794e68b1dc.js",
-      "static\u002Fchunks\u002Fpages\u002Fimage-174112e04c93dfd7.js",
+      "static\u002Fchunks\u002F6316-07d5277e1ed2f1f9.js",
+      "static\u002Fchunks\u002Fpages\u002Fimage-7218f8bad067d350.js",
     ],
-    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-69a06d3260afde67.js"],
+    "/link": ["static\u002Fchunks\u002Fpages\u002Flink-fb9703d62b3bdf85.js"],
     "/routerDirect": [
-      "static\u002Fchunks\u002Fpages\u002FrouterDirect-eab8cdd319b4a9be.js",
+      "static\u002Fchunks\u002Fpages\u002FrouterDirect-7a0b11345ff468cf.js",
     ],
     "/script": [
-      "static\u002Fchunks\u002Fpages\u002Fscript-ae5bd9e9cf17793f.js",
+      "static\u002Fchunks\u002Fpages\u002Fscript-3fa0815377002305.js",
     ],
     "/withRouter": [
-      "static\u002Fchunks\u002Fpages\u002FwithRouter-b277df764694ea2e.js",
+      "static\u002Fchunks\u002Fpages\u002FwithRouter-608a306c0a09e667.js",
     ],
     sortedPages: [
       "\u002F",
Diff for css-HASH.js
@@ -1,31 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9813],
   {
-    /***/ 4131: /***/ (module) => {
-      // extracted by mini-css-extract-plugin
-      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
-      /***/
-    },
-
-    /***/ 6015: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/css",
-        function () {
-          return __webpack_require__(6854);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 6854: /***/ (
+    /***/ 1048: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -39,7 +15,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(4131);
+        __webpack_require__(9541);
       /* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           _css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -58,13 +34,37 @@
 
       /***/
     },
+
+    /***/ 4641: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/css",
+        function () {
+          return __webpack_require__(1048);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9541: /***/ (module) => {
+      // extracted by mini-css-extract-plugin
+      module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(6015)
+      __webpack_exec__(4641)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,17 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2291],
   {
-    /***/ 946: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(5104);
-
-      /***/
-    },
-
-    /***/ 1036: /***/ (
+    /***/ 1266: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(946);
+        __webpack_require__(1776);
       /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -35,12 +25,12 @@
       const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
         () =>
           __webpack_require__
-            .e(/* import() */ 4765)
-            .then(__webpack_require__.bind(__webpack_require__, 4765))
+            .e(/* import() */ 9715)
+            .then(__webpack_require__.bind(__webpack_require__, 9715))
             .then((mod) => mod.Hello),
         {
           loadableGenerated: {
-            webpack: () => [/*require.resolve*/ 4765],
+            webpack: () => [/*require.resolve*/ 9715],
           },
         }
       );
@@ -67,7 +57,44 @@
       /***/
     },
 
-    /***/ 3399: /***/ (
+    /***/ 1776: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(7760);
+
+      /***/
+    },
+
+    /***/ 3749: /***/ (
+      __unused_webpack_module,
+      exports,
+      __webpack_require__
+    ) => {
+      "use strict";
+      /* __next_internal_client_entry_do_not_use__  cjs */
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "LoadableContext", {
+        enumerable: true,
+        get: function () {
+          return LoadableContext;
+        },
+      });
+      const _interop_require_default = __webpack_require__(1532);
+      const _react = /*#__PURE__*/ _interop_require_default._(
+        __webpack_require__(7197)
+      );
+      const LoadableContext = _react.default.createContext(null);
+      if (false) {
+      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+
+      /***/
+    },
+
+    /***/ 6535: /***/ (
       __unused_webpack_module,
       exports,
       __webpack_require__
@@ -109,7 +136,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       const _react = /*#__PURE__*/ _interop_require_default._(
         __webpack_require__(7197)
       );
-      const _loadablecontextsharedruntime = __webpack_require__(9829);
+      const _loadablecontextsharedruntime = __webpack_require__(3749);
       function resolve(obj) {
         return obj && obj.default ? obj.default : obj;
       }
@@ -342,7 +369,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 5104: /***/ (module, exports, __webpack_require__) => {
+    /***/ 7760: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -375,7 +402,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
         __webpack_require__(7197)
       );
       const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(3399)
+        __webpack_require__(6535)
       );
       const isServerSide = "object" === "undefined";
       // Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -475,7 +502,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       /***/
     },
 
-    /***/ 8695: /***/ (
+    /***/ 9585: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -483,7 +510,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/dynamic",
         function () {
-          return __webpack_require__(1036);
+          return __webpack_require__(1266);
         },
       ]);
       if (false) {
@@ -491,40 +518,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 
       /***/
     },
-
-    /***/ 9829: /***/ (
-      __unused_webpack_module,
-      exports,
-      __webpack_require__
-    ) => {
-      "use strict";
-      /* __next_internal_client_entry_do_not_use__  cjs */
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "LoadableContext", {
-        enumerable: true,
-        get: function () {
-          return LoadableContext;
-        },
-      });
-      const _interop_require_default = __webpack_require__(1532);
-      const _react = /*#__PURE__*/ _interop_require_default._(
-        __webpack_require__(7197)
-      );
-      const LoadableContext = _react.default.createContext(null);
-      if (false) {
-      } //# sourceMappingURL=loadable-context.shared-runtime.js.map
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(8695)
+      __webpack_exec__(9585)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for head-HASH.js
@@ -1,24 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [5350],
   {
-    /***/ 361: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/head",
-        function () {
-          return __webpack_require__(721);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 721: /***/ (
+    /***/ 5163: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -33,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5051);
+        __webpack_require__(7269);
       /* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -67,12 +50,29 @@
       /***/
     },
 
-    /***/ 5051: /***/ (
+    /***/ 7269: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(4981);
+      module.exports = __webpack_require__(2053);
+
+      /***/
+    },
+
+    /***/ 8563: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/head",
+        function () {
+          return __webpack_require__(5163);
+        },
+      ]);
+      if (false) {
+      }
 
       /***/
     },
@@ -82,7 +82,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(361)
+      __webpack_exec__(8563)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [9804],
   {
-    /***/ 1705: /***/ (
+    /***/ 1271: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/hooks",
+        function () {
+          return __webpack_require__(2631);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 2631: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -59,30 +76,13 @@
 
       /***/
     },
-
-    /***/ 8637: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/hooks",
-        function () {
-          return __webpack_require__(1705);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(8637)
+      __webpack_exec__(1271)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for image-HASH.js
@@ -1,7 +1,24 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [2983],
   {
-    /***/ 798: /***/ (
+    /***/ 565: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/image",
+        function () {
+          return __webpack_require__(7813);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 7813: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -18,8 +35,8 @@
 
       // EXTERNAL MODULE: ./node_modules/.pnpm/react@19.2.2/node_modules/react/jsx-runtime.js
       var jsx_runtime = __webpack_require__(1329);
-      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+main-repo+packages+next+next-packed.tgz_react-dom@19.2.2_react@19.2.2__react@19.2.2/node_modules/next/image.js
-      var next_image = __webpack_require__(8258);
+      // EXTERNAL MODULE: ./node_modules/.pnpm/next@file+..+diff-repo+packages+next+next-packed.tgz_react-dom@19.2.2_react@19.2.2__react@19.2.2/node_modules/next/image.js
+      var next_image = __webpack_require__(6316);
       var image_default = /*#__PURE__*/ __webpack_require__.n(next_image); // ./pages/nextjs.png
       /* harmony default export */ const nextjs = {
         src: "/_next/static/media/nextjs.cae0b805.png",
@@ -48,30 +65,13 @@
 
       /***/
     },
-
-    /***/ 7643: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/image",
-        function () {
-          return __webpack_require__(798);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
-    /******/ __webpack_require__.O(0, [8258, 636, 6593, 8792], () =>
-      __webpack_exec__(7643)
+    /******/ __webpack_require__.O(0, [6316, 636, 6593, 8792], () =>
+      __webpack_exec__(565)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,43 +1,36 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4672],
   {
-    /***/ 4183: /***/ (module, exports, __webpack_require__) => {
+    /***/ 443: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(2457);
+
+      /***/
+    },
+
+    /***/ 2185: /***/ (__unused_webpack_module, exports) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
         value: true,
       });
-      Object.defineProperty(exports, "getDomainLocale", {
+      Object.defineProperty(exports, "errorOnce", {
         enumerable: true,
         get: function () {
-          return getDomainLocale;
+          return errorOnce;
         },
       });
-      const _normalizetrailingslash = __webpack_require__(8887);
-      const basePath =
-        /* unused pure expression or super */ null && (false || "");
-      function getDomainLocale(path, locale, locales, domainLocales) {
-        if (false) {
-        } else {
-          return false;
-        }
-      }
-      if (
-        (typeof exports.default === "function" ||
-          (typeof exports.default === "object" && exports.default !== null)) &&
-        typeof exports.default.__esModule === "undefined"
-      ) {
-        Object.defineProperty(exports.default, "__esModule", {
-          value: true,
-        });
-        Object.assign(exports.default, exports);
-        module.exports = exports.default;
-      } //# sourceMappingURL=get-domain-locale.js.map
+      let errorOnce = (_) => {};
+      if (false) {
+      } //# sourceMappingURL=error-once.js.map
 
       /***/
     },
 
-    /***/ 5049: /***/ (module, exports, __webpack_require__) => {
+    /***/ 2457: /***/ (module, exports, __webpack_require__) => {
       "use strict";
       /* __next_internal_client_entry_do_not_use__  cjs */
       Object.defineProperty(exports, "__esModule", {
@@ -64,17 +57,17 @@
       const _react = /*#__PURE__*/ _interop_require_wildcard._(
         __webpack_require__(7197)
       );
-      const _resolvehref = __webpack_require__(3575);
-      const _islocalurl = __webpack_require__(4135);
-      const _formaturl = __webpack_require__(3050);
-      const _utils = __webpack_require__(6864);
-      const _addlocale = __webpack_require__(1789);
-      const _routercontextsharedruntime = __webpack_require__(1778);
-      const _useintersection = __webpack_require__(7210);
-      const _getdomainlocale = __webpack_require__(4183);
-      const _addbasepath = __webpack_require__(6518);
-      const _usemergedref = __webpack_require__(9011);
-      const _erroronce = __webpack_require__(5193);
+      const _resolvehref = __webpack_require__(5687);
+      const _islocalurl = __webpack_require__(7127);
+      const _formaturl = __webpack_require__(58);
+      const _utils = __webpack_require__(2080);
+      const _addlocale = __webpack_require__(5709);
+      const _routercontextsharedruntime = __webpack_require__(4770);
+      const _useintersection = __webpack_require__(3290);
+      const _getdomainlocale = __webpack_require__(4615);
+      const _addbasepath = __webpack_require__(8422);
+      const _usemergedref = __webpack_require__(9667);
+      const _erroronce = __webpack_require__(2185);
       const prefetched = new Set();
       function prefetch(router, href, as, options) {
         if (false) {
@@ -453,82 +446,7 @@
       /***/
     },
 
-    /***/ 5193: /***/ (__unused_webpack_module, exports) => {
-      "use strict";
-
-      Object.defineProperty(exports, "__esModule", {
-        value: true,
-      });
-      Object.defineProperty(exports, "errorOnce", {
-        enumerable: true,
-        get: function () {
-          return errorOnce;
-        },
-      });
-      let errorOnce = (_) => {};
-      if (false) {
-      } //# sourceMappingURL=error-once.js.map
-
-      /***/
-    },
-
-    /***/ 5529: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(5049);
-
-      /***/
-    },
-
-    /***/ 6887: /***/ (
-      __unused_webpack_module,
-      __webpack_exports__,
-      __webpack_require__
-    ) => {
-      "use strict";
-      __webpack_require__.r(__webpack_exports__);
-      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
-        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
-        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
-        /* harmony export */
-      });
-      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
-        __webpack_require__(1329);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(5529);
-      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
-        /*#__PURE__*/ __webpack_require__.n(
-          next_link__WEBPACK_IMPORTED_MODULE_1__
-        );
-
-      function aLink(props) {
-        return /*#__PURE__*/ (0,
-        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
-          children: [
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
-              children: "A Link page!",
-            }),
-            /*#__PURE__*/ (0,
-            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
-              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
-              {
-                href: "/",
-                children: "Go to /",
-              }
-            ),
-          ],
-        });
-      }
-      var __N_SSP = true;
-      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
-
-      /***/
-    },
-
-    /***/ 7210: /***/ (module, exports, __webpack_require__) => {
+    /***/ 3290: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -541,7 +459,7 @@
         },
       });
       const _react = __webpack_require__(7197);
-      const _requestidlecallback = __webpack_require__(1785);
+      const _requestidlecallback = __webpack_require__(6809);
       const hasIntersectionObserver =
         typeof IntersectionObserver === "function";
       const observers = new Map();
@@ -653,7 +571,106 @@
       /***/
     },
 
-    /***/ 9011: /***/ (module, exports, __webpack_require__) => {
+    /***/ 4615: /***/ (module, exports, __webpack_require__) => {
+      "use strict";
+
+      Object.defineProperty(exports, "__esModule", {
+        value: true,
+      });
+      Object.defineProperty(exports, "getDomainLocale", {
+        enumerable: true,
+        get: function () {
+          return getDomainLocale;
+        },
+      });
+      const _normalizetrailingslash = __webpack_require__(903);
+      const basePath =
+        /* unused pure expression or super */ null && (false || "");
+      function getDomainLocale(path, locale, locales, domainLocales) {
+        if (false) {
+        } else {
+          return false;
+        }
+      }
+      if (
+        (typeof exports.default === "function" ||
+          (typeof exports.default === "object" && exports.default !== null)) &&
+        typeof exports.default.__esModule === "undefined"
+      ) {
+        Object.defineProperty(exports.default, "__esModule", {
+          value: true,
+        });
+        Object.assign(exports.default, exports);
+        module.exports = exports.default;
+      } //# sourceMappingURL=get-domain-locale.js.map
+
+      /***/
+    },
+
+    /***/ 6745: /***/ (
+      __unused_webpack_module,
+      __webpack_exports__,
+      __webpack_require__
+    ) => {
+      "use strict";
+      __webpack_require__.r(__webpack_exports__);
+      /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+        /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+        /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+        /* harmony export */
+      });
+      /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+        __webpack_require__(1329);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+        __webpack_require__(443);
+      /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+        /*#__PURE__*/ __webpack_require__.n(
+          next_link__WEBPACK_IMPORTED_MODULE_1__
+        );
+
+      function aLink(props) {
+        return /*#__PURE__*/ (0,
+        react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+          children: [
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+              children: "A Link page!",
+            }),
+            /*#__PURE__*/ (0,
+            react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+              next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+              {
+                href: "/",
+                children: "Go to /",
+              }
+            ),
+          ],
+        });
+      }
+      var __N_SSP = true;
+      /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+
+      /***/
+    },
+
+    /***/ 7595: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/link",
+        function () {
+          return __webpack_require__(6745);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 9667: /***/ (module, exports, __webpack_require__) => {
       "use strict";
 
       Object.defineProperty(exports, "__esModule", {
@@ -730,30 +747,13 @@
 
       /***/
     },
-
-    /***/ 9297: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/link",
-        function () {
-          return __webpack_require__(6887);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9297)
+      __webpack_exec__(7595)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for routerDirect-HASH.js
@@ -1,34 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [188],
   {
-    /***/ 1576: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(5704);
-
-      /***/
-    },
-
-    /***/ 7881: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/routerDirect",
-        function () {
-          return __webpack_require__(9851);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 9851: /***/ (
+    /***/ 3401: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1576);
+        __webpack_require__(6702);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -62,13 +35,40 @@
 
       /***/
     },
+
+    /***/ 4787: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/routerDirect",
+        function () {
+          return __webpack_require__(3401);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
+
+    /***/ 6702: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(728);
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(7881)
+      __webpack_exec__(4787)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,34 +1,17 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [1209],
   {
-    /***/ 2777: /***/ (
-      __unused_webpack_module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      (window.__NEXT_P = window.__NEXT_P || []).push([
-        "/script",
-        function () {
-          return __webpack_require__(9272);
-        },
-      ]);
-      if (false) {
-      }
-
-      /***/
-    },
-
-    /***/ 8662: /***/ (
+    /***/ 6868: /***/ (
       module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
-      module.exports = __webpack_require__(4550);
+      module.exports = __webpack_require__(1190);
 
       /***/
     },
 
-    /***/ 9272: /***/ (
+    /***/ 7478: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -43,7 +26,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(8662);
+        __webpack_require__(6868);
       /* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -75,13 +58,30 @@
 
       /***/
     },
+
+    /***/ 7659: /***/ (
+      __unused_webpack_module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      (window.__NEXT_P = window.__NEXT_P || []).push([
+        "/script",
+        function () {
+          return __webpack_require__(7478);
+        },
+      ]);
+      if (false) {
+      }
+
+      /***/
+    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(2777)
+      __webpack_exec__(7659)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for withRouter-HASH.js
@@ -1,17 +1,7 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [3263],
   {
-    /***/ 1576: /***/ (
-      module,
-      __unused_webpack_exports,
-      __webpack_require__
-    ) => {
-      module.exports = __webpack_require__(5704);
-
-      /***/
-    },
-
-    /***/ 8478: /***/ (
+    /***/ 2528: /***/ (
       __unused_webpack_module,
       __webpack_exports__,
       __webpack_require__
@@ -26,7 +16,7 @@
       /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
         __webpack_require__(1329);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
-        __webpack_require__(1576);
+        __webpack_require__(6702);
       /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
         /*#__PURE__*/ __webpack_require__.n(
           next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -45,7 +35,17 @@
       /***/
     },
 
-    /***/ 9505: /***/ (
+    /***/ 6702: /***/ (
+      module,
+      __unused_webpack_exports,
+      __webpack_require__
+    ) => {
+      module.exports = __webpack_require__(728);
+
+      /***/
+    },
+
+    /***/ 9763: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
@@ -53,7 +53,7 @@
       (window.__NEXT_P = window.__NEXT_P || []).push([
         "/withRouter",
         function () {
-          return __webpack_require__(8478);
+          return __webpack_require__(2528);
         },
       ]);
       if (false) {
@@ -67,7 +67,7 @@
     /******/ var __webpack_exec__ = (moduleId) =>
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
-      __webpack_exec__(9505)
+      __webpack_exec__(9763)
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for 6566-HASH.js

Diff too large to display

Diff for 7740-HASH.js
failed to diff
Diff for 8258-HASH.js

Diff too large to display

Diff for main-HASH.js

Diff too large to display

Diff for main-app-HASH.js
@@ -1,64 +1,64 @@
 (self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
   [4977],
   {
-    /***/ 604: /***/ (
+    /***/ 6170: /***/ () => {
+      /* (ignored) */
+      /***/
+    },
+
+    /***/ 7088: /***/ (
       __unused_webpack_module,
       __unused_webpack_exports,
       __webpack_require__
     ) => {
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6596, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8958, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6101, 23)
+        __webpack_require__.t.bind(__webpack_require__, 711, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7719, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7045, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 3524, 23)
+        __webpack_require__.t.bind(__webpack_require__, 266, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6044, 23)
+        __webpack_require__.t.bind(__webpack_require__, 3438, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 344, 23)
+        __webpack_require__.t.bind(__webpack_require__, 7494, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 6577, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4627, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 7518, 23)
+        __webpack_require__.t.bind(__webpack_require__, 924, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 215, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4766, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 8782, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5564, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 3205, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8095, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.bind(__webpack_require__, 576)
+        __webpack_require__.bind(__webpack_require__, 8350)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 766, 23)
+        __webpack_require__.t.bind(__webpack_require__, 8128, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 2283, 23)
+        __webpack_require__.t.bind(__webpack_require__, 5865, 23)
       );
       Promise.resolve(/* import() eager */).then(
-        __webpack_require__.t.bind(__webpack_require__, 1257, 23)
+        __webpack_require__.t.bind(__webpack_require__, 4103, 23)
       );
 
       /***/
     },
-
-    /***/ 2584: /***/ () => {
-      /* (ignored) */
-      /***/
-    },
   },
   /******/ (__webpack_require__) => {
     // webpackRuntimeModules
@@ -66,8 +66,8 @@
       __webpack_require__((__webpack_require__.s = moduleId));
     /******/ __webpack_require__.O(
       0,
-      [9962, 7740],
-      () => (__webpack_exec__(7620), __webpack_exec__(604))
+      [4627, 8196],
+      () => (__webpack_exec__(1314), __webpack_exec__(7088))
     );
     /******/ var __webpack_exports__ = __webpack_require__.O();
     /******/ _N_E = __webpack_exports__;
Diff for app-page-exp..ntime.dev.js

Diff too large to display

Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..ntime.dev.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Diff for app-page.runtime.prod.js

Diff too large to display

Commit: 97d40c7

@acdlite acdlite force-pushed the re-implement-hmr-refresh branch from 4b08ace to 7fc7736 Compare December 13, 2025 03:20
During a dynamic navigation, the server may respond with a different
route tree than the one we expected. This typically happens due to a
conditional server-side routing change.

This shouldn't happen under normal circumstances, but in some cases
it's unavoidable. Such as a user logging in/out from a different client.

When it does happen, Next.js must recover to a consistent state. This
may involve a brief flash of the incorrect route before the mismatch
is detected.

The recovery mechanism is simple enough: we refresh the page, using
whatever tree the server responds with (bypassing any older version
we may have cached locally). Also, because a route mismatch implies
some sort of server-side mutation, we also evict all the dynamic data
in the client's cache. Similar to what we do when a cookie is mutated
by a Server Action, or in response to a refresh() call.

This replaces the need for the lazy data fetch that happens in
LayoutRouter, via the server-patch reducer. I've left the existing
server-patch logic in place until I've finished migrating the reducers
over to the new implementation. In the meantime, I updated LayoutRouter
to disable the lazy data fetching branch for any navigation produced
by a reducer that has already been ported.
hmr-refresh-reducer is identical to refresh-reducer except for the
fact that it doesn't evict the prefetch cache. So this refactors both
implementations to call the same shared function.
@acdlite acdlite force-pushed the re-implement-hmr-refresh branch from 7fc7736 to 97d40c7 Compare December 13, 2025 03:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants