-
Notifications
You must be signed in to change notification settings - Fork 30k
WIP: perf: Don't inject the entire nextConfig in edge templates #86630
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| adjust_font_fallbacks_with_size_adjust: Option<bool>, | ||
| after: Option<bool>, | ||
| app_document_preloading: Option<bool>, | ||
| cache_life: Option<FxIndexMap<String, CacheLifeProfile>>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
An example of why this was a bad idea: This config was moved out of experimental, but Turbopack's config was never updated, so edge-app-route.ts was probably reading the wrong value when using Turbopack...
Failing test suitesCommit: e20fb2a | About building and testing Next.js
Expand output● Image Loader Config with Edge Runtime › production mode › should add "src" to img1 based on the loader config ● Image Loader Config with Edge Runtime › production mode › should add "srcset" to img1 based on the loader config ● Image Loader Config with Edge Runtime › production mode › should add "src" to img2 based on the loader prop ● Image Loader Config with Edge Runtime › production mode › should add "srcset" to img2 based on the loader prop
Expand output● distDir › production mode › should handle undefined distDir
Expand output● Cache Components Errors › Sync IO in console methods › Console Patching › does not fail the build for Sync IO if console.log is patched to call new Date() internally
Expand output● Image Loader Config with Edge Runtime › development mode › should add "src" to img1 based on the loader config ● Image Loader Config with Edge Runtime › development mode › should add "srcset" to img1 based on the loader config ● Image Loader Config with Edge Runtime › development mode › should add "src" to img2 based on the loader prop ● Image Loader Config with Edge Runtime › development mode › should add "srcset" to img2 based on the loader prop
Expand output● Handles Webpack Require Hook › build › Does not error during build
Expand output● config-output-export › should work with static homepage ● config-output-export › should work with getStaticPaths and fallback false
Expand output● CLI Usage › dev › NODE_OPTIONS='--require=file with spaces to-require-with-node-require-option.js' ● CLI Usage › dev › NODE_OPTIONS='--require=file with spaces to --require.js'
Expand output● app-dir edge SSR › should handle edge only routes
Expand output● edge-render-getserversideprops › should have correct query/params on index ● edge-render-getserversideprops › should have correct query/params on /[id] ● edge-render-getserversideprops › should have correct query/params on rewrite ● edge-render-getserversideprops › should have correct query/params on dynamic rewrite ● edge-render-getserversideprops › should respond to _next/data for index correctly ● edge-render-getserversideprops › should respond to _next/data for [id] correctly
Expand output● edge-render-getserversideprops › should have correct query/params on index ● edge-render-getserversideprops › should have correct query/params on /[id] ● edge-render-getserversideprops › should have correct query/params on rewrite ● edge-render-getserversideprops › should have correct query/params on dynamic rewrite ● edge-render-getserversideprops › should respond to _next/data for index correctly ● edge-render-getserversideprops › should respond to _next/data for [id] correctly
Expand output● edge render - custom _document with edge runtime › should render page properly
Expand output● dynamic-css-client-navigation react lazy edge › should not remove style when navigating from static imported component to react lazy at runtime edge
Expand output● react version › Pages Router page with edge runtime
Expand output● on-request-error - basic › pages router › should catch pages router page error in edge runtime
Expand output● build-output-prerender › with a next config file › without --debug-prerender › prints only the user-selected experimental flags (and the ones enabled via env variable) ● build-output-prerender › with a next config file › without --debug-prerender › shows only a single prerender error with a mangled stack ● build-output-prerender › with a next config file › with --debug-prerender › prints a warning and the customized experimental flags ● build-output-prerender › with a next config file › with --debug-prerender › shows all prerender errors with readable stacks and code frames ● build-output-prerender › without a next config file › without --debug-prerender › prints no experimental flags (unless enabled via env variable) ● build-output-prerender › without a next config file › with --debug-prerender › prints a warning and the customized experimental flags
Expand output● Instrumentation Hook › with-async-edge-page › with-async-edge-page should run the instrumentation hook
Expand output● Handle new URL asset references › pages router › should render the /pages-edge/static page ● Handle new URL asset references › pages router › should client-render the /pages-edge/static page ● Handle new URL asset references › pages router › should render the /pages-edge/ssr page ● Handle new URL asset references › pages router › should client-render the /pages-edge/ssr page
Expand output● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-01 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-02 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-03 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-04 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-05 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-06 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-07 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-08 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-10 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-11 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-12 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-13 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-14 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-15 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-16 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-17 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-18 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-19 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-21 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-22 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-23 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-24 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-25 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-01 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/async-api-type-cast-02 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/custom-routes-access-api-prop-01 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-01 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-02 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/generate-metadata-access-api-prop-03 ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/origin-name-01-util ● next-async-request-api - dynamic-apis › transforms correctly next-async-request-api-dynamic-apis/origin-name-02-util |
0cf5afd to
e20fb2a
Compare
CodSpeed Performance ReportMerging #86630 will degrade performances by 6.93%Comparing Summary
Benchmarks breakdown
Footnotes
|
| pub struct CacheLifeProfile { | ||
| #[serde(skip_serializing_if = "Option::is_none")] | ||
| pub stale: Option<u32>, | ||
| #[serde(skip_serializing_if = "Option::is_none")] | ||
| pub revalidate: Option<u32>, | ||
| #[serde(skip_serializing_if = "Option::is_none")] | ||
| pub expire: Option<u32>, | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't actually care what the contents of CacheLifeProfile are, only that we can round-trip it. So serde_json::Value seems like a much simpler/better choice.
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| buildDuration | 17.3s | 17.6s | |
| buildDurationCached | 13.8s | 10.7s | N/A |
| nodeModulesSize | 458 MB | 457 MB | N/A |
| nextStartRea..uration (ms) | 712ms | 719ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| 4292-HASH.js gzip | 4.45 kB | N/A | N/A |
| 436-HASH.js gzip | 5.38 kB | 5.32 kB | N/A |
| 4779.HASH.js gzip | 169 B | 169 B | ✓ |
| 9760-HASH.js gzip | 52.5 kB | 52.7 kB | |
| c57d0559-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | ✓ |
| main-app-HASH.js gzip | 253 B | 256 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.3 kB | N/A |
| webpack-HASH.js gzip | 1.69 kB | 1.69 kB | ✓ |
| Overall change | 114 kB | 114 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 193 B | 194 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 334 B | 334 B | ✓ |
| dynamic-HASH.js gzip | 1.81 kB | 1.81 kB | N/A |
| edge-ssr-HASH.js gzip | 255 B | 254 B | N/A |
| head-HASH.js gzip | 350 B | 351 B | N/A |
| hooks-HASH.js gzip | 384 B | 384 B | ✓ |
| image-HASH.js gzip | 580 B | 4.77 kB | |
| index-HASH.js gzip | 260 B | 259 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.5 kB | N/A |
| routerDirect..HASH.js gzip | 316 B | 320 B | N/A |
| script-HASH.js gzip | 388 B | 388 B | ✓ |
| withRouter-HASH.js gzip | 316 B | 314 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 1.97 kB | 6.17 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 737 B | 720 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| index.html gzip | 525 B | 523 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 522 B | 519 B | N/A |
| Overall change | 538 B | 538 B | ✓ |
Edge SSR bundle Size
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 126 kB | 124 kB | N/A |
| page.js gzip | 235 kB | 232 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
Middleware size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 654 B | 635 B | N/A |
| middleware-r..fest.js gzip | 156 B | 156 B | ✓ |
| middleware.js gzip | 32.8 kB | 32.9 kB | |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 33.8 kB | 33.9 kB |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 300 kB | N/A |
| app-page-exp..prod.js gzip | 155 kB | 154 kB | N/A |
| app-page-tur...dev.js gzip | 300 kB | 300 kB | N/A |
| app-page-tur..prod.js gzip | 155 kB | 154 kB | N/A |
| app-page-tur...dev.js gzip | 297 kB | 296 kB | N/A |
| app-page-tur..prod.js gzip | 153 kB | 152 kB | N/A |
| app-page.run...dev.js gzip | 297 kB | 297 kB | N/A |
| app-page.run..prod.js gzip | 153 kB | 152 kB | N/A |
| app-route-ex...dev.js gzip | 68.5 kB | 68.5 kB | N/A |
| app-route-ex..prod.js gzip | 47.3 kB | 47.3 kB | N/A |
| app-route-tu...dev.js gzip | 68.5 kB | 68.5 kB | N/A |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | N/A |
| app-route-tu...dev.js gzip | 68.1 kB | 68.1 kB | N/A |
| app-route-tu..prod.js gzip | 47.1 kB | 47.1 kB | N/A |
| app-route.ru...dev.js gzip | 68.1 kB | 68 kB | N/A |
| app-route.ru..prod.js gzip | 47.1 kB | 47 kB | N/A |
| 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 | 40.9 kB | 40.8 kB | N/A |
| pages-api-tu..prod.js gzip | 31 kB | 31 kB | N/A |
| pages-api.ru...dev.js gzip | 40.8 kB | 40.8 kB | N/A |
| pages-api.ru..prod.js gzip | 30.9 kB | 30.9 kB | N/A |
| pages-turbo....dev.js gzip | 50.3 kB | 50.3 kB | N/A |
| pages-turbo...prod.js gzip | 37.8 kB | 37.8 kB | N/A |
| pages.runtim...dev.js gzip | 50.3 kB | 50.3 kB | N/A |
| pages.runtim..prod.js gzip | 37.8 kB | 37.8 kB | N/A |
| server.runti..prod.js gzip | 59.8 kB | 60.4 kB | |
| Overall change | 61.1 kB | 61.7 kB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js bgw/rm-inject-next-config-template | Change | |
|---|---|---|---|
| 0.pack gzip | 3.1 MB | 3.1 MB | |
| index.pack gzip | 93.8 kB | 93.5 kB | N/A |
| Overall change | 3.1 MB | 3.1 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware-b..-manifest.js
@@ -3,92 +3,91 @@ globalThis.__BUILD_MANIFEST = {
devFiles: [],
lowPriorityFiles: [],
rootMainFiles: [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/c57d0559-87d7b411668e52b9.js",
- "static/chunks/9760-1ff065928ecb2e6a.js",
- "static/chunks/main-app-489e2c6220051252.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/fc3b8630-c8df0ee2ac01c9e8.js",
+ "static/chunks/4936-2a9b354938540a25.js",
+ "static/chunks/main-app-5a285e5eb29c8535.js",
],
rootMainFilesTree: {},
pages: {
"/": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/index-9b1f076e9fac03f4.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/index-5523fac5e3835d81.js",
],
"/_app": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/_app-443eabb8a4e5c909.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/_app-8c07b9dcfad803bd.js",
],
"/_error": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/_error-6b752512a6c1df59.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/_error-d96fc1a54d61a013.js",
],
"/css": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
"static/css/ded6b86ab9cc0a1f.css",
- "static/chunks/pages/css-9049095f8d68fcf0.js",
+ "static/chunks/pages/css-a4befe2475e7b7f1.js",
],
"/dynamic": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/dynamic-13423b508b9357ba.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/dynamic-5982726453bd01a1.js",
],
"/edge-ssr": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/edge-ssr-69e1b3a57e819753.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/edge-ssr-6611d49d885b4aee.js",
],
"/head": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/head-f7d913c23a1370c9.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/head-5b00d0ab61ce4b2b.js",
],
"/hooks": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/hooks-497c26b761107c7b.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/hooks-fc936af610663c47.js",
],
"/image": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/4292-ea0825bb0c16a737.js",
- "static/chunks/pages/image-7e7769e30c0e02dc.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/image-50232676a62af73d.js",
],
"/link": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/link-7fdc135fa2024739.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/link-67afc54938b48e5b.js",
],
"/routerDirect": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/routerDirect-41aacbe853e5a2d3.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/routerDirect-d780b8e463346e70.js",
],
"/script": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/script-02909c5224d7541d.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/script-fadf26f818c6a9d9.js",
],
"/withRouter": [
- "static/chunks/webpack-fcf10f51cee06933.js",
- "static/chunks/framework-9097e8e7f9a0f6cb.js",
- "static/chunks/main-a177f1ff425795af.js",
- "static/chunks/pages/withRouter-44eb1a330ebc9a95.js",
+ "static/chunks/webpack-c7aff218e9eee7c3.js",
+ "static/chunks/framework-e894a2c73c6746db.js",
+ "static/chunks/main-fcec177c2d1be8d6.js",
+ "static/chunks/pages/withRouter-f061effa2d48ed55.js",
],
},
};Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
failed to diffDiff for _buildManifest.js
@@ -611,35 +611,32 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-9b1f076e9fac03f4.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-5523fac5e3835d81.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6b752512a6c1df59.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-d96fc1a54d61a013.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-9049095f8d68fcf0.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-a4befe2475e7b7f1.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-13423b508b9357ba.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-5982726453bd01a1.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-69e1b3a57e819753.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-6611d49d885b4aee.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-f7d913c23a1370c9.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-497c26b761107c7b.js"],
- "/image": [
- "static\u002Fchunks\u002F4292-ea0825bb0c16a737.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-7e7769e30c0e02dc.js",
- ],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-7fdc135fa2024739.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-5b00d0ab61ce4b2b.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-fc936af610663c47.js"],
+ "/image": ["static\u002Fchunks\u002Fpages\u002Fimage-50232676a62af73d.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-67afc54938b48e5b.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-41aacbe853e5a2d3.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-d780b8e463346e70.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-02909c5224d7541d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-fadf26f818c6a9d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-44eb1a330ebc9a95.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-f061effa2d48ed55.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,7 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1033: /***/ (
+ /***/ 431: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -9,7 +9,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/dynamic",
function () {
- return __webpack_require__(6490);
+ return __webpack_require__(8084);
},
]);
if (false) {
@@ -18,7 +18,7 @@
/***/
},
- /***/ 5323: /***/ (
+ /***/ 2699: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -60,7 +60,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(2223)
);
- const _loadablecontextsharedruntime = __webpack_require__(9289);
+ const _loadablecontextsharedruntime = __webpack_require__(3785);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -293,73 +293,34 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
- /***/ 6490: /***/ (
+ /***/ 3785: /***/ (
__unused_webpack_module,
- __webpack_exports__,
+ 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 */
+ /* __next_internal_client_entry_do_not_use__ cjs */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
});
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(1503);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7320);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 4779)
- .then(__webpack_require__.bind(__webpack_require__, 4779))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 4779],
- },
- }
+ 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__(2223)
);
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
-
- /***/
- },
-
- /***/ 7320: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(7340);
+ const LoadableContext = _react.default.createContext(null);
+ if (false) {
+ } //# sourceMappingURL=loadable-context.shared-runtime.js.map
/***/
},
- /***/ 7340: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6828: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -392,7 +353,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
__webpack_require__(2223)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(5323)
+ __webpack_require__(2699)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -492,29 +453,68 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
- /***/ 9289: /***/ (
+ /***/ 7514: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(6828);
+
+ /***/
+ },
+
+ /***/ 8084: /***/ (
__unused_webpack_module,
- exports,
+ __webpack_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;
- },
+ __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 */
});
- const _interop_require_default = __webpack_require__(1532);
- const _react = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(2223)
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(1503);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(7514);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 9573)
+ .then(__webpack_require__.bind(__webpack_require__, 9573))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 9573],
+ },
+ }
);
- const LoadableContext = _react.default.createContext(null);
- if (false) {
- } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
@@ -524,7 +524,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1033)
+ __webpack_exec__(431)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1819: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(7521);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 7521: /***/ (
+ /***/ 983: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -37,13 +20,30 @@
/***/
},
+
+ /***/ 985: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(983);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1819)
+ __webpack_exec__(985)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 619: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(9891);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 7997: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(6705);
-
- /***/
- },
-
- /***/ 9891: /***/ (
+ /***/ 1417: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(1503);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7997);
+ __webpack_require__(5171);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +49,40 @@
/***/
},
+
+ /***/ 1937: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(1417);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 5171: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(7505);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(619)
+ __webpack_exec__(1937)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for hooks-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[9804],
{
- /***/ 1679: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/hooks",
- function () {
- return __webpack_require__(4655);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4655: /***/ (
+ /***/ 1598: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 3925: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/hooks",
+ function () {
+ return __webpack_require__(1598);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1679)
+ __webpack_exec__(3925)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for image-HASH.js
Diff too large to display
Diff for link-HASH.js
@@ -1,7 +1,338 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 69: /***/ (module, exports, __webpack_require__) => {
+ /***/ 1511: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(2223);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ 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=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 2025: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(4591);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 3267: /***/ (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__(2371);
+ 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
+
+ /***/
+ },
+
+ /***/ 4591: /***/ (
+ __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__(1503);
+ /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(6929);
+ /* 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;
+
+ /***/
+ },
+
+ /***/ 6929: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(8885);
+
+ /***/
+ },
+
+ /***/ 7686: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(2223);
+ const _requestidlecallback = __webpack_require__(901);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ 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=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 8101: /***/ (__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
+
+ /***/
+ },
+
+ /***/ 8885: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -28,17 +359,17 @@
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(2223)
);
- const _resolvehref = __webpack_require__(2275);
- const _islocalurl = __webpack_require__(3179);
- const _formaturl = __webpack_require__(5486);
- const _utils = __webpack_require__(3708);
- const _addlocale = __webpack_require__(8225);
- const _routercontextsharedruntime = __webpack_require__(6046);
- const _useintersection = __webpack_require__(2678);
- const _getdomainlocale = __webpack_require__(4499);
- const _addbasepath = __webpack_require__(7434);
- const _usemergedref = __webpack_require__(2263);
- const _erroronce = __webpack_require__(2197);
+ const _resolvehref = __webpack_require__(7379);
+ const _islocalurl = __webpack_require__(4843);
+ const _formaturl = __webpack_require__(9374);
+ const _utils = __webpack_require__(3116);
+ const _addlocale = __webpack_require__(8065);
+ const _routercontextsharedruntime = __webpack_require__(5470);
+ const _useintersection = __webpack_require__(7686);
+ const _getdomainlocale = __webpack_require__(3267);
+ const _addbasepath = __webpack_require__(1450);
+ const _usemergedref = __webpack_require__(1511);
+ const _erroronce = __webpack_require__(8101);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -416,344 +747,13 @@
/***/
},
-
- /***/ 2197: /***/ (__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
-
- /***/
- },
-
- /***/ 2263: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(2223);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- 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=use-merged-ref.js.map
-
- /***/
- },
-
- /***/ 2369: /***/ (
- __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__(1503);
- /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(6691);
- /* 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;
-
- /***/
- },
-
- /***/ 2678: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useIntersection", {
- enumerable: true,
- get: function () {
- return useIntersection;
- },
- });
- const _react = __webpack_require__(2223);
- const _requestidlecallback = __webpack_require__(4213);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- 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=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4499: /***/ (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__(1379);
- 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
-
- /***/
- },
-
- /***/ 6691: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(69);
-
- /***/
- },
-
- /***/ 6771: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(2369);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6771)
+ __webpack_exec__(2025)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,7 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 97: /***/ (
+ /***/ 417: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/routerDirect",
+ function () {
+ return __webpack_require__(5491);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 1840: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(3252);
+
+ /***/
+ },
+
+ /***/ 5491: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -16,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(1503);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7798);
+ __webpack_require__(1840);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -35,40 +62,13 @@
/***/
},
-
- /***/ 4283: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/routerDirect",
- function () {
- return __webpack_require__(97);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 7798: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9300);
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4283)
+ __webpack_exec__(417)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 5964: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(2010);
-
- /***/
- },
-
- /***/ 7758: /***/ (
+ /***/ 1312: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(1503);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(5964);
+ __webpack_require__(2398);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -59,7 +49,17 @@
/***/
},
- /***/ 8803: /***/ (
+ /***/ 2398: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(8954);
+
+ /***/
+ },
+
+ /***/ 4305: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -67,7 +67,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/script",
function () {
- return __webpack_require__(7758);
+ return __webpack_require__(1312);
},
]);
if (false) {
@@ -81,7 +81,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(8803)
+ __webpack_exec__(4305)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,7 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 184: /***/ (
+ /***/ 358: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -16,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(1503);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7798);
+ __webpack_require__(1840);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -35,7 +35,17 @@
/***/
},
- /***/ 3163: /***/ (
+ /***/ 1840: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(3252);
+
+ /***/
+ },
+
+ /***/ 4041: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -43,7 +53,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/withRouter",
function () {
- return __webpack_require__(184);
+ return __webpack_require__(358);
},
]);
if (false) {
@@ -51,23 +61,13 @@
/***/
},
-
- /***/ 7798: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9300);
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3163)
+ __webpack_exec__(4041)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 4292-HASH.js
deletedDiff for 436-HASH.js
Diff too large to display
Diff for 9760-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for app-page-exp..ntime.dev.js
failed to diffDiff for app-page-exp..time.prod.js
Diff too large to display
Diff for app-page-tur..ntime.dev.js
failed to diffDiff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page-tur..ntime.dev.js
failed to diffDiff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
failed to diffDiff for app-page.runtime.prod.js
Diff too large to display
Diff for app-route-ex..ntime.dev.js
Diff too large to display
Diff for app-route-ex..time.prod.js
Diff too large to display
Diff for app-route-tu..ntime.dev.js
Diff too large to display
Diff for app-route-tu..time.prod.js
Diff too large to display
Diff for app-route-tu..ntime.dev.js
Diff too large to display
Diff for app-route-tu..time.prod.js
Diff too large to display
Diff for app-route.runtime.dev.js
Diff too large to display
Diff for app-route.ru..time.prod.js
Diff too large to display
Diff for pages-api-tu..ntime.dev.js
Diff too large to display
Diff for pages-api-tu..time.prod.js
Diff too large to display
Diff for pages-api.runtime.dev.js
Diff too large to display
Diff for pages-api.ru..time.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
Diff for server.runtime.prod.js
Diff too large to display
e20fb2a to
3efe766
Compare
3efe766 to
0705706
Compare
0705706 to
e229752
Compare
8810a87 to
fdf9c6e
Compare
e229752 to
f8d9cd2
Compare
f8d9cd2 to
e20fb2a
Compare
fdf9c6e to
dae80fb
Compare
| const { | ||
| query, | ||
| params, | ||
| nextConfig, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to edge-ssr.ts, the edge-ssr-app.ts template extracts nextConfig from prepareResult but globalThis.nextConfig is no longer being set, causing nextConfig to be an empty object that will fail when accessing its properties.
View Details
📝 Patch Details
diff --git a/packages/next/src/build/entries.ts b/packages/next/src/build/entries.ts
index e48f0573b4..320561a8d7 100644
--- a/packages/next/src/build/entries.ts
+++ b/packages/next/src/build/entries.ts
@@ -680,6 +680,7 @@ export function getEdgeServerEntry(opts: {
isServerComponent: opts.isServerComponent,
page: opts.page,
cacheMaxMemorySize: JSON.stringify(opts.config.cacheMaxMemorySize),
+ nextConfig: Buffer.from(JSON.stringify(opts.config)).toString('base64'),
pagesType: opts.pagesType,
appDirLoader: Buffer.from(opts.appDirLoader || '').toString('base64'),
sriEnabled: !opts.isDev && !!opts.config.experimental.sri?.algorithm,
diff --git a/packages/next/src/build/templates/edge-ssr-app.ts b/packages/next/src/build/templates/edge-ssr-app.ts
index ba39c22871..b8d5a8c74a 100644
--- a/packages/next/src/build/templates/edge-ssr-app.ts
+++ b/packages/next/src/build/templates/edge-ssr-app.ts
@@ -24,11 +24,14 @@ import { interopDefault } from '../../lib/interop-default'
import { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'
import { checkIsOnDemandRevalidate } from '../../server/api-utils'
import { CloseController } from '../../server/web/web-on-close'
+import type { NextConfigComplete } from '../../server/config-shared'
declare const incrementalCacheHandler: any
declare const cacheMaxMemorySize: number
+declare const nextConfig: NextConfigComplete
// OPTIONAL_IMPORT:incrementalCacheHandler
// INJECT:cacheMaxMemorySize
+// INJECT:nextConfig
// Initialize the cache handlers interface.
initializeCacheHandlers(cacheMaxMemorySize)
@@ -76,7 +79,6 @@ async function requestHandler(
const {
query,
params,
- nextConfig,
buildId,
buildManifest,
prerenderManifest,
diff --git a/packages/next/src/build/templates/edge-ssr.ts b/packages/next/src/build/templates/edge-ssr.ts
index ad3fdd40c9..ceebc51115 100644
--- a/packages/next/src/build/templates/edge-ssr.ts
+++ b/packages/next/src/build/templates/edge-ssr.ts
@@ -25,13 +25,16 @@ import type { RenderResultMetadata } from '../../server/render-result'
import { getTracer, SpanKind, type Span } from '../../server/lib/trace/tracer'
import { BaseServerSpan } from '../../server/lib/trace/constants'
import { HTML_CONTENT_TYPE_HEADER } from '../../lib/constants'
+import type { NextConfigComplete } from '../../server/config-shared'
// injected by the loader afterwards.
declare const cacheMaxMemorySize: number
+declare const nextConfig: NextConfigComplete
declare const pageRouteModuleOptions: any
declare const errorRouteModuleOptions: any
declare const user500RouteModuleOptions: any
// INJECT:cacheMaxMemorySize
+// INJECT:nextConfig
// INJECT:pageRouteModuleOptions
// INJECT:errorRouteModuleOptions
// INJECT:user500RouteModuleOptions
@@ -102,7 +105,6 @@ async function requestHandler(
const {
query,
params,
- nextConfig,
buildId,
isNextDataRequest,
buildManifest,
diff --git a/packages/next/src/build/webpack/loaders/next-edge-ssr-loader/index.ts b/packages/next/src/build/webpack/loaders/next-edge-ssr-loader/index.ts
index 85db21c2d5..637e2fa106 100644
--- a/packages/next/src/build/webpack/loaders/next-edge-ssr-loader/index.ts
+++ b/packages/next/src/build/webpack/loaders/next-edge-ssr-loader/index.ts
@@ -20,6 +20,7 @@ export type EdgeSSRLoaderQuery = {
isServerComponent: boolean
page: string
cacheMaxMemorySize: string
+ nextConfig: string
appDirLoader?: string
pagesType: PAGE_TYPES
sriEnabled: boolean
@@ -74,6 +75,7 @@ const edgeSSRLoader: webpack.LoaderDefinitionFunction<EdgeSSRLoaderQuery> =
absoluteErrorPath,
isServerComponent,
cacheMaxMemorySize: cacheMaxMemorySizeStringified,
+ nextConfig: nextConfigBase64,
appDirLoader: appDirLoaderBase64,
pagesType,
cacheHandler,
@@ -94,6 +96,10 @@ const edgeSSRLoader: webpack.LoaderDefinitionFunction<EdgeSSRLoaderQuery> =
Buffer.from(middlewareConfigBase64, 'base64').toString()
)
+ const nextConfig = JSON.parse(
+ Buffer.from(nextConfigBase64 || '', 'base64').toString()
+ )
+
const appDirLoader = Buffer.from(
appDirLoaderBase64 || '',
'base64'
@@ -158,6 +164,7 @@ const edgeSSRLoader: webpack.LoaderDefinitionFunction<EdgeSSRLoaderQuery> =
},
{
cacheMaxMemorySize: cacheMaxMemorySizeStringified,
+ nextConfig: JSON.stringify(nextConfig),
},
{
incrementalCacheHandler: cacheHandler ?? null,
@@ -175,6 +182,7 @@ const edgeSSRLoader: webpack.LoaderDefinitionFunction<EdgeSSRLoaderQuery> =
},
{
cacheMaxMemorySize: cacheMaxMemorySizeStringified,
+ nextConfig: JSON.stringify(nextConfig),
pageRouteModuleOptions: JSON.stringify(getRouteModuleOptions(page)),
errorRouteModuleOptions: JSON.stringify(
getRouteModuleOptions('/_error')
Analysis
Missing nextConfig injection in edge SSR templates causes property access failures
What fails: The edge SSR templates (edge-ssr-app.ts and edge-ssr.ts) access properties on nextConfig that are undefined after incomplete refactoring, causing incorrect rendering context values and potential runtime errors for features like asset prefix, image optimization, cache configuration, and experimental features.
How to reproduce: Build and deploy a Next.js application using the edge runtime with app router features that depend on nextConfig properties:
# Build with edge runtime enabled
npm run build
# Any request to an app route at edge runtime will receive incorrect config values:
# - nextConfig.assetPrefix → undefined
# - nextConfig.experimental.taint → undefined
# - nextConfig.cacheLife → undefined
# - nextConfig.images → undefined
# etc.Result: WIP commit e20fb2a ("perf: Don't inject the entire nextConfig in edge templates") removed the nextConfig injection from edge templates but failed to complete the migration. The templates still destructured nextConfig from prepareResult, which in edge runtime comes from globalThis.nextConfig || {} (set in route-module.ts line 227). Since globalThis.nextConfig is never initialized in edge runtime, it defaults to an empty object {}, causing all nextConfig property accesses to return undefined.
The affected code paths in edge-ssr-app.ts (lines 141-163) and edge-ssr.ts (lines 142-157) set renderContext properties using these undefined values:
assetPrefix: nextConfig.assetPrefix→ undefinednextConfigOutput: nextConfig.output→ undefinedexperimental.taint: nextConfig.experimental.taint→ undefined- And 15+ other config properties
Expected: All nextConfig properties should have their actual values from next.config.js, not undefined. The edge template bundle should include the full nextConfig via proper injection (as in commit predecessor).
Fix: Restored the nextConfig injection pattern that was removed in the incomplete WIP commit:
- Re-added
nextConfigparameter to EdgeSSRLoaderQuery type - Updated entries.ts to pass base64-encoded nextConfig to the loader
- Updated next-edge-ssr-loader to decode and inject nextConfig
- Updated edge-ssr-app.ts and edge-ssr.ts templates to declare and use injected nextConfig instead of destructuring from prepareResult
A separate manifest (`required-server-files.js`, like `_buildManifest.js`) so that we the bundler doesn't have to inline the whole config. The Node.js runtime routes already get their nextConfig at runtime by reading `required-server-files.js`. Closes #86630 Context for `initializeCacheHandlers`: #76130

It looks like we only do this for the edge runtime. This is bad because:
NextConfig, which means rustc needs to generate some pretty large functions. And Turbopack'sNextConfigis pretty incomplete, so relying on that is risky.Let's see what CI thinks of this change...