Server-Side Rendering (SSR)

Pages are rendered on the server for each request. Perfect for E-commerce, Profiles, and Real-time data applications where fresh, personalized content is essential.

Server

🌐
Request
Response
πŸ–₯️
Server receives request
Server fetches data
React.renderToString()
Server sends rendered HTML

Client

Client receives HTML
React.hydrate()
✨Page interactive
Benefits x Trade-offs

Benefits

  • β€’SEO Optimized: Search engines can crawl content
  • β€’Fast Initial Load: HTML ready immediately
  • β€’Social Sharing: Rich previews for social media
  • β€’Accessibility: Works without JavaScript

Trade-offs

  • β€’Higher server load: Server processes every request
  • β€’Increased latency: Server must render before sending
  • β€’More server resources: Requires more CPU/memory
  • β€’Slower for high traffic: Each request hits server
How to implement?

SSR uses async Server Components. In App Router, dynamic rendering is the default for pages with dynamic data.

export const dynamic = "force-dynamic";

export default async function ServerComponent() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();

  return <div>{data.message}</div>;
}
  • β€’Components are async functions (no 'use client' directive)
  • β€’Cannot use React hooks (useState, useEffect, etc.)
  • β€’Use async fetch() for data fetching on the server
  • β€’Data fetching happens on the server for each request