-
Notifications
You must be signed in to change notification settings - Fork 30.1k
fix: empty generateStaticParams should still create an ISR route #73358
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
Merged
ztanner
merged 3 commits into
canary
from
11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route
Dec 10, 2024
Merged
fix: empty generateStaticParams should still create an ISR route #73358
ztanner
merged 3 commits into
canary
from
11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route
Dec 10, 2024
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Member
Tests Passed |
Member
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| buildDuration | 27.9s | 18.5s | N/A |
| buildDurationCached | 17.6s | 15.5s | N/A |
| nodeModulesSize | 409 MB | 409 MB | |
| nextStartRea..uration (ms) | 466ms | 487ms | N/A |
Client Bundles (main, webpack)
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| 1187-HASH.js gzip | 50.2 kB | 50.2 kB | N/A |
| 8276.HASH.js gzip | 169 B | 168 B | N/A |
| 8377-HASH.js gzip | 5.3 kB | 5.3 kB | N/A |
| bccd1874-HASH.js gzip | 53 kB | 53 kB | N/A |
| framework-HASH.js gzip | 57.5 kB | 57.5 kB | N/A |
| main-app-HASH.js gzip | 232 B | 235 B | N/A |
| main-HASH.js gzip | 33.8 kB | 33.7 kB | N/A |
| webpack-HASH.js gzip | 1.71 kB | 1.71 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | 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 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 193 B | 193 B | ✓ |
| _error-HASH.js gzip | 193 B | 193 B | ✓ |
| amp-HASH.js gzip | 512 B | 510 B | N/A |
| css-HASH.js gzip | 343 B | 342 B | N/A |
| dynamic-HASH.js gzip | 1.84 kB | 1.84 kB | ✓ |
| edge-ssr-HASH.js gzip | 265 B | 265 B | ✓ |
| head-HASH.js gzip | 363 B | 362 B | N/A |
| hooks-HASH.js gzip | 393 B | 392 B | N/A |
| image-HASH.js gzip | 4.44 kB | 4.43 kB | N/A |
| index-HASH.js gzip | 268 B | 268 B | ✓ |
| link-HASH.js gzip | 2.35 kB | 2.34 kB | N/A |
| routerDirect..HASH.js gzip | 328 B | 328 B | ✓ |
| script-HASH.js gzip | 397 B | 397 B | ✓ |
| withRouter-HASH.js gzip | 323 B | 326 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 3.59 kB | 3.59 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 747 B | 745 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| index.html gzip | 524 B | 523 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 1.06 kB | 1.06 kB | ✓ |
Edge SSR bundle Size
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 128 kB | 128 kB | N/A |
| page.js gzip | 203 kB | 203 kB | N/A |
| Overall change | 0 B | 0 B | ✓ |
Middleware size
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 671 B | 668 B | N/A |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 31 kB | 31 kB | N/A |
| edge-runtime..pack.js gzip | 844 B | 844 B | ✓ |
| Overall change | 844 B | 844 B | ✓ |
Next Runtimes
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| 523-experime...dev.js gzip | 322 B | 322 B | ✓ |
| 523.runtime.dev.js gzip | 314 B | 314 B | ✓ |
| app-page-exp...dev.js gzip | 322 kB | 322 kB | ✓ |
| app-page-exp..prod.js gzip | 127 kB | 127 kB | ✓ |
| app-page-tur..prod.js gzip | 140 kB | 140 kB | ✓ |
| app-page-tur..prod.js gzip | 135 kB | 135 kB | ✓ |
| app-page.run...dev.js gzip | 312 kB | 312 kB | ✓ |
| app-page.run..prod.js gzip | 122 kB | 122 kB | ✓ |
| app-route-ex...dev.js gzip | 37.1 kB | 37.1 kB | ✓ |
| app-route-ex..prod.js gzip | 25.1 kB | 25.1 kB | ✓ |
| app-route-tu..prod.js gzip | 25.1 kB | 25.1 kB | ✓ |
| app-route-tu..prod.js gzip | 24.9 kB | 24.9 kB | ✓ |
| app-route.ru...dev.js gzip | 38.7 kB | 38.7 kB | ✓ |
| app-route.ru..prod.js gzip | 24.9 kB | 24.9 kB | ✓ |
| pages-api-tu..prod.js gzip | 9.56 kB | 9.56 kB | ✓ |
| pages-api.ru...dev.js gzip | 11.4 kB | 11.4 kB | ✓ |
| pages-api.ru..prod.js gzip | 9.56 kB | 9.56 kB | ✓ |
| pages-turbo...prod.js gzip | 21.3 kB | 21.3 kB | ✓ |
| pages.runtim...dev.js gzip | 27 kB | 27 kB | ✓ |
| pages.runtim..prod.js gzip | 21.3 kB | 21.3 kB | ✓ |
| server.runti..prod.js gzip | 916 kB | 916 kB | ✓ |
| Overall change | 2.35 MB | 2.35 MB | ✓ |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js 11-29-fix_empty_generatestaticparams_should_still_create_an_isr_route | Change | |
|---|---|---|---|
| 0.pack gzip | 2.04 MB | 2.04 MB | |
| index.pack gzip | 146 kB | 146 kB | N/A |
| Overall change | 2.04 MB | 2.04 MB |
Diff details
Diff for main-HASH.js
Diff too large to display
2de717a to
3bc84e2
Compare
cdae93f to
8dbe5c7
Compare
8b3e14d to
024b520
Compare
024b520 to
25aca48
Compare
ijjk
approved these changes
Dec 10, 2024
ztanner
added a commit
that referenced
this pull request
Dec 13, 2024
This refactors `collectAppPageSegments` to be more efficient especially when dealing with multiple parallel routes, where the number of combinations of segments can drastically increase how many segments are returned per route. Previously this function only considered the `children` parallel route. When it was updated to consider all possible parallel routes in #73358, this had the unintended side effect of increasing the amount of duplicate segments this function would have to process. We only need to return unique segments discovered from a particular loader tree (representing a page), as opposed to the same segment as many times as it might appear across all parallel routes. This PR uses a map to track unique segments with a composite key used to identify the discovered segments. Additionally, this refactors the function to be iterative rather than recursive. We keep track of a queue of segments to be processed (a tuple of `[loaderTree, segments]`), and as we discover new parallel route paths, we process the queue further. Fixes #73793 Closes #73871 (h/t to @icyJoseph for identifying the cause of the memory consumption)
ztanner
added a commit
that referenced
this pull request
Dec 16, 2024
This refactors `collectAppPageSegments` to be more efficient especially when dealing with multiple parallel routes, where the number of combinations of segments can drastically increase how many segments are returned per route. Previously this function only considered the `children` parallel route. When it was updated to consider all possible parallel routes in #73358, this had the unintended side effect of increasing the amount of duplicate segments this function would have to process. We only need to return unique segments discovered from a particular loader tree (representing a page), as opposed to the same segment as many times as it might appear across all parallel routes. This PR uses a map to track unique segments with a composite key used to identify the discovered segments. Additionally, this refactors the function to be iterative rather than recursive. We keep track of a queue of segments to be processed (a tuple of `[loaderTree, segments]`), and as we discover new parallel route paths, we process the queue further. Fixes #73793 Closes #73871 (h/t to @icyJoseph for identifying the cause of the memory consumption)
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.

Returning an empty array from
generateStaticParamsshould still be deployed as an ISR route to support thedynamicParams = truecase, where a route can be generated & cached on demand. At the moment the only way to achieve this behavior is withexport const dynamic = 'force-static'. As a result, these routes are being treated as dynamic and never return a cached response.This PR resolves the bug by fixing several distinct things:
prerenderedRoutesdoes not need to be an array > 0 to mark a route as being a static path. This will ensure the build output shows the correct symbol and adds the path to the list of prerenders.prerenderedRoutesto an empty array if we determine that the leaf-most segment (the thing rendering the current page) has agenerateStaticParamsfunctionchildrenbranch, but for something like a parallel/interception route, those segments would be inside of a different parallel route key(.))This appears to have regressed in #68125
Closes NEXT-3905