React Server Components (RSCs) are one of the most significant architectural shifts in React's history. They allow components to run exclusively on the server, eliminating client-side JavaScript for those components entirely.
Server vs Client Components
By default, all components in the Next.js App Router are Server Components. Add 'use client' at the top of a file to opt into the client bundle. The key insight: Client Components are not bad — they're just different. Interactivity lives in client components; data access lives in server components.
Data Fetching Patterns
In server components you can fetch data directly — no useEffect, no loading state, no client-side fetch. Async/await works at the component level. Combine this with Next.js caching and revalidation for a powerful, simple data layer.
Composing Server and Client
Pass server-fetched data as props into client components. You can even pass server components as children into client components — the children slot is a prop, so it crosses the boundary cleanly. This pattern keeps interactivity at the leaves while data access stays at the root.