
The latest step in that evolution? React Server Components (RSC) — a powerful feature that enables server-driven rendering and a more efficient, server-centric architecture.
In this article, we’ll break down:
What React Server Components are
How they differ from Client Components
Why RSC is a game changer
What Server-Centric Architecture looks like
Best practices for building with RSC
When not to use them
1. The Problem with Client-Only Rendering
Before diving into RSC, let’s remember the challenges of the traditional React model:
Heavy JavaScript bundles
Everything — components, logic, state management — must be shipped to the browser.Slow initial load
The browser must download, parse, and execute the JS before rendering.Over-fetching data
Data fetching often happens after page load, causing waterfalls and delays.Duplicated logic
Server and client often have to handle similar logic separately.
These issues grow painful as apps scale — especially when performance and SEO matter.
2. What Are React Server Components?
React Server Components are components that render on the server but stream HTML and serialized component trees to the client, without sending their JavaScript.
Key properties:
Runs on server – Server Components execute entirely on the server ✅, while Client Components do not ❌.
Access to backend resources – Server Components can directly interact with databases, file systems, and secrets ✅, whereas Client Components cannot ❌.
Ships JavaScript to client – Server Components never send their JavaScript to the browser ❌, but Client Components always do ✅.
Can use browser APIs – Server Components cannot access browser-specific APIs like
window
ordocument
❌, while Client Components can ✅.Interactivity – Server Components are not interactive ❌ (unless they include nested Client Components), while Client Components are fully interactive ✅.
// MyServerComponent.server.tsx
export default async function MyServerComponent() {
const data = await getDataFromDB();
return <div>{data}</div>;
}
This component never runs in the browser. Instead:
The server fetches data.
The server sends the ready-to-render markup.
No JavaScript for this component is sent to the client.
3. How RSC Works Under the Hood
When React encounters a Server Component:
Server executes it → Can fetch data directly, access backend APIs, etc.
React serializes the output → Not HTML exactly, but a lightweight format representing the component tree.
Client receives & hydrates → The browser merges Server Components with interactive Client Components.
Think of it as:
Server Components = zero-JS, backend-powered UI
Client Components = interactive, browser-only UI
4. Why RSC Is a Game Changer
🔹 Smaller Bundles
Since Server Components never ship JavaScript to the client, bundle size drops dramatically.
🔹 Direct Backend Access
No need for REST/GraphQL just to render data — the server component can query the DB directly.
🔹 Streaming UI
Server Components support React’s streaming and Suspense, so parts of the UI can load progressively.
🔹 Less Duplication
Data fetching logic can live only on the server, avoiding the “double-fetch” problem.
5. Server-Centric Architecture
With RSC, we can move toward a server-centric model, where:
Most components are Server Components
Only leaf nodes that require interactivity are Client Components
Data fetching is colocated inside Server Components
Static + dynamic rendering are combined seamlessly
Example structure:
components/
Header.server.tsx
Footer.server.tsx
BlogList.server.tsx
BlogPost.client.tsx
pages/
blog/
page.server.tsx
Here, the server:
Fetches blog posts directly from DB in
BlogList.server.tsx
Sends static HTML for everything except interactive widgets
Hydrates only
BlogPost.client.tsx
for things like “Like” buttons
6. Best Practices for Building with RSC
✅ Default to Server Components — Make components server-only unless they need interactivity.
✅ Keep Client Components small — Isolate browser-dependent logic (e.g., modals, event handlers).
✅ Colocate data fetching — Fetch data inside Server Components, avoid extra APIs when possible.
✅ Use Suspense boundaries — To stream UI progressively for faster perceived load.
✅ Avoid server→client prop overfetching — Pass minimal props from server to client components.
7. When Not to Use RSC
❌ If the component heavily uses browser APIs (window
, localStorage
, DOM manipulation).
❌ If it needs frequent client-side updates without server round-trips.
❌ If it’s purely visual with no backend dependencies — client-side rendering might be faster.
8. RSC in the Wild
Next.js App Router — First major framework to integrate RSC deeply.
Remix (future) — Planning server-first approaches.
Shopify Hydrogen — Uses RSC for e-commerce performance.
9. The Future
React Server Components are not just another performance trick — they represent a paradigm shift toward server-centric architecture. This shift:
Minimizes client-side JS
Improves performance
Simplifies data fetching
Unifies backend and frontend in one React tree
As frameworks adopt RSC, the distinction between frontend and backend in React apps will blur, leading to a more seamless developer experience.
Final Thought:
The future React developer won’t ask “How can I load this on the client?” but instead “Does this even need to run in the browser?”.
With React Server Components, the answer will often be no — and that’s a beautiful thing.