foundation
SSR
Render per request when personalization, request data, or always-fresh content matters more than cacheability.
Server-Side Rendering generates HTML (and RSC payload) per request when data must be fresh, user-specific, or authorization-dependent. In App Router, dynamic segments, cookies, headers, or `export const dynamic = 'force-dynamic'` opt into request-time rendering.
export const dynamic = 'force-dynamic';
export default async function Page() {
const user = await getUserFromCookies();
return <Dashboard data={await fetchDashboard(user.id)} />;
}
SSR improves first meaningful HTML for crawlers and users but increases server work and TTFB versus cached static output.
On interviews: explain when SSR beats ISR and how request data stays server-side.
Common pitfalls: SSR for globally identical content, N+1 fetches per request, and leaking secrets into serialized props.
The trade-off is freshness and personalization versus server cost and cache hit rate.
Checklist:
- Use SSR when output varies per request.
- Batch server fetches; avoid waterfalls.
- Keep secrets and tokens server-only.
- Monitor TTFB and error rates.