Skip to content
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

[PPR] Enable incremental adoption #63847

Merged

Conversation

wyattjoh
Copy link
Member

@wyattjoh wyattjoh commented Mar 28, 2024

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:

export const experimental_ppr = true

To enable PPR for that segment and those descending segments. Any subset of those routes that have it enabled can add:

export const experimental_ppr = false
An aside on the choice of experimental_ppr name

It is against common JS semantics to use snake-case, and preference is given to camel-case instead. The choice to make this snake-case was to re-enforce that this is an experimental feature, an ugly incremental path, and ideally, developers should aim to remove all references of it from their codebase.

Additionally, this mirrors what we've done for unstable API's like `unstable_cache`.

To disable PPR for that segment and those descending segments. To use this new option, the experimental.ppr configuration in next.config.js must be set to "incremental":

// next.config.js
module.exports = {
  experimental: {
    ppr: "incremental",
  },
} 

If a segment does not export a experimental_ppr boolean, it is inferred from it's parent. If no parent has it defined, it's default value is false and therefore disabled.

Once all your segments have PPR enabled via this config, it would be considered safe for teams to set their experimental.ppr value in the next.config.js to true, enabling it for the entire app and for all future routes.

Aside

I also took the liberty to rename isPPR and supportsPPR to be the clearer isAppPPREnabled and isRoutePPREnabled.

Copy link
Member Author

wyattjoh commented Mar 28, 2024

This stack of pull requests is managed by Graphite. Learn more about stacking.

Join @wyattjoh and the rest of your teammates on Graphite Graphite

@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 6f2e688 to b4de9cc Compare March 28, 2024 23:04
@ijjk
Copy link
Member

ijjk commented Mar 28, 2024

Tests Passed

@ijjk
Copy link
Member

ijjk commented Mar 28, 2024

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
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 ⚠️ +59 kB
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 ⚠️ +116 B
page.js gzip 182 kB 182 kB N/A
Overall change 94.7 kB 94.9 kB ⚠️ +116 B
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 ⚠️ +110 B
Overall change 146 kB 146 kB ⚠️ +110 B
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 ⚠️ +1.03 kB
index.pack gzip 113 kB 113 kB N/A
Overall change 1.62 MB 1.62 MB ⚠️ +1.03 kB
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

Commit: bebe570

@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from b4de9cc to 84d9ce3 Compare April 2, 2024 22:06
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 84d9ce3 to 7676c8e Compare April 10, 2024 15:16
@wyattjoh wyattjoh changed the base branch from canary to wyattjoh/immutable-prerender-manifest April 11, 2024 20:03
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 7676c8e to 516eaff Compare April 11, 2024 20:03
packages/next/src/build/index.ts Show resolved Hide resolved
packages/next/src/build/index.ts Show resolved Hide resolved
packages/next/src/build/utils.ts Show resolved Hide resolved
packages/next/src/build/utils.ts Outdated Show resolved Hide resolved
packages/next/src/export/routes/app-page.ts Outdated Show resolved Hide resolved
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 516eaff to 7113527 Compare April 11, 2024 22:26
@wyattjoh wyattjoh force-pushed the wyattjoh/immutable-prerender-manifest branch 2 times, most recently from bcc1bc7 to d90fc32 Compare April 11, 2024 23:56
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 7113527 to dba7cfb Compare April 12, 2024 00:25
Base automatically changed from wyattjoh/immutable-prerender-manifest to canary April 12, 2024 03:07
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch 4 times, most recently from 12070da to 518996c Compare April 17, 2024 16:11
@ijjk ijjk added the tests label Apr 17, 2024
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 518996c to 5172bf0 Compare April 20, 2024 00:36
@wyattjoh wyattjoh marked this pull request as ready for review April 20, 2024 01:37
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch 2 times, most recently from e82f947 to 9a385c0 Compare April 30, 2024 17:13
Copy link
Contributor

@unstubbable unstubbable left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apologies for the unsolicited review; I came across these two minor errors in the code comments while reading through the PR out of curiosity.

packages/next/src/build/utils.ts Outdated Show resolved Hide resolved
packages/next/src/server/base-server.ts Outdated Show resolved Hide resolved
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from fff3604 to 1e14542 Compare May 1, 2024 00:44
@wyattjoh wyattjoh marked this pull request as ready for review May 3, 2024 17:50
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 19a84fa to 1cfdecc Compare May 3, 2024 17:51
packages/next/src/build/index.ts Show resolved Hide resolved
Comment on lines +1683 to +1684
!isInterceptionRouteAppPath(page) &&
checkIsRoutePPREnabled(pprConfig, appConfig)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if the interception check should be part of checkIsRoutePPREnabled so we don't accidentally forget it somewhere

packages/next/src/server/lib/experimental/ppr.ts Outdated Show resolved Hide resolved
packages/next/src/server/response-cache/types.ts Outdated Show resolved Hide resolved
packages/next/src/server/web-server.ts Show resolved Hide resolved
packages/next/src/server/base-server.ts Outdated Show resolved Hide resolved
@@ -2688,7 +2716,8 @@ export default abstract class Server<
}

const didPostpone =
cacheEntry.value?.kind === 'PAGE' && !!cacheEntry.value.postponed
cacheEntry.value?.kind === 'PAGE' &&
typeof cacheEntry.value.postponed === 'string'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch 3 times, most recently from 11d013a to 9345844 Compare May 6, 2024 15:43
@wyattjoh wyattjoh force-pushed the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch from 10b8808 to bebe570 Compare May 6, 2024 19:49
@wyattjoh wyattjoh merged commit cdb4154 into canary May 6, 2024
79 of 80 checks passed
@wyattjoh wyattjoh deleted the wyattjohnson/next-2920-enable-incremental-ppr-adoption branch May 6, 2024 20:55
@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 21, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
created-by: Next.js team PRs by the Next.js team. locked tests Turbopack Related to Turbopack with Next.js. type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants