DEV Community

Sachin Maurya
Sachin Maurya

Posted on

Rendering Strategies in Next.js: CSR, SSR, SSG, ISR Explained

Next.js gives us the flexibility to decide how each page should be rendered.
That flexibility is powerful — but also confusing if you don’t know the tradeoffs.

In this post, let’s break down the 4 main rendering strategies in Next.js with examples and use cases.


1. Client-Side Rendering (CSR)

How it works:

  • Page loads with minimal HTML.
  • Data is fetched in the browser using useEffect or similar hooks.
import { useEffect, useState } from "react";

export default function Profile() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch("/api/user")
      .then(res => res.json())
      .then(setUser);
  }, []);

  if (!user) return <p>Loading...</p>;
  return <h1>Hello {user.name}</h1>;
}
Enter fullscreen mode Exit fullscreen mode

✅ Good for: dashboards, private user pages.
❌ Bad for: SEO and initial load performance.


2. Server-Side Rendering (SSR)

How it works:

  • Page HTML is generated on each request.
  • Always up-to-date but increases server load.
export async function getServerSideProps() {
  const res = await fetch("https://api.example.com/products");
  const products = await res.json();
  return { props: { products } };
}

export default function Products({ products }) {
  return products.map(p => <p key={p.id}>{p.name}</p>);
}
Enter fullscreen mode Exit fullscreen mode

✅ Good for: user-specific dashboards, search pages.
❌ Bad for: pages with high traffic but static data.


3. Static Site Generation (SSG)

How it works:

  • Pages are built into static HTML at build time.
  • Served instantly via CDN.
export async function getStaticProps() {
  const res = await fetch("https://api.example.com/blog");
  const posts = await res.json();
  return { props: { posts } };
}
Enter fullscreen mode Exit fullscreen mode

✅ Good for: marketing pages, blogs, docs.
❌ Bad for: content that changes often (stock prices, news).


4. Incremental Static Regeneration (ISR)

How it works:

  • Pages are pre-rendered statically, then revalidated on a schedule.
  • Combines the speed of SSG with freshness of SSR.
export async function getStaticProps() {
  const res = await fetch("https://api.example.com/products");
  const products = await res.json();
  return { props: { products }, revalidate: 60 }; // revalidate every 60s
}
Enter fullscreen mode Exit fullscreen mode

✅ Good for: product catalogs, dashboards, news feeds.
❌ Requires caching strategy & CDN setup to be effective.


Choosing the Right Strategy

Strategy Speed Freshness SEO Best Use Case
CSR Slow Fresh Poor Private dashboards
SSR Medium Fresh Good User-specific pages
SSG Fast Stale Great Blogs, docs
ISR Fast Semi-fresh Great Product listings

Closing Thoughts

The beauty of Next.js is that you don’t need a one-size-fits-all solution.
You can mix rendering strategies across routes to balance speed, freshness, and scalability.

👉 Pro tip: Start with SSG/ISR for performance, and use SSR/CSR only where absolutely necessary.


💬 Which rendering strategy has worked best in your projects — and where did it fail?

Top comments (0)