React Server Components Explained (2026 Guide)
React Server Components (RSC) are one of the biggest shifts in how React apps are built — and one of the most misunderstood. If you’ve been confused by "use client", “server vs client components,” or why your data-fetching suddenly moved, this guide clears it up. We’ll cover what Server Components actually are, how they differ from the client components you already know, and a simple rule for deciding which to use.
The problem: too much JavaScript
A traditional React app ships everything to the browser: every component, every library, all bundled into JavaScript the browser must download, parse and execute before the page becomes interactive. As apps grow, that bundle grows, and load times suffer — especially on phones and slow networks.
But think about how much of a typical page is actually interactive. A blog article, a product description, a navigation layout, a footer — most of the page is static content that just needs to be displayed. It never responds to a click. Yet in the old model, all the code to render it still got shipped to and run in the browser. That’s wasteful.
React Server Components attack this waste directly.
What a Server Component is
A Server Component renders only on the server. It runs there, produces its output, and sends the finished UI to the browser — without shipping its own JavaScript. The browser receives a description of the rendered result, not the component’s code.
That unlocks two big wins:
- Zero client-side JavaScript for that component. Static parts of your page stop bloating the bundle entirely.
- Direct access to server resources. A Server Component can read from a database, hit an internal API, or access the file system directly inside the component — no separate API endpoint, no client-side fetching, no loading spinner round-trip.
// A Server Component (the default in supporting frameworks)
async function ProductList() {
const products = await db.query("SELECT * FROM products"); // runs on the server
return (
<ul>
{products.map((p) => <li key={p.id}>{p.name}</li>)}
</ul>
);
}
Notice the component is async and awaits data right inside it. That code never reaches the browser — only the resulting list does.
The trade-off: no interactivity
Because a Server Component runs on the server and vanishes before reaching the browser, it cannot do anything interactive. No useState, no useEffect, no onClick, no browser APIs. There’s no live component sitting in the browser to hold state or respond to events.
That’s where Client Components come in — and these are exactly the React components you already know. You opt into one with a directive at the top of the file:
"use client";
import { useState } from "react";
export default function LikeButton() {
const [likes, setLikes] = useState(0);
return <button onClick={() => setLikes(likes + 1)}>♥ {likes}</button>;
}
The "use client" directive marks the boundary: this component and its logic ship to the browser, run there, and can be fully interactive — at the cost of adding to the JavaScript bundle.
Server vs. client: the mental model
- Server Component (default) — renders on the server, can fetch data directly, ships no JavaScript, cannot be interactive. Great for content, layouts and data display.
- Client Component (
"use client") — renders in the browser, can use state, effects and events, does add to the bundle. Great for anything the user interacts with.
The powerful part is that they compose. A Server Component can render Client Components inside it. So your page can be mostly lightweight server-rendered content, with small islands of interactivity (a search box, a like button, a menu) as client components. You ship JavaScript only for the parts that truly need it.
Server Components are not SSR
This trips up a lot of people, so it’s worth being precise. Server-side rendering (SSR) takes your whole app, renders it to HTML on each request, sends that HTML, then hydrates it — downloading the JavaScript and re-attaching it in the browser so it becomes interactive. SSR still ships all that JavaScript.
Server Components are different: they’re a component type that never ships JavaScript at all. They work alongside SSR, not instead of it. SSR improves first paint; Server Components shrink the bundle. Different tools, complementary goals.
A simple rule for choosing
You don’t need to agonize over every component. Use this default:
Start with Server Components. Reach for a Client Component only when you need interactivity — state, effects, event handlers, or browser-only APIs.
In practice that means most of your data-fetching, layout and content lives in Server Components, and you sprinkle in "use client" components for the genuinely interactive bits. Push those client boundaries as far down the tree as you can, so the interactive island stays small and the rest of the page stays JavaScript-free.
Where you’ll use them
Server Components are opt-in and framework-supported. The most common home is Next.js with the App Router, where components are Server Components by default and you add "use client" where needed. This is the natural next step after learning core React — and it’s a major reason our own React series ends by rebuilding a React app with Next.js. If you’re still learning the fundamentals, start with our React learning roadmap first, then come back to Server Components.
The takeaway
React Server Components let you render on the server, fetch data directly, and ship zero JavaScript for the non-interactive parts of your app — while Client Components handle everything that needs to respond to the user. Learn the boundary ("use client"), remember that Server Components aren’t SSR, and follow one rule: server by default, client when you need interactivity. Get that right and you get faster pages with less JavaScript, almost for free.
Frequently Asked Questions
What are React Server Components?
React Server Components (RSC) are components that render only on the server. They can fetch data directly and send finished UI to the browser without shipping their own JavaScript, which reduces bundle size and speeds up load. They cannot use state or browser-only features like onClick or useEffect.
What is the difference between server and client components?
Server components render on the server, can access server resources directly, and ship no JavaScript, but can't be interactive. Client components render in the browser, can use state, effects and event handlers, but add to the JavaScript bundle. You mark a client component with the 'use client' directive.
Are Server Components the same as server-side rendering (SSR)?
No. SSR renders your whole app to HTML on each request, then hydrates it with JavaScript in the browser. Server Components are a component type that never ships JavaScript at all. They complement SSR rather than replace it.
Do I have to use Server Components?
Only if your framework supports them, such as Next.js with the App Router. They're opt-in and mix freely with client components, so you can adopt them gradually — server components for data and layout, client components for interactivity.