DEV Community

Cover image for 🚀 Next.js 15.3.4: PPR and Why It’s Even More Powerful Now
Neel
Neel

Posted on • Edited on

🚀 Next.js 15.3.4: PPR and Why It’s Even More Powerful Now

✅ How It Works

Your page renders top-down (like a waterfall).

As soon as some HTML is ready (like header/nav), it’s flushed to the browser.

Components that are still loading (like awaited data or suspense boundaries) are rendered after and streamed later.

It behaves like a hybrid between SSR and React Server Components with Suspense.

✅ What 15.3.4 Brings to PPR

> 🦾 Build-time improvements with Turbopack

  • next build --turbopack is now available in alpha for production builds, delivering major build-time speedups—28% faster on 4-core, up to 83% on high-end machines

  • While still alpha, it's a massive leap forward for rapid iteration in staging environments.

> 🔍 Better observability & routing

  • Client instrumentation hook lets you initialize analytics or performance tracking before client code loads

  • Navigation hooks (onNavigate, useLinkStatus) give you granular control over route changes, enabling improved loading states and UX

These enhancements directly support PPR by giving you both a static shell and dynamic loading control, with fewer toolchain limitations.

🔄 PPR + Next.js 15.3.4 vs CSR, SSR, SSG, ISR

| Strategy | Build Time | Runtime | Latest with 15.3.4 | | -------- | ---------- | -------------------------------- | -------------------------------- | **CSR** | ❌ | ✅ | No Vercel support | **SSR** | ❌ | ✅ | Fully supported | **SSG** | ✅ | ❌ | Stable via SSG & ISR | **ISR** | ✅ | ✅ | Best static/dynamic mix | **PPR** | ✅ | ✅ (+streaming & instrumentation) | *Enhanced by React 19 readiness* 
Enter fullscreen mode Exit fullscreen mode

> Why it matters:

  • Streamed PPR benefits from React¹⁹ and React 18+ streaming APIs supported in v15.3.4.

  • Your app now gets both static safety and dynamic flexibility, with improved DX and tooling.

🛠️ Using PPR in 15.3.4

// app/page.tsx — static shell + dynamic feed import StaticLayout from './StaticLayout'; import DynamicFeed from './DynamicFeed'; export default function Page() { return ( <> <StaticLayout /> <DynamicFeed /> {/* has dynamic = 'force-dynamic' */} </> ); } 
Enter fullscreen mode Exit fullscreen mode
// components/DynamicFeed.tsx export const dynamic = 'force-dynamic'; export default async function DynamicFeed() { const data = await fetch( 'https://api.example.com/feed', { cache: 'no-store' } ).then(r => r.json()); return <Feed data={data} />; } 
Enter fullscreen mode Exit fullscreen mode
// instrumentation-client.ts performance.mark('app-init'); 
Enter fullscreen mode Exit fullscreen mode
  • Use cache: 'force-static' for static, force-dynamic for runtime components.
  • Stream dynamic parts via React Suspense.
  • Add instrumentation-client.ts for observability.
  • Use onNavigate hooks to manage loading UIs.

> 🎯 KeyPoints - 15.3.4

  • ✅ Latest stable version is 15.3.4 as of June 2025
  • 🛠️ Full support for Turbopack builds in alpha.
  • 🧠 Enhanced routing & instrumentation APIs.
  • 🚀 PPR gets even better streaming, control, and observability.
  • 🤖 Built on React 19 readiness—prepares for the future.

Top comments (0)