[PPR] Enable incremental adoption#63847
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
6f2e688 to
b4de9cc
Compare
Tests Passed |
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| buildDuration | 15.3s | 13.8s | N/A |
| buildDurationCached | 7.7s | 7.3s | N/A |
| nodeModulesSize | 360 MB | 360 MB | |
| nextStartRea..uration (ms) | 414ms | 412ms | N/A |
Client Bundles (main, webpack)
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| 1103-HASH.js gzip | 31.9 kB | 31.9 kB | N/A |
| 1a9f679d-HASH.js gzip | 53.5 kB | 53.5 kB | N/A |
| 335-HASH.js gzip | 5.05 kB | 5.05 kB | ✓ |
| 7953.HASH.js gzip | 169 B | 169 B | ✓ |
| framework-HASH.js gzip | 45.2 kB | 45.2 kB | ✓ |
| main-app-HASH.js gzip | 231 B | 229 B | N/A |
| main-HASH.js gzip | 31.6 kB | 31.6 kB | N/A |
| webpack-HASH.js gzip | 1.65 kB | 1.65 kB | N/A |
| Overall change | 50.4 kB | 50.4 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 192 B | 193 B | N/A |
| _error-HASH.js gzip | 192 B | 193 B | N/A |
| amp-HASH.js gzip | 507 B | 511 B | N/A |
| css-HASH.js gzip | 341 B | 343 B | N/A |
| dynamic-HASH.js gzip | 2.52 kB | 2.52 kB | ✓ |
| edge-ssr-HASH.js gzip | 266 B | 265 B | N/A |
| head-HASH.js gzip | 362 B | 365 B | N/A |
| hooks-HASH.js gzip | 392 B | 392 B | ✓ |
| image-HASH.js gzip | 4.27 kB | 4.27 kB | ✓ |
| index-HASH.js gzip | 268 B | 268 B | ✓ |
| link-HASH.js gzip | 2.69 kB | 2.7 kB | N/A |
| routerDirect..HASH.js gzip | 329 B | 328 B | N/A |
| script-HASH.js gzip | 397 B | 397 B | ✓ |
| withRouter-HASH.js gzip | 324 B | 324 B | ✓ |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 8.27 kB | 8.27 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 483 B | 484 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| index.html gzip | 528 B | 526 B | N/A |
| link.html gzip | 541 B | 540 B | N/A |
| withRouter.html gzip | 524 B | 522 B | N/A |
| Overall change | 0 B | 0 B | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 94.7 kB | 94.9 kB | |
| page.js gzip | 182 kB | 182 kB | N/A |
| Overall change | 94.7 kB | 94.9 kB |
Middleware size
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 622 B | 624 B | N/A |
| middleware-r..fest.js gzip | 156 B | 156 B | ✓ |
| middleware.js gzip | 25.7 kB | 25.7 kB | N/A |
| edge-runtime..pack.js gzip | 839 B | 839 B | ✓ |
| Overall change | 995 B | 995 B | ✓ |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 171 kB | 171 kB | N/A |
| app-page-exp..prod.js gzip | 98.8 kB | 98.8 kB | N/A |
| app-page-tur..prod.js gzip | 100 kB | 100 kB | N/A |
| app-page-tur..prod.js gzip | 94.6 kB | 94.6 kB | N/A |
| app-page.run...dev.js gzip | 157 kB | 157 kB | N/A |
| app-page.run..prod.js gzip | 93.3 kB | 93.3 kB | N/A |
| app-route-ex...dev.js gzip | 21.5 kB | 21.5 kB | N/A |
| app-route-ex..prod.js gzip | 15.3 kB | 15.3 kB | N/A |
| app-route-tu..prod.js gzip | 15.3 kB | 15.3 kB | N/A |
| app-route-tu..prod.js gzip | 15 kB | 15 kB | N/A |
| app-route.ru...dev.js gzip | 21.3 kB | 21.4 kB | N/A |
| app-route.ru..prod.js gzip | 15 kB | 15 kB | N/A |
| pages-api-tu..prod.js gzip | 9.55 kB | 9.55 kB | ✓ |
| pages-api.ru...dev.js gzip | 9.82 kB | 9.82 kB | ✓ |
| pages-api.ru..prod.js gzip | 9.55 kB | 9.55 kB | ✓ |
| pages-turbo...prod.js gzip | 21.5 kB | 21.5 kB | ✓ |
| pages.runtim...dev.js gzip | 22.1 kB | 22.1 kB | ✓ |
| pages.runtim..prod.js gzip | 21.5 kB | 21.5 kB | ✓ |
| server.runti..prod.js gzip | 51.7 kB | 51.8 kB | |
| Overall change | 146 kB | 146 kB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js wyattjohnson/next-2920-enable-incremental-ppr-adoption | Change | |
|---|---|---|---|
| 0.pack gzip | 1.62 MB | 1.62 MB | |
| index.pack gzip | 113 kB | 113 kB | N/A |
| Overall change | 1.62 MB | 1.62 MB |
Diff details
Diff for edge-ssr.js
Diff too large to display
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..time.prod.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..time.prod.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 server.runtime.prod.js
Diff too large to display
b4de9cc to
84d9ce3
Compare
84d9ce3 to
7676c8e
Compare
7676c8e to
516eaff
Compare
516eaff to
7113527
Compare
bcc1bc7 to
d90fc32
Compare
7113527 to
dba7cfb
Compare
12070da to
518996c
Compare
518996c to
5172bf0
Compare
e82f947 to
9a385c0
Compare
unstubbable
left a comment
There was a problem hiding this comment.
Apologies for the unsolicited review; I came across these two minor errors in the code comments while reading through the PR out of curiosity.
fff3604 to
1e14542
Compare
19a84fa to
1cfdecc
Compare
| !isInterceptionRouteAppPath(page) && | ||
| checkIsRoutePPREnabled(pprConfig, appConfig) |
There was a problem hiding this comment.
I wonder if the interception check should be part of checkIsRoutePPREnabled so we don't accidentally forget it somewhere
| const didPostpone = | ||
| cacheEntry.value?.kind === 'PAGE' && !!cacheEntry.value.postponed | ||
| cacheEntry.value?.kind === 'PAGE' && | ||
| typeof cacheEntry.value.postponed === 'string' |
There was a problem hiding this comment.
not for this PR, but perhaps for the future: I think we should rename this value. seeing postponed makes me think I'm going to be working with a boolean, not postpone state.
11d013a to
9345844
Compare
Co-authored-by: Hendrik Liebau <mail@hendrik-liebau.de>
Co-authored-by: Hendrik Liebau <mail@hendrik-liebau.de>
10b8808 to
bebe570
Compare

Enabling Partial Prerendering (PPR) for an entire application is ideally, the goal for teams wanting to test out the feature or adopt it in their applications to get ready for when it becomes the default rendering pattern. For large applications, with many routes the new behaviours of old API's may prove a difficult pill to swallow all at once.
This aims to enable incremental adoption of PPR for pages and routes that want to support it in a similar way to how existing segment-level configurations. Segments can now add:
To enable PPR for that segment and those descending segments. Any subset of those routes that have it enabled can add:
An aside on the choice of
experimental_pprnameTo disable PPR for that segment and those descending segments. To use this new option, the
experimental.pprconfiguration innext.config.jsmust be set to"incremental":If a segment does not export a
experimental_pprboolean, it is inferred from it's parent. If no parent has it defined, it's default value isfalseand therefore disabled.Once all your segments have PPR enabled via this config, it would be considered safe for teams to set their
experimental.pprvalue in thenext.config.jstotrue, enabling it for the entire app and for all future routes.Aside
I also took the liberty to rename
isPPRandsupportsPPRto be the clearerisAppPPREnabledandisRoutePPREnabled.