Back to blog

React 19.2 and Partial Pre-rendering: The New Era of Web Rendering

Hello HaWkers, React just released version 19.2 with a feature that completely changes how we think about web application rendering. Partial Pre-rendering combines the best of both worlds: SSG speed with SSR dynamism.

Have you ever had to choose between a super fast static site or a slower dynamic application? That decision may be a thing of the past.

What is Partial Pre-rendering

Understanding the revolutionary concept.

The Problem It Solves

Before Partial Pre-rendering, developers faced a dilemma:

SSG (Static Site Generation):

  • Pages pre-rendered at build time
  • Ultra fast to serve
  • Static content, no personalization
  • Ideal for blogs, documentation

SSR (Server-Side Rendering):

  • Rendered on each request
  • Always updated content
  • Slower, more server resources
  • Ideal for dashboards, e-commerce

The problem: What if you need both on the same page?

How Partial Pre-rendering Works

React 19.2's new approach:

Main concept:

  • Pre-renders static parts at build
  • Serves static shell from CDN
  • Fills in dynamic parts later
  • Best of both worlds

In practice:

Page Part Type When It Renders
Header/Nav Static Build time
Footer Static Build time
Main content Static Build time
User data Dynamic Request time
Recommendations Dynamic Request time

Implementing Partial Pre-rendering

How to use it in practice.

Basic Configuration

The setup in Next.js 16:

// next.config.js
const nextConfig = {
  experimental: {
    ppr: true, // Enable Partial Pre-rendering
  },
};

export default nextConfig;

Marking Dynamic Components

Use Suspense to delimit dynamic areas:

// app/dashboard/page.jsx
import { Suspense } from 'react';
import StaticHeader from './StaticHeader';
import DynamicUserData from './DynamicUserData';
import StaticFooter from './StaticFooter';

export default function DashboardPage() {
  return (
    <div>
      {/* Static part - pre-rendered at build */}
      <StaticHeader />

      <main>
        <h1>Welcome to Dashboard</h1>

        {/* Dynamic part - rendered on request */}
        <Suspense fallback={<UserDataSkeleton />}>
          <DynamicUserData />
        </Suspense>

        {/* More static content */}
        <StaticSidebar />

        {/* Another dynamic area */}
        <Suspense fallback={<RecommendationsSkeleton />}>
          <PersonalizedRecommendations />
        </Suspense>
      </main>

      <StaticFooter />
    </div>
  );
}

Dynamic Component with Data

Fetching data on the server:

// components/DynamicUserData.jsx
async function DynamicUserData() {
  // This function runs on the server on each request
  const user = await fetchCurrentUser();
  const stats = await fetchUserStats(user.id);

  return (
    <div className="user-dashboard">
      <h2>Hello, {user.name}!</h2>

      <div className="stats-grid">
        <StatCard
          title="Active Projects"
          value={stats.activeProjects}
        />
        <StatCard
          title="Pending Tasks"
          value={stats.pendingTasks}
        />
        <StatCard
          title="Hours This Week"
          value={stats.hoursThisWeek}
        />
      </div>

      <RecentActivity activities={stats.recentActivity} />
    </div>
  );
}

export default DynamicUserData;

Performance Benefits

The gains are significant.

Comparative Metrics

Tests on a real application:

Before (Pure SSR):

  • Time to First Byte (TTFB): 800ms
  • First Contentful Paint (FCP): 1.2s
  • Largest Contentful Paint (LCP): 2.1s
  • Time to Interactive (TTI): 2.8s

After (Partial Pre-rendering):

  • Time to First Byte (TTFB): 50ms
  • First Contentful Paint (FCP): 200ms
  • Largest Contentful Paint (LCP): 600ms
  • Time to Interactive (TTI): 1.2s

Improvement:

  • TTFB: 16x faster
  • FCP: 6x faster
  • LCP: 3.5x faster
  • TTI: 2.3x faster

Why the Difference Is So Big

The secret is in the architecture:

Traditional SSR:

  1. Request arrives at server
  2. Server fetches ALL data
  3. Server renders entire page
  4. Sends complete HTML to client
  5. Client sees the page

Partial Pre-rendering:

  1. Request arrives at CDN
  2. CDN serves static shell instantly
  3. Client sees layout immediately
  4. Server fetches dynamic data in parallel
  5. Streaming fills in the gaps
// The static shell is already ready on CDN
// No computation needed to serve
const staticShell = `
  <html>
    <head>...</head>
    <body>
      <header>Logo | Nav</header>
      <main>
        <h1>Dashboard</h1>
        <!-- Placeholder for dynamic content -->
        <div id="user-data">Loading...</div>
      </main>
      <footer>...</footer>
    </body>
  </html>
`;

Ideal Use Cases

Where PPR shines.

E-commerce

Online stores benefit greatly:

// app/product/[id]/page.jsx
export default function ProductPage({ params }) {
  return (
    <div>
      {/* Static: Layout, nav, footer */}
      <Header />

      {/* Static: Product data (can be ISR) */}
      <ProductDetails productId={params.id} />

      {/* Dynamic: Personalized price */}
      <Suspense fallback={<PriceSkeleton />}>
        <PersonalizedPrice productId={params.id} />
      </Suspense>

      {/* Dynamic: Real-time availability */}
      <Suspense fallback={<StockSkeleton />}>
        <LiveStockStatus productId={params.id} />
      </Suspense>

      {/* Dynamic: User-based recommendations */}
      <Suspense fallback={<RecommendationsSkeleton />}>
        <PersonalizedRecommendations />
      </Suspense>

      <Footer />
    </div>
  );
}

Corporate Dashboards

Administrative panels:

Static parts:

  • Navigation sidebar
  • General layout
  • Titles and labels
  • Chart structures

Dynamic parts:

  • Real-time data
  • User metrics
  • Notifications
  • System status

News Portals

Content sites:

Static:

  • Main article
  • Page structure
  • Fixed ads

Dynamic:

  • User-recommended articles
  • Real-time view counter
  • Recent comments
  • Subscription status

Comparison with Other Approaches

How PPR positions itself.

PPR vs Islands Architecture

Two different approaches:

Aspect PPR (React) Islands (Astro)
Framework React/Next.js Astro
Hydration Progressive Partial
JavaScript More JS sent Less JS sent
Complexity Lower curve Higher curve
Ecosystem Huge Growing

PPR vs Streaming SSR

Natural evolution:

Streaming SSR:

  • Sends HTML in chunks
  • Still needs to render everything on server
  • Improves speed perception

Partial Pre-rendering:

  • Shell is already ready on CDN
  • Server only processes dynamic parts
  • Real speed improvement

To Migrate or Not to Migrate

Considerations for your project.

When to Migrate Now

Makes sense if:

Ideal scenarios:

  • Site with mix of static/dynamic content
  • Performance issues with SSR
  • Already using Next.js 14+
  • Team familiar with Server Components

Immediate benefits:

  • Server cost reduction
  • Core Web Vitals improvement
  • Better user experience
  • Enhanced SEO

When to Wait

Can wait if:

Scenarios:

  • 100% dynamic application (internal dashboard)
  • 100% static site (simple blog)
  • Different stack from Next.js
  • Small team, many priorities

Migration Checklist

Steps to adopt PPR:

  1. Update Next.js to version 16+
  2. Identify static vs dynamic parts
  3. Refactor components with Suspense
  4. Test performance before/after
  5. Monitor metrics in production

The Future of Rendering

What comes after PPR.

Trends for 2026-2027

What to expect:

Expected evolutions:

  • PPR as default in React frameworks
  • Automatic component analysis tools
  • Automatic boundary optimization
  • Deeper integration with edge computing

Market impact:

  • Infrastructure cost reduction
  • Faster user experiences
  • Smaller gap between native and web apps
  • New UX possibilities

The arrival of Partial Pre-rendering in React 19.2 represents a significant shift in how we build web applications. No longer need to choose between speed and dynamism - we can have both.

If you are interested in how development tools are evolving, I recommend checking out another article: Vibe Coding: The Revolution in Software Development with AI where you will discover how AI is transforming how we code.

Let's go! 🦅

📚 Want to Deepen Your JavaScript Knowledge?

This article covered React 19.2 and Partial Pre-rendering, but there is much more to explore in modern development.

Developers who invest in solid, structured knowledge tend to have more opportunities in the market.

Complete Study Material

If you want to master JavaScript from basics to advanced, I have prepared a complete guide:

Investment options:

  • 1x of $4.90 on card
  • or $4.90 at sight

👉 Learn About JavaScript Guide

💡 Material updated with industry best practices

Comments (0)

This article has no comments yet 😢. Be the first! 🚀🦅

Add comments