HomeAbout Me

Next.js 1 - Data Fetching (CSR, SSR, SSG, ISR, PPR)

By Daniel Nguyen
Published in Next JS
August 01, 2025
1 min read

Next.js provides multiple ways to fetch data, each suited for different use cases. Understanding them helps optimize performance, SEO, and user experience.

MethodWhen Data is Fetched?Use Case
CSR (Client-Side Rendering)After page loads (on client)Non-SEO pages, user-specific data
SSR (Server-Side Rendering)On every request (server)Dynamic pages with fresh data
SSG (Static Site Generation)At build timeBlogs, marketing pages (fast & cached)
ISR (Incremental Static Regeneration)Build time + on-demand updatesStatic pages with occasional updates
PPR (Partial Prerendering)Hybrid: Some content pre-rendered, some fetched on clientDynamic content with SEO optimization

1️⃣ Client-Side Rendering (CSR)

  • Data is fetched on the client after the page loads.
  • SEO is bad because the HTML is empty at first (Google sees a blank page).
  • Best for user-specific data (e.g., dashboards, private pages).

Example: Fetching Data with useEffect (CSR)

"use client"; // Required for client-side rendering
import { useState, useEffect } from "react";
export default function CSRPage() {
const [data, setData] = useState(null);
useEffect(() => {
fetch("https://api.example.com/data")
.then((res) => res.json())
.then((data) => setData(data));
}, []);
return (
<div>
<h1>Client-Side Rendered Data</h1>
{data ? <pre>{JSON.stringify(data, null, 2)}</pre> : <p>Loading...</p>}
</div>
);
}

Pros: Works well for user-specific content (auth-required pages).
Cons: Slower initial load, bad for SEO.


2️⃣ Server-Side Rendering (SSR)

  • Data is fetched on each request (server-side).
  • Good for real-time data and SEO.
  • Slower than SSG because it runs every time a user visits.

Example: Fetching Data with getServerSideProps (SSR)

// app/page.tsx (Server Component)
export async function getServerSideProps() {
const res = await fetch("https://api.example.com/data");
const data = await res.json();
return { props: { data } };
}
export default function SSRPage({ data }) {
return (
<div>
<h1>Server-Side Rendered Data</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}

Pros: Fresh data, SEO-friendly.
Cons: Slower response time, higher server load.


3️⃣ Static Site Generation (SSG)

  • Data is fetched at build time and saved as static HTML.
  • Super fast (CDN cached).
  • Not suitable for frequently changing data.

Example: Fetching Data with getStaticProps (SSG)

// app/page.tsx (Server Component)
export async function getStaticProps() {
const res = await fetch("https://api.example.com/data");
const data = await res.json();
return { props: { data } };
}
export default function SSGPage({ data }) {
return (
<div>
<h1>Static Site Generated Data</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}

Pros: Super fast, scalable, SEO-friendly.
Cons: Data can become stale.


4️⃣ Incremental Static Regeneration (ISR)

  • Like SSG, but allows on-demand updates (no full rebuild).
  • Uses revalidate to refresh data at a set interval.
  • Great for semi-static pages (e.g., blog posts, product listings).

Example: Using revalidate in ISR

export async function getStaticProps() {
const res = await fetch("https://api.example.com/data");
const data = await res.json();
return { props: { data }, revalidate: 60 }; // Regenerates every 60 seconds
}

Pros: Fast like SSG, but can update without rebuilding the whole site.
Cons: Data is not always 100% fresh.


5️⃣ Partial Prerendering (PPR) – NEW in Next.js 15

  • Hybrid approach: Some parts statically pre-rendered, others loaded dynamically.
  • Best for e-commerce, personalized content, and dynamic SEO-friendly pages.

Example: Static Header + Dynamic Product List

// app/page.tsx
import { Suspense } from "react";
import Products from "./Products";
export default function HomePage() {
return (
<div>
<h1>Welcome to Our Store</h1>
<Suspense fallback={<p>Loading products...</p>}>
<Products />
</Suspense>
</div>
);
}
// app/Products.tsx (Server Component)
export default async function Products() {
const res = await fetch("https://api.example.com/products");
const products = await res.json();
return (
<ul>
{products.map((p) => (
<li key={p.id}>{p.name}</li>
))}
</ul>
);
}

Pros: SEO-friendly, fast, handles dynamic data well.
Cons: More complex than SSG or SSR.


6️⃣ When to Use What?

FeatureCSRSSRSSGISRPPR
Data freshness✅ Latest✅ Latest❌ Stale✅ Auto-refresh✅ Latest
SEO❌ No✅ Yes✅ Yes✅ Yes✅ Yes
Performance❌ Slow (JS heavy)❌ Slower (server fetch)✅ Fast (pre-built)✅ Fast✅ Fast
Best forPrivate dashboardsNews feedsBlogs, docsE-commerce, product pagesPersonalized SEO content

🎯 Conclusion

  • Use CSR for user-specific data (dashboards, auth-required pages).
  • Use SSR for dynamic content that needs to be fresh (news feeds, search results).
  • Use SSG for static pages that don’t change often (marketing pages, blogs).
  • Use ISR when you need fast performance + occasional updates.
  • Use PPR when you need hybrid rendering (SEO + personalization).

🔥 Next Steps

Would you like a deep dive into React Server Components, caching strategies, or middleware in Next.js 15? 🚀


Tags

#NextJS

Share

Previous Article
Next.js 1 - Introduction

Table Of Contents

1
1️⃣ Client-Side Rendering (CSR)
2
2️⃣ Server-Side Rendering (SSR)
3
3️⃣ Static Site Generation (SSG)
4
4️⃣ Incremental Static Regeneration (ISR)
5
5️⃣ Partial Prerendering (PPR) – NEW in Next.js 15
6
6️⃣ When to Use What?
7
🎯 Conclusion
8
🔥 Next Steps

Related Posts

Next.js 6 - Setting Up Fonts
August 06, 2025
1 min
© 2025, All Rights Reserved.
Powered By

Quick Links

About Me

Legal Stuff

Social Media