Partial Pre-Rendering (PPR) in Next.js: The Complete Guide
PPR combines the best of static and dynamic rendering. With the use cache directive, Next.js revolutionizes web rendering. Technical guide with examples.

William Aklamavo
February 25, 2026
Partial Pre-Rendering (PPR) in Next.js: The Complete Guide
Partial Pre-Rendering (PPR) is the most exciting Next.js feature since Server Components. With the new use cache directive, Vercel's framework finally solves the dilemma: static or dynamic?
The 2026 answer: both, on the same page.
The Problem PPR Solves
Imagine an e-commerce page:
| Element | Nature | Need |
|---|---|---|
| Header / Logo | Static | Same for everyone |
| Product info | Semi-dynamic | Rarely changes |
| Price | Dynamic | Real-time |
| Cart | Very dynamic | Unique per user |
Before PPR: you had to choose SSG, SSR, or ISR. With PPR, each element renders optimally.
How PPR Works
- Build time: pre-renders static parts
- Edge: static shell served from CDN instantly
- Streaming: dynamic parts streamed in parallel
The use cache Directive
async function ProductInfo({ id }: { id: string }) {
"use cache";
const product = await db.product.findUnique({ where: { id } });
return <div>{product.name} - {product.description}</div>;
}
async function LivePrice({ id }: { id: string }) {
const price = await fetchLivePrice(id);
return <span>{price} EUR</span>;
}
export default async function ProductPage({ params }) {
return (
<div>
<Suspense fallback={<ProductSkeleton />}>
<ProductInfo id={params.id} />
</Suspense>
<Suspense fallback={<PriceSkeleton />}>
<LivePrice id={params.id} />
</Suspense>
</div>
);
}
PPR vs ISR vs SSR
| Criteria | SSR | ISR | PPR |
|---|---|---|---|
| Speed | Medium | Fast | Ultra-fast |
| Freshness | Real-time | Delay | Real-time (dynamic) |
| Server load | High | Medium | Low |
Migration
Step 1: Enable PPR
const nextConfig = {
experimental: { ppr: true },
};
Step 2: Classify components
- Static →
use cachewith long duration - Semi-dynamic →
use cachewith revalidation - Dynamic → no cache
Step 3: Wrap with Suspense
Each cacheable component in a <Suspense> with fallback.
Core Web Vitals Impact
| Metric | Before PPR | After PPR |
|---|---|---|
| LCP | 2.5s | 0.8s |
| FID | 100ms | 40ms |
| CLS | 0.15 | 0.02 |
Conclusion
PPR is a paradigm shift: the best of both worlds without compromise.
Need help migrating to PPR? At BOVO Digital, we optimize web performance with the latest Next.js technologies.