Skip to content
App Router...RenderingPartial Prerendering (Experimental)

Partial Prerendering (Experimental)

Partial Prerendering is an experimental feature and subject to change.

Partial Prerendering (PPR) is a rendering strategy that combines the benefits of static and dynamic rendering on the same route. With PPR, you can wrap any dynamic components in a Suspense boundary. When a new request comes in, Next.js will immediately serve a static HTML shell from the cache, then render and stream the dynamic parts in the same HTTP request.

Partially Prerendered Product Page showing static nav and product information, and dynamic cart and recommended products

🎥 Watch: Why PPR and how it works → YouTube (10 minutes).

Incremental Adoption (Version 15)

In Next.js 15, you can incrementally adopt Partial Prerendering in layouts and pages by setting the ppr option in next.config.js to incremental, and exporting the experimental_ppr route config option at the top of the file:

next.config.js
const nextConfig = {
  experimental: {
    ppr: 'incremental',
  },
}
 
module.exports = nextConfig
app/page.tsx
import { Suspense } from "react"
import { StaticComponent, DynamicComponent, Fallback } from "@/app/ui"
 
export const experimental_ppr = true
 
export default function Page() {
  return {
     <>
      <StaticComponent />
      <Suspense fallback={<Fallback />}>
        <DynamicComponent />
      </Suspense>
     </>
  };
}

Good to know:

  • Routes that don't have experimental_ppr will default to false and will not be prerendered using PPR. You need to explicitly opt-in to PPR for each route.
  • experimental_ppr will apply to all children of the route segment, including nested layouts and pages. You don't have to add it to every file, only the top segment of a route.
  • To disable PPR for children segments, you can set experimental_ppr to false in the child segment.

Enabling PPR (Version 14)

For version 14, you can enable it by adding the ppr option to your next.config.js file. This will apply to all routes in your application:

next.config.js
const nextConfig = {
  experimental: {
    ppr: true,
  },
}
 
module.exports = nextConfig