-
Notifications
You must be signed in to change notification settings - Fork 30k
[turbopack] Compute transitive side effects and use them to trim imports #86675
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
base: simple_side_effect_free_analysis
Are you sure you want to change the base?
[turbopack] Compute transitive side effects and use them to trim imports #86675
Conversation
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
Failing test suitesCommit: 92cb141 | About building and testing Next.js
Expand output● CSS Modules: Import Global CSS › production mode › should've emitted a single CSS file
Expand output● CSS Modules: Import Global CSS › production mode › should've emitted a single CSS file
Expand output● next-config-ts-export-as-default-cjs › should support export as default (CJS)
Expand output● next-config-ts-import-from-node-modules-cjs › should import from node_modules (CJS)
Expand output● next-config-ts-async-function-cjs › should support config as async function (CJS)
Expand output● app dir - with output export - dynamic missing gsp › should error when dynamic route is missing generateStaticParams › should work
Expand output● Babel › should allow setting babelrc env ● Babel › should allow setting targets.browsers ● Babel › should allow setting targets to a string ● Babel › should allow babelrc JSON5 syntax
Expand output● app-dir - custom-cache-handler - cjs › cjs module exports › should have logs from cache-handler ● app-dir - custom-cache-handler - cjs-default-export › cjs default export › should have logs from cache-handler ● app-dir - custom-cache-handler - esm › esm default export › should have logs from cache-handler
Expand output● app-dir - custom-cache-handler - cjs › cjs module exports › should have logs from cache-handler ● app-dir - custom-cache-handler - cjs-default-export › cjs default export › should have logs from cache-handler ● app-dir - custom-cache-handler - esm › esm default export › should have logs from cache-handler
Expand output● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /docs/error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /docs/error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /docs/error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /docs/error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › should not throw any errors when re-fetching the route info
Expand output● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of true and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /docs/error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › for /docs/error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of false and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /docs/error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › for /docs/error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of true and i18n of true and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware false › should not throw any errors when re-fetching the route info ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /not/a/real/page?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /not/a/real/page › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /error?with=query › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › for /error › should have the correct router parameters after it is ready ● 404-page-router › 404-page-router with basePath of false and i18n of false and middleware true › should not throw any errors when re-fetching the route info
Expand output● cssmodules-pure-no-check usage › should have compiled successfully ● cssmodules-pure-no-check usage › should apply styles correctly ● cssmodules-pure-no-check usage › should've emitted a CSS file
Expand output● app-dir action size limit invalid config › should respect the size set in serverActions.bodySizeLimit for plaintext fetch actions › should not error for requests that stay below the size limit ● app-dir action size limit invalid config › should respect the size set in serverActions.bodySizeLimit for plaintext fetch actions › should error for requests that exceed the size limit ● app-dir action size limit invalid config › should respect the size set in serverActions.bodySizeLimit for multipart fetch actions › should not error for requests that stay below the size limit ● app-dir action size limit invalid config › should respect the size set in serverActions.bodySizeLimit for multipart fetch actions › should not error for requests that are at the size limit ● app-dir action size limit invalid config › should respect the size set in serverActions.bodySizeLimit for multipart fetch actions › should error for requests that exceed the size limit
Expand output● should handle unresolved files gracefully › production mode › should build correctly ● Data URLs › production mode › should compile successfully ● Ordering with Global CSS and Modules (prod) › production mode › useLightnincsss(true) › should have compiled successfully ● Ordering with Global CSS and Modules (prod) › production mode › useLightnincsss(true) › should have the correct color (css ordering) ● Ordering with Global CSS and Modules (prod) › production mode › useLightnincsss(false) › should have compiled successfully ● Ordering with Global CSS and Modules (prod) › production mode › useLightnincsss(false) › should have the correct color (css ordering)
Expand output● Custom routes › production mode › should honor caseSensitiveRoutes config for /to-ANOTHER ● Custom routes › production mode › should honor caseSensitiveRoutes config for /HELLO-world ● Custom routes › production mode › should honor caseSensitiveRoutes config for /docs/GITHUB ● Custom routes › production mode › should honor caseSensitiveRoutes config for /add-HEADER ● Custom routes › production mode › should successfully rewrite a WebSocket request ● Custom routes › production mode › should successfully rewrite a WebSocket request to a page ● Custom routes › production mode › should not rewrite for _next/data route when a match is found ● Custom routes › production mode › should handle has query encoding correctly ● Custom routes › production mode › should handle external beforeFiles rewrite correctly ● Custom routes › production mode › should handle beforeFiles rewrite to dynamic route correctly ● Custom routes › production mode › should handle beforeFiles rewrite to partly dynamic route correctly ● Custom routes › production mode › should support long URLs for rewrites ● Custom routes › production mode › should resolveHref correctly navigating through history ● Custom routes › production mode › should continue in beforeFiles rewrites ● Custom routes › production mode › should not hang when proxy rewrite fails ● Custom routes › production mode › should parse params correctly for rewrite to auto-export dynamic page ● Custom routes › production mode › should provide params correctly for rewrite to auto-export non-dynamic page ● Custom routes › production mode › should handle one-to-one rewrite successfully ● Custom routes › production mode › should handle chained rewrites successfully ● Custom routes › production mode › should handle param like headers properly ● Custom routes › production mode › should not match dynamic route immediately after applying header ● Custom routes › production mode › should handle chained redirects successfully ● Custom routes › production mode › should not match redirect for /_next ● Custom routes › production mode › should redirect successfully with permanent: false ● Custom routes › production mode › should redirect with params successfully ● Custom routes › production mode › should redirect with hash successfully ● Custom routes › production mode › should redirect successfully with provided statusCode ● Custom routes › production mode › should redirect successfully with catchall ● Custom routes › production mode › should server static files through a rewrite ● Custom routes › production mode › should rewrite with params successfully ● Custom routes › production mode › should not append params when one is used in destination path ● Custom routes › production mode › should double redirect successfully ● Custom routes › production mode › should allow params in query for rewrite ● Custom routes › production mode › should have correct params for catchall rewrite ● Custom routes › production mode › should have correct encoding for params with catchall rewrite ● Custom routes › production mode › should have correct query for catchall rewrite ● Custom routes › production mode › should have correct header for catchall rewrite ● Custom routes › production mode › should allow params in query for redirect ● Custom routes › production mode › should have correctly encoded params in query for redirect ● Custom routes › production mode › should overwrite param values correctly ● Custom routes › production mode › should handle query for rewrite correctly ● Custom routes › production mode › should not allow rewrite to override page file ● Custom routes › production mode › show allow redirect to override the page ● Custom routes › production mode › should work successfully on the client ● Custom routes › production mode › should work with rewrite when manually specifying href/as ● Custom routes › production mode › should work with rewrite when only specifying href ● Custom routes › production mode › should work with rewrite when only specifying href and ends in dynamic route ● Custom routes › production mode › should match a page after a rewrite ● Custom routes › production mode › should match dynamic route after rewrite ● Custom routes › production mode › should match public file after rewrite ● Custom routes › production mode › should match /_next file after rewrite ● Custom routes › production mode › should allow redirecting to external resource ● Custom routes › production mode › should apply headers for exact match ● Custom routes › production mode › should apply headers for multi match ● Custom routes › production mode › should apply params for header key/values ● Custom routes › production mode › should support URL for header key/values ● Custom routes › production mode › should apply params header key/values with URL ● Custom routes › production mode › should apply params header key/values with URL that has port ● Custom routes › production mode › should support named pattern for header key/values ● Custom routes › production mode › should support proxying to external resource ● Custom routes › production mode › should support unnamed parameters correctly ● Custom routes › production mode › should support named like unnamed parameters correctly ● Custom routes › production mode › should add refresh header for 308 redirect ● Custom routes › production mode › should have correctly encoded query in location and refresh headers ● Custom routes › production mode › should handle basic api rewrite successfully ● Custom routes › production mode › should handle api rewrite with un-named param successfully ● Custom routes › production mode › should handle api rewrite with param successfully ● Custom routes › production mode › should handle encoded value in the pathname correctly ● Custom routes › production mode › should handle unnamed parameters with multi-match successfully ● Custom routes › production mode › should handle named regex parameters with multi-match successfully ● Custom routes › production mode › should redirect with URL in query correctly ● Custom routes › production mode › should redirect with URL in query correctly non-encoded ● Custom routes › production mode › should match missing header headers correctly ● Custom routes › production mode › should match missing query headers correctly ● Custom routes › production mode › should match missing cookie headers correctly ● Custom routes › production mode › should match missing header redirect correctly ● Custom routes › production mode › should match missing query redirect correctly ● Custom routes › production mode › should match missing cookie redirect correctly ● Custom routes › production mode › should match missing header rewrite correctly ● Custom routes › production mode › should match missing query rewrite correctly ● Custom routes › production mode › should match missing cookie rewrite correctly ● Custom routes › production mode › should match has header rewrite correctly ● Custom routes › production mode › should match has query rewrite correctly ● Custom routes › production mode › should match has cookie rewrite correctly ● Custom routes › production mode › should match has host rewrite correctly ● Custom routes › production mode › should pass has segment for rewrite correctly ● Custom routes › production mode › should not pass non captured has value for rewrite correctly ● Custom routes › production mode › should pass captured has value for rewrite correctly ● Custom routes › production mode › should match has rewrite correctly before files ● Custom routes › production mode › should match has header redirect correctly ● Custom routes › production mode › should match has query redirect correctly ● Custom routes › production mode › should match has cookie redirect correctly ● Custom routes › production mode › should match has host redirect correctly ● Custom routes › production mode › should match has host redirect and insert in destination correctly ● Custom routes › production mode › should match has query redirect with duplicate query key ● Custom routes › production mode › should match has header for header correctly ● Custom routes › production mode › should match has query for header correctly ● Custom routes › production mode › should match has cookie for header correctly ● Custom routes › production mode › should match has host for header correctly ● Custom routes › production mode › should output routes-manifest successfully ● Custom routes › production mode › should have redirects/rewrites in build output with debug flag ● Custom routes › production mode › should not show warning for custom routes when not next export ● Custom routes › should load custom routes when only one type is used › production mode › should work with just headers ● Custom routes › should load custom routes when only one type is used › production mode › should work with just rewrites ● Custom routes › should load custom routes when only one type is used › production mode › should work with just redirects
Expand output● CLI Usage › production mode › start › should exit when SIGINT is signalled ● CLI Usage › production mode › start › should exit when SIGTERM is signalled ● CLI Usage › production mode › start › should format IPv6 addresses correctly
Expand output● CLI Usage › production mode › start › should exit when SIGINT is signalled ● CLI Usage › production mode › start › should exit when SIGTERM is signalled ● CLI Usage › production mode › start › should format IPv6 addresses correctly
Expand output● Edge runtime code with imports › Edge API dynamically importing node.js module in a lib › production mode › throws unsupported module error in production at runtime and prints error on logs ● Edge runtime code with imports › Middleware dynamically importing node.js module in a lib › production mode › throws unsupported module error in production at runtime and prints error on logs ● Edge runtime code with imports › Edge API importing vanilla 3rd party module › production mode › does not throw in production at runtime ● Edge runtime code with imports › Middleware importing vanilla 3rd party module › production mode › does not throw in production at runtime ● Edge runtime code with imports › Edge API using Buffer polyfill › production mode › does not throw in production at runtime ● Edge runtime code with imports › Middleware using Buffer polyfill › production mode › does not throw in production at runtime
Expand output● Basic CSS Module Support › production mode › should have compiled successfully ● Basic CSS Module Support › production mode › should've emitted a single CSS file ● Basic CSS Module Support › production mode › should've injected the CSS on server render ● 3rd Party CSS Module Support › production mode › should have compiled successfully ● 3rd Party CSS Module Support › production mode › should've emitted a single CSS file ● 3rd Party CSS Module Support › production mode › should've injected the CSS on server render ● Has CSS Module in computed styles in Production › production mode › should have compiled successfully ● Has CSS Module in computed styles in Production › production mode › should have CSS for page ● Valid CSS Module Usage from within node_modules › production mode › should have compiled successfully ● Valid CSS Module Usage from within node_modules › production mode › should've prerendered with relevant data ● Valid CSS Module Usage from within node_modules › production mode › should've emitted a single CSS file ● CSS Module Composes Usage (Basic) › production mode › should have compiled successfully ● CSS Module Composes Usage (Basic) › production mode › should've emitted a single CSS file ● Dynamic Route CSS Module Usage › production mode › should have compiled successfully ● Dynamic Route CSS Module Usage › production mode › should apply styles correctly ● Dynamic Route CSS Module Usage › production mode › should've emitted a single CSS file ● Catch-all Route CSS Module Usage › production mode › should have compiled successfully ● Catch-all Route CSS Module Usage › production mode › should apply styles correctly ● Catch-all Route CSS Module Usage › production mode › should've emitted a single CSS file ● cssmodules-pure-no-check usage › should have compiled successfully ● cssmodules-pure-no-check usage › should apply styles correctly ● cssmodules-pure-no-check usage › should've emitted a CSS file
Expand output● Basic Global Support › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Basic Global Support › production mode › useLightnincsss(false) › should've emitted a single CSS file ● Basic Global Support with special characters in path › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Basic Global Support with special characters in path › production mode › useLightnincsss(false) › should've emitted a single CSS file ● Basic Global Support with src/ dir › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Basic Global Support with src/ dir › production mode › useLightnincsss(false) › should've emitted a single CSS file ● Multi Global Support › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Multi Global Support › production mode › useLightnincsss(false) › should've emitted a single CSS file ● Nested @import() Global Support › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Nested @import() Global Support › production mode › useLightnincsss(false) › should've emitted a single CSS file ● Multi Global Support (reversed) › production mode › useLightnincsss(true) › should've emitted a single CSS file ● Multi Global Support (reversed) › production mode › useLightnincsss(false) › should've emitted a single CSS file ● CSS URL via ● CSS URL via ● CSS URL via ● CSS URL via
Expand output● sharp api › should handle custom sharp usage
Expand output● stale-dev-types › should not fail build when .next/dev has stale types from deleted routes
Expand output● app dir - with output export - trailing slash › should work in prod with trailingSlash 'false' › should work ● app dir - with output export - trailing slash › should work in prod with trailingSlash 'true' › should work |
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| buildDuration | 16.9s | 15s | N/A |
| buildDurationCached | 13.8s | 10.9s | N/A |
| nodeModulesSize | 456 MB | 456 MB | N/A |
| nextStartRea..uration (ms) | 714ms | 724ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| 4951-HASH.js gzip | 5.37 kB | 5.38 kB | N/A |
| 68680909-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| 8034-HASH.js gzip | 52.8 kB | 53 kB | |
| 9564.HASH.js gzip | 170 B | 168 B | N/A |
| 9565-HASH.js gzip | 4.46 kB | 4.48 kB | N/A |
| framework-HASH.js gzip | 59.7 kB | 59.7 kB | N/A |
| main-app-HASH.js gzip | 255 B | 252 B | N/A |
| main-HASH.js gzip | 38.6 kB | 38.5 kB | N/A |
| webpack-HASH.js gzip | 1.69 kB | 1.69 kB | N/A |
| Overall change | 52.8 kB | 53 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | 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 | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 192 B | 194 B | N/A |
| _error-HASH.js gzip | 183 B | 182 B | N/A |
| css-HASH.js gzip | 334 B | 333 B | N/A |
| dynamic-HASH.js gzip | 1.79 kB | 1.81 kB | N/A |
| edge-ssr-HASH.js gzip | 254 B | 255 B | N/A |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 383 B | 378 B | N/A |
| image-HASH.js gzip | 580 B | 581 B | N/A |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.51 kB | 2.5 kB | N/A |
| routerDirect..HASH.js gzip | 317 B | 319 B | N/A |
| script-HASH.js gzip | 386 B | 386 B | ✓ |
| withRouter-HASH.js gzip | 314 B | 312 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 492 B | 492 B | ✓ |
Client Build Manifests
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 735 B | 738 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| index.html gzip | 524 B | 522 B | N/A |
| link.html gzip | 540 B | 538 B | N/A |
| withRouter.html gzip | 521 B | 518 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Edge SSR bundle Size
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 236 kB | 235 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
Middleware size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 651 B | 654 B | N/A |
| middleware-r..fest.js gzip | 156 B | 156 B | ✓ |
| middleware.js gzip | 32.8 kB | 33 kB | |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 33.8 kB | 34 kB |
Next Runtimes
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 301 kB | N/A |
| app-page-exp..prod.js gzip | 155 kB | 155 kB | N/A |
| app-page-tur...dev.js gzip | 301 kB | 300 kB | N/A |
| app-page-tur..prod.js gzip | 155 kB | 155 kB | N/A |
| app-page-tur...dev.js gzip | 297 kB | 297 kB | N/A |
| app-page-tur..prod.js gzip | 153 kB | 153 kB | N/A |
| app-page.run...dev.js gzip | 297 kB | 297 kB | N/A |
| app-page.run..prod.js gzip | 153 kB | 153 kB | N/A |
| app-route-ex...dev.js gzip | 68.6 kB | 68.5 kB | N/A |
| app-route-ex..prod.js gzip | 47.5 kB | 47.4 kB | N/A |
| app-route-tu...dev.js gzip | 68.7 kB | 68.6 kB | N/A |
| app-route-tu..prod.js gzip | 47.5 kB | 47.4 kB | N/A |
| app-route-tu...dev.js gzip | 68.3 kB | 68.2 kB | N/A |
| app-route-tu..prod.js gzip | 47.2 kB | 47.2 kB | N/A |
| app-route.ru...dev.js gzip | 68.2 kB | 68.1 kB | N/A |
| app-route.ru..prod.js gzip | 47.2 kB | 47.1 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 | 41 kB | 40.9 kB | N/A |
| pages-api-tu..prod.js gzip | 31.1 kB | 31 kB | N/A |
| pages-api.ru...dev.js gzip | 41 kB | 40.9 kB | N/A |
| pages-api.ru..prod.js gzip | 31.1 kB | 31 kB | N/A |
| pages-turbo....dev.js gzip | 50.5 kB | 50.4 kB | N/A |
| pages-turbo...prod.js gzip | 38 kB | 37.9 kB | N/A |
| pages.runtim...dev.js gzip | 50.5 kB | 50.4 kB | N/A |
| pages.runtim..prod.js gzip | 38 kB | 37.9 kB | N/A |
| server.runti..prod.js gzip | 59.8 kB | 59.8 kB | N/A |
| Overall change | 1.29 kB | 1.29 kB | ✓ |
build cache
| vercel/next.js canary | vercel/next.js use_side_effect_analysis | Change | |
|---|---|---|---|
| 0.pack gzip | 3.11 MB | 3.1 MB | N/A |
| index.pack gzip | 94.5 kB | 93.8 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
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-b087a17851e05d6f.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-3361ed053e34d664.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-0d6cadd1684bf608.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-c7ffde23a6d1e061.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-d018beb4ee617700.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-0b6177a056485c89.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-22fa1f98925287e3.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-8e7954693aad6744.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-79392016bf448b0e.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-7515805a0793fb50.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-7c5bbe7e16e0461c.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-9fbae4ac20575871.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-18530459356f6f47.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-221843a8082c5fe0.js"],
"/image": [
- "static\u002Fchunks\u002F9565-2e0c4004742fb14a.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-811425894781cf7d.js",
+ "static\u002Fchunks\u002F5467-5440e689c12d4e40.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-fe20cdcfe67a7d4d.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-14068c948da9dc39.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-814c1a2b0c6775c5.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-6d3e9dcd1348423d.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-a0028e2a28aa8c85.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-eda35f71f7a910ba.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-5b734e02315dd67a.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-4a6d5ec263e28451.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-db2aefa859481ae2.js",
],
sortedPages: [
"\u002F",Diff for css-HASH.js
@@ -1,14 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[9813],
{
- /***/ 1361: /***/ (module) => {
- // extracted by mini-css-extract-plugin
- module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
- /***/
- },
-
- /***/ 1651: /***/ (
+ /***/ 942: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -16,7 +9,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/css",
function () {
- return __webpack_require__(3321);
+ return __webpack_require__(3023);
},
]);
if (false) {
@@ -25,7 +18,7 @@
/***/
},
- /***/ 3321: /***/ (
+ /***/ 3023: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -39,7 +32,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1361);
+ __webpack_require__(3264);
/* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
_css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -58,13 +51,20 @@
/***/
},
+
+ /***/ 3264: /***/ (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__(1651)
+ __webpack_exec__(942)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for dynamic-HASH.js
@@ -1,177 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 617: /***/ (
- __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__(6466)
- );
- const LoadableContext = _react.default.createContext(null);
- if (false) {
- } //# sourceMappingURL=loadable-context.shared-runtime.js.map
-
- /***/
- },
-
- /***/ 620: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- 0 && 0;
- function _export(target, all) {
- for (var name in all)
- Object.defineProperty(target, name, {
- enumerable: true,
- get: all[name],
- });
- }
- _export(exports, {
- /**
- * This function lets you dynamically import a component.
- * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.
- *
- * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)
- */ default: function () {
- return dynamic;
- },
- noSSR: function () {
- return noSSR;
- },
- });
- const _interop_require_default = __webpack_require__(1532);
- const _jsxruntime = __webpack_require__(7002);
- const _react = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(6466)
- );
- const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(3147)
- );
- const isServerSide = "object" === "undefined";
- // Normalize loader to return the module as form { default: Component } for `React.lazy`.
- // Also for backward compatible since next/dynamic allows to resolve a component directly with loader
- // Client component reference proxy need to be converted to a module.
- function convertModule(mod) {
- return {
- default: mod?.default || mod,
- };
- }
- function noSSR(LoadableInitializer, loadableOptions) {
- // Removing webpack and modules means react-loadable won't try preloading
- delete loadableOptions.webpack;
- delete loadableOptions.modules;
- // This check is necessary to prevent react-loadable from initializing on the server
- if (!isServerSide) {
- return LoadableInitializer(loadableOptions);
- }
- const Loading = loadableOptions.loading;
- // This will only be rendered on the server side
- return () =>
- /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {
- error: null,
- isLoading: true,
- pastDelay: false,
- timedOut: false,
- });
- }
- function dynamic(dynamicOptions, options) {
- let loadableFn = _loadablesharedruntime.default;
- let loadableOptions = {
- // A loading component is not required, so we default it
- loading: ({ error, isLoading, pastDelay }) => {
- if (!pastDelay) return null;
- if (false) {
- }
- return null;
- },
- };
- // Support for direct import(), eg: dynamic(import('../hello-world'))
- // Note that this is only kept for the edge case where someone is passing in a promise as first argument
- // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))
- // To make sure we don't execute the import without rendering first
- if (dynamicOptions instanceof Promise) {
- loadableOptions.loader = () => dynamicOptions;
- // Support for having import as a function, eg: dynamic(() => import('../hello-world'))
- } else if (typeof dynamicOptions === "function") {
- loadableOptions.loader = dynamicOptions;
- // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})
- } else if (typeof dynamicOptions === "object") {
- loadableOptions = {
- ...loadableOptions,
- ...dynamicOptions,
- };
- }
- // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})
- loadableOptions = {
- ...loadableOptions,
- ...options,
- };
- const loaderFn = loadableOptions.loader;
- const loader = () =>
- loaderFn != null
- ? loaderFn().then(convertModule)
- : Promise.resolve(convertModule(() => null));
- // coming from build/babel/plugins/react-loadable-plugin.js
- if (loadableOptions.loadableGenerated) {
- loadableOptions = {
- ...loadableOptions,
- ...loadableOptions.loadableGenerated,
- };
- delete loadableOptions.loadableGenerated;
- }
- // support for disabling server side rendering, eg: dynamic(() => import('../hello-world'), {ssr: false}).
- if (typeof loadableOptions.ssr === "boolean" && !loadableOptions.ssr) {
- delete loadableOptions.webpack;
- delete loadableOptions.modules;
- return noSSR(loadableFn, loadableOptions);
- }
- return loadableFn({
- ...loadableOptions,
- loader: loader,
- });
- }
- 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=dynamic.js.map
-
- /***/
- },
-
- /***/ 1173: /***/ (
+ /***/ 1151: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(620);
+ module.exports = __webpack_require__(7368);
/***/
},
- /***/ 2907: /***/ (
+ /***/ 4773: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -186,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1173);
+ __webpack_require__(1151);
/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_dynamic__WEBPACK_IMPORTED_MODULE_1__
@@ -195,12 +35,12 @@
const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
() =>
__webpack_require__
- .e(/* import() */ 9564)
- .then(__webpack_require__.bind(__webpack_require__, 9564))
+ .e(/* import() */ 6022)
+ .then(__webpack_require__.bind(__webpack_require__, 6022))
.then((mod) => mod.Hello),
{
loadableGenerated: {
- webpack: () => [/*require.resolve*/ 9564],
+ webpack: () => [/*require.resolve*/ 6022],
},
}
);
@@ -227,7 +67,7 @@
/***/
},
- /***/ 3147: /***/ (
+ /***/ 5631: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -269,7 +109,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(6466)
);
- const _loadablecontextsharedruntime = __webpack_require__(617);
+ const _loadablecontextsharedruntime = __webpack_require__(6861);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -502,7 +342,167 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
- /***/ 4236: /***/ (
+ /***/ 6861: /***/ (
+ __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__(6466)
+ );
+ const LoadableContext = _react.default.createContext(null);
+ if (false) {
+ } //# sourceMappingURL=loadable-context.shared-runtime.js.map
+
+ /***/
+ },
+
+ /***/ 7368: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ /**
+ * This function lets you dynamically import a component.
+ * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.
+ *
+ * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)
+ */ default: function () {
+ return dynamic;
+ },
+ noSSR: function () {
+ return noSSR;
+ },
+ });
+ const _interop_require_default = __webpack_require__(1532);
+ const _jsxruntime = __webpack_require__(7002);
+ const _react = /*#__PURE__*/ _interop_require_default._(
+ __webpack_require__(6466)
+ );
+ const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
+ __webpack_require__(5631)
+ );
+ const isServerSide = "object" === "undefined";
+ // Normalize loader to return the module as form { default: Component } for `React.lazy`.
+ // Also for backward compatible since next/dynamic allows to resolve a component directly with loader
+ // Client component reference proxy need to be converted to a module.
+ function convertModule(mod) {
+ return {
+ default: mod?.default || mod,
+ };
+ }
+ function noSSR(LoadableInitializer, loadableOptions) {
+ // Removing webpack and modules means react-loadable won't try preloading
+ delete loadableOptions.webpack;
+ delete loadableOptions.modules;
+ // This check is necessary to prevent react-loadable from initializing on the server
+ if (!isServerSide) {
+ return LoadableInitializer(loadableOptions);
+ }
+ const Loading = loadableOptions.loading;
+ // This will only be rendered on the server side
+ return () =>
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {
+ error: null,
+ isLoading: true,
+ pastDelay: false,
+ timedOut: false,
+ });
+ }
+ function dynamic(dynamicOptions, options) {
+ let loadableFn = _loadablesharedruntime.default;
+ let loadableOptions = {
+ // A loading component is not required, so we default it
+ loading: ({ error, isLoading, pastDelay }) => {
+ if (!pastDelay) return null;
+ if (false) {
+ }
+ return null;
+ },
+ };
+ // Support for direct import(), eg: dynamic(import('../hello-world'))
+ // Note that this is only kept for the edge case where someone is passing in a promise as first argument
+ // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))
+ // To make sure we don't execute the import without rendering first
+ if (dynamicOptions instanceof Promise) {
+ loadableOptions.loader = () => dynamicOptions;
+ // Support for having import as a function, eg: dynamic(() => import('../hello-world'))
+ } else if (typeof dynamicOptions === "function") {
+ loadableOptions.loader = dynamicOptions;
+ // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})
+ } else if (typeof dynamicOptions === "object") {
+ loadableOptions = {
+ ...loadableOptions,
+ ...dynamicOptions,
+ };
+ }
+ // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})
+ loadableOptions = {
+ ...loadableOptions,
+ ...options,
+ };
+ const loaderFn = loadableOptions.loader;
+ const loader = () =>
+ loaderFn != null
+ ? loaderFn().then(convertModule)
+ : Promise.resolve(convertModule(() => null));
+ // coming from build/babel/plugins/react-loadable-plugin.js
+ if (loadableOptions.loadableGenerated) {
+ loadableOptions = {
+ ...loadableOptions,
+ ...loadableOptions.loadableGenerated,
+ };
+ delete loadableOptions.loadableGenerated;
+ }
+ // support for disabling server side rendering, eg: dynamic(() => import('../hello-world'), {ssr: false}).
+ if (typeof loadableOptions.ssr === "boolean" && !loadableOptions.ssr) {
+ delete loadableOptions.webpack;
+ delete loadableOptions.modules;
+ return noSSR(loadableFn, loadableOptions);
+ }
+ return loadableFn({
+ ...loadableOptions,
+ loader: loader,
+ });
+ }
+ 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=dynamic.js.map
+
+ /***/
+ },
+
+ /***/ 8258: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -510,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__(2907);
+ return __webpack_require__(4773);
},
]);
if (false) {
@@ -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__(4236)
+ __webpack_exec__(8258)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,24 +1,13 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 2366: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(8140);
- },
- ]);
- if (false) {
- }
+ /***/ 48: /***/ (module, __unused_webpack_exports, __webpack_require__) => {
+ module.exports = __webpack_require__(8141);
/***/
},
- /***/ 8140: /***/ (
+ /***/ 2682: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -33,7 +22,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(9386);
+ __webpack_require__(48);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -67,12 +56,19 @@
/***/
},
- /***/ 9386: /***/ (
- module,
+ /***/ 2956: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1649);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(2682);
+ },
+ ]);
+ if (false) {
+ }
/***/
},
@@ -82,7 +78,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2366)
+ __webpack_exec__(2956)
);
/******/ 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],
{
- /***/ 497: /***/ (
+ /***/ 8114: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/image",
+ function () {
+ return __webpack_require__(9180);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 9180: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -18,8 +35,8 @@
// EXTERNAL MODULE: ./node_modules/.pnpm/[email protected]/node_modules/react/jsx-runtime.js
var jsx_runtime = __webpack_require__(7002);
- // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
- var next_image = __webpack_require__(9565);
+ // EXTERNAL MODULE: ./node_modules/.pnpm/next@[email protected][email protected][email protected]/node_modules/next/image.js
+ var next_image = __webpack_require__(5467);
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 @@
/***/
},
-
- /***/ 5748: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/image",
- function () {
- return __webpack_require__(497);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
- /******/ __webpack_require__.O(0, [9565, 636, 6593, 8792], () =>
- __webpack_exec__(5748)
+ /******/ __webpack_require__.O(0, [5467, 636, 6593, 8792], () =>
+ __webpack_exec__(8114)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 1182: /***/ (
+ /***/ 2156: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -9,7 +9,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/link",
function () {
- return __webpack_require__(4610);
+ return __webpack_require__(8272);
},
]);
if (false) {
@@ -18,7 +18,220 @@
/***/
},
- /***/ 1557: /***/ (module, exports, __webpack_require__) => {
+ /***/ 4581: /***/ (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__(6466);
+ const _requestidlecallback = __webpack_require__(7441);
+ 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
+
+ /***/
+ },
+
+ /***/ 6155: /***/ (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__(6466);
+ 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
+
+ /***/
+ },
+
+ /***/ 7046: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(8113);
+
+ /***/
+ },
+
+ /***/ 8113: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -45,17 +258,17 @@
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(6466)
);
- const _resolvehref = __webpack_require__(5475);
- const _islocalurl = __webpack_require__(6475);
- const _formaturl = __webpack_require__(9998);
- const _utils = __webpack_require__(3084);
- const _addlocale = __webpack_require__(3921);
- const _routercontextsharedruntime = __webpack_require__(7726);
- const _useintersection = __webpack_require__(4806);
- const _getdomainlocale = __webpack_require__(3219);
- const _addbasepath = __webpack_require__(5498);
- const _usemergedref = __webpack_require__(3255);
- const _erroronce = __webpack_require__(1685);
+ const _resolvehref = __webpack_require__(2399);
+ const _islocalurl = __webpack_require__(6687);
+ const _formaturl = __webpack_require__(4802);
+ const _utils = __webpack_require__(9208);
+ const _addlocale = __webpack_require__(9845);
+ const _routercontextsharedruntime = __webpack_require__(3466);
+ const _useintersection = __webpack_require__(4581);
+ const _getdomainlocale = __webpack_require__(8319);
+ const _addbasepath = __webpack_require__(4126);
+ const _usemergedref = __webpack_require__(6155);
+ const _erroronce = __webpack_require__(8305);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -434,140 +647,7 @@
/***/
},
- /***/ 1685: /***/ (__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
-
- /***/
- },
-
- /***/ 3219: /***/ (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__(1059);
- 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
-
- /***/
- },
-
- /***/ 3255: /***/ (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__(6466);
- 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
-
- /***/
- },
-
- /***/ 4610: /***/ (
+ /***/ 8272: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -582,7 +662,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(9056);
+ __webpack_require__(7046);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -613,115 +693,45 @@
/***/
},
- /***/ 4806: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8305: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(6466);
- const _requestidlecallback = __webpack_require__(805);
- 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;
- }
+ let errorOnce = (_) => {};
+ if (false) {
+ } //# sourceMappingURL=error-once.js.map
+
+ /***/
+ },
+
+ /***/ 8319: /***/ (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__(6063);
+ const basePath =
+ /* unused pure expression or super */ null && (false || "");
+ function getDomainLocale(path, locale, locales, domainLocales) {
+ if (false) {
+ } else {
+ return false;
}
- 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" ||
@@ -733,17 +743,7 @@
});
Object.assign(exports.default, exports);
module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 9056: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(1557);
+ } //# sourceMappingURL=get-domain-locale.js.map
/***/
},
@@ -753,7 +753,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1182)
+ __webpack_exec__(2156)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,13 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 15: /***/ (module, __unused_webpack_exports, __webpack_require__) => {
- module.exports = __webpack_require__(5258);
-
- /***/
- },
-
- /***/ 6853: /***/ (
+ /***/ 2895: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -22,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(15);
+ __webpack_require__(3489);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -55,7 +49,17 @@
/***/
},
- /***/ 9264: /***/ (
+ /***/ 3489: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(3102);
+
+ /***/
+ },
+
+ /***/ 9884: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -63,7 +67,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/script",
function () {
- return __webpack_require__(6853);
+ return __webpack_require__(2895);
},
]);
if (false) {
@@ -77,7 +81,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(9264)
+ __webpack_exec__(9884)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1593: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(372);
-
- /***/
- },
-
- /***/ 4550: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(8527);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8527: /***/ (
+ /***/ 69: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7002);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1593);
+ __webpack_require__(2027);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 2027: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(1536);
+
+ /***/
+ },
+
+ /***/ 2268: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(69);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4550)
+ __webpack_exec__(2268)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 4951-HASH.js
Diff too large to display
Diff for 8034-HASH.js
failed to diffDiff for 9565-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],
{
- /***/ 326: /***/ (
+ /***/ 905: /***/ () => {
+ /* (ignored) */
+ /***/
+ },
+
+ /***/ 6354: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 5065, 23)
+ __webpack_require__.t.bind(__webpack_require__, 2467, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 8974, 23)
+ __webpack_require__.t.bind(__webpack_require__, 8296, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6506, 23)
+ __webpack_require__.t.bind(__webpack_require__, 488, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 1, 23)
+ __webpack_require__.t.bind(__webpack_require__, 6887, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 8239, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1753, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 1187, 23)
+ __webpack_require__.t.bind(__webpack_require__, 3265, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 7790, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1848, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6543, 23)
+ __webpack_require__.t.bind(__webpack_require__, 565, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 5802, 23)
+ __webpack_require__.t.bind(__webpack_require__, 6732, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 2809, 23)
+ __webpack_require__.t.bind(__webpack_require__, 6439, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 5738, 23)
+ __webpack_require__.t.bind(__webpack_require__, 228, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.bind(__webpack_require__, 5455)
+ __webpack_require__.bind(__webpack_require__, 3013)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 4731, 23)
+ __webpack_require__.t.bind(__webpack_require__, 8253, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 3753, 23)
+ __webpack_require__.t.bind(__webpack_require__, 3772, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 2816, 23)
+ __webpack_require__.t.bind(__webpack_require__, 5846, 23)
);
/***/
},
-
- /***/ 3643: /***/ () => {
- /* (ignored) */
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
@@ -66,8 +66,8 @@
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(
0,
- [119, 8034],
- () => (__webpack_exec__(5111), __webpack_exec__(326))
+ [4246, 2914],
+ () => (__webpack_exec__(1429), __webpack_exec__(6354))
);
/******/ 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
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
CodSpeed Performance ReportMerging #86675 will degrade performances by 87.38%Comparing Summary
Benchmarks breakdown
Footnotes
|
1fc4fb8 to
f544707
Compare
f544707 to
102d370
Compare
f281a83 to
f6e85cd
Compare
f6e85cd to
ec765fe
Compare
102d370 to
2f350c2
Compare
2f350c2 to
739fa8b
Compare
turbopack/crates/turbopack-core/src/module_graph/side_effect_module_info.rs
Outdated
Show resolved
Hide resolved
| // dependencies are side effect free. | ||
|
|
||
| let mut locally_side_effect_free_modules_that_have_side_effects = FxHashSet::default(); | ||
| graph.traverse_edges_from_entries_dfs_reversed( |
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.
I feel like this method should be named traverse_edges_from_leafs_dfs
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.
hmm yeah the name isn't really ideal.
imho 'edges' shouldn't really be in the name, the fact that we have 'edge' information is obvious from the callback signatures, and if you don't care about 'edges' (as in this case) you just ignore them, there isn't a different function to call.
'entries' is also confusing imho since we don't have to start at 'entry points'. If we mean 'we can supply starting nodes' then that is fine but 'leaves' would have the same issue
so maybe this should be traverse_dfs and traverse_reverse_dfs?
.../src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_module.rs
Outdated
Show resolved
Hide resolved
turbopack/crates/turbopack-ecmascript/src/references/external_module.rs
Outdated
Show resolved
Hide resolved
...cution/turbopack/resolving/tsconfig-nodenext/issues/Error evaluating Node.js code-a1070b.txt
Outdated
Show resolved
Hide resolved
turbopack/crates/turbopack-ecmascript/src/tree_shake/side_effect_module.rs
Outdated
Show resolved
Hide resolved
| .compile_time_info() | ||
| .to_resolved() | ||
| .await?, | ||
| side_effect_free_packages, |
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.
Other module types could also be flagged as side effect free:
- NodeAddon
- CssModule
- WebAssembly
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.
wasm modules cannot be. wasm module instantiation can have arbitrary side effects
css modules should always be considered to be side effectful since even in a module you can install :root rules. We could definitely create some static analysis for this though. (i left a comment about this)
I would assume that NodeAddon modules as wasm have similar problems since the native code can trigger arbitrary side effects.
1be5c4f to
e92c3d7
Compare
40ade7f to
432b0b8
Compare
432b0b8 to
fee30ab
Compare
e92c3d7 to
e7407a9
Compare
fee30ab to
89d4529
Compare
6ff1476 to
34403ac
Compare
eb7de06 to
b7d074b
Compare
…iptModule fewer globs constructed, fewer turbotasks executed
b7d074b to
92cb141
Compare
| fn is_marked_as_side_effect_free(self: Vc<Self>, _: Vc<Glob>) -> Vc<bool> { | ||
| Vc::cell(true) | ||
| fn side_effects(self: Vc<Self>) -> Vc<ModuleSideEffects> { | ||
| ModuleSideEffects::SideEffectful.cell() |
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.
| ModuleSideEffects::SideEffectful.cell() | |
| ModuleSideEffects::ModuleEvaluationIsSideEffectFree.cell() |
The SideEffectsModule.side_effects() method returns SideEffectful but should return ModuleEvaluationIsSideEffectFree, since the module's evaluation code is empty (just a comment) and has no side effects. The module only has side effects through its dependencies, which are tracked separately.
View Details
Analysis
SideEffectsModule.side_effects() returns incorrect variant causing tree-shaking to fail
What fails: SideEffectsModule::side_effects() in turbopack/crates/turbopack-ecmascript/src/tree_shake/side_effect_module.rs returns ModuleSideEffects::SideEffectful instead of ModuleSideEffects::ModuleEvaluationIsSideEffectFree, incorrectly marking the wrapper module itself as having side effects when its evaluation code has none.
How to reproduce: The module's content is literally just a comment ("// This is a proxy module for reexportings a module with additional side effects."), containing zero side effects in its own evaluation. Side effects only exist through its dependencies tracked in the side_effects field via the references() method.
Result vs Expected: The ModuleSideEffects enum semantics define:
ModuleEvaluationIsSideEffectFree: "module evaluation code has no side effects, but imports might have side effects"SideEffectful: "the module has side effects in its evaluation"
Since the SideEffectsModule's evaluation has no side effects and all side effects come through imports/references, returning SideEffectful is semantically incorrect. The module graph side effect analysis relies on ModuleEvaluationIsSideEffectFree to properly traverse dependencies and propagate side effects. The incorrect return value breaks tree-shaking optimization by treating the wrapper as inherently side-effectful.
Fix: Changed ModuleSideEffects::SideEffectful to ModuleSideEffects::ModuleEvaluationIsSideEffectFree in the side_effects() method.

Use our new side effects analysis to statically analyze modules and integrate this into our 'import trimming' logic.
If a module and its transitive dependencies have no side effects based on either declarations or static analysis then we can drop all 'ModuleEvaluation' imports. This can enhance tree shaking and bundle optimization.
How
refactor the
Module::is_module_side_effect_freefunction to beside_effectsand return an enum to model 'SideEffectful' 'SideEffectFree' and `ModuleEvaluationIsSideEffectFree'. The later can be determined via static analysis.During import trimming, traverse the module graph to see what modules are full side effect free after considering imports. Then use this to trim edges during import trimming.