How Partial Prerendering works
React Suspense boundaries mark where the static shell stops and streamed content starts. For uncached async work wrapped in Suspense, the fallback UI is part of the prerendered shell and the real content is rendered at request time. A Suspense wrapper alone does not make a component dynamic; a component that only does synchronous work still finishes during prerendering. Short-lived caches (the seconds profile, revalidate: 0, or expire under 5 minutes) are left out of the prerender and become dynamic holes.
At build time each PPR route produces two artifacts: the static HTML shell and an opaque postponedState blob. At request time the server sends the shell first, then resumes rendering only the dynamic parts from the postponed state and streams them.
Shell contents. The shell holds HTML for the first page load plus a serialized RSC Payload used for client-side navigation.
Delivery. Each static shell can be served straight from a CDN without reaching the origin server, so direct navigations are instant.
Unknown params. When a route's dynamic params are not known at build time, Next.js uses a URL-independent version of the shell called the App Shell.
The Next.js caching docs show code for each case. For how PPR sits next to SSR, SSG and ISR, see our guide to Next.js rendering strategies.
Versions and hosting
History. PPR was first introduced in 2023, and the Next.js team describes Cache Components in Next.js 16 as completing it.
Removed flags. Since Next.js 16, the
experimental.pprconfig flag and theexperimental_pprroute segment export are removed;cacheComponentsenables PPR instead.Migration from 15. PPR in Next.js 16 behaves differently from the experimental PPR in Next.js 15 canaries, so moving to 16 needs a migration to Cache Components.
New apps. As of Next.js 16.4,
create-next-appturns on Cache Components, and with it PPR, by default for new apps. Cache Components is planned to become the default in Next.js 17.Hosting. The only hosting requirement for basic PPR is support for streaming HTTP responses;
next startsupports it with no extra setup.
For rendering choices that slow pages, see common Next.js mistakes that hurt Core Web Vitals and our Next.js performance optimization service.
Sources
- GlossaryNext.js · nextjs.org
- Next.js 16 (release blog post)Next.js · nextjs.org
- Caching (Cache Components)Next.js · nextjs.org
- Getting Started: RevalidatingNext.js · nextjs.org
- Implementing Partial Prerendering on your platformNext.js · nextjs.org
- next.config.js: cacheComponentsNext.js · nextjs.org
- How to upgrade to version 16Next.js · nextjs.org
- Next.js 16.4Next.js · nextjs.org