React Server Components: 40% Faster Pages in Real Measurements

Web Görsel
What Are React Server Components?
RSC are a new React component type that render on the server and send their output to the client as an RSC payload. Unlike classic SSR, RSC components are never shipped to the client — only their render output. Client Components run on the client as before but require the explicit "use client" directive.
Server vs Client Component Decision Matrix
| Capability | Server | Client |
|---|---|---|
| DB / API fetch | ✅ | ❌ (via useEffect) |
| useState, useEffect | ❌ | ✅ |
| onClick, onChange | ❌ | ✅ |
| Secret env vars | ✅ | ❌ |
| Heavy library | ✅ (not shipped) | Careful |
| SEO content render | ✅ | (SSR) |
| Browser APIs | ❌ | ✅ |
Rule: Put Client Components at the Leaves
A "use client" directive applies to the component and all its children in that subtree. Correct structure: top-level layouts and pages as Server Components, leaf-level interactive parts as Client Components. Wrong: making the whole page.tsx "use client" — kills RSC benefits.
Data Fetching: Async Server Components
// app/products/page.tsx (Server)
async function Products() {
const products = await db.products.findMany();
return (
<div>
{products.map(p => <Product key={p.id} data={p} />)}
</div>
);
}
No more useEffect + fetch patterns. Less code, smaller bundle, faster LCP.
Caching Strategy (Next.js 15+)
- Static: Generated at build, served from CDN (default)
- Dynamic: Rendered per request on the server
- ISR: Regenerated after specified interval
- PPR (experimental): Partial prerendering combining static + dynamic
Real Measurements: E-commerce Case
After Next.js 12 (Pages) → Next.js 15 (App Router + RSC) migration:
| Metric | Before | After | Δ |
|---|---|---|---|
| Initial JS bundle | 480 KB | 160 KB | -66% |
| LCP (mobile) | 2.3 s | 1.34 s | -42% |
| TTFB | 320 ms | 260 ms | -18% |
| INP | 180 ms | 110 ms | -39% |
| Hydration | 240 ms | 90 ms | -62% |
Server Actions: Forms + Mutations
async function submit(formData: FormData) {
''use server'';
await db.messages.create({
name: formData.get(''name''),
msg: formData.get(''msg''),
});
revalidatePath(''/contact/thank-you'');
}
export default function Form() {
return <form action={submit}>...</form>;
}
No API route needed. Progressive enhancement — works without JS.
Streaming and Suspense
<Suspense fallback={<Skeleton />}>
<SlowComponent />
</Suspense>
Fast parts ship first, slow parts stream in. Big perceived-speed win.
Migration Strategy
- Upgrade Next.js to 13.4+ (App Router production ready)
- Pages and App routers can coexist — migrate page by page
- Move data fetching into Server Components
- Wrap interactive parts (auth, cart) in "use client" with providers
- Rebuild SEO with Metadata API
- Choose caching per page type
Common Pitfalls
- Trying to useState in a Server Component (errors)
- Marking the whole page.tsx as "use client" — disables RSC
- Third-party UI libs that are client-only (MUI, Chakra) forcing workarounds
- Using useEffect for cookies instead of async Server Components
- Over-using dynamic rendering — cache miss every request
- Passing secrets as props to Client Components (major leak)
Frequently Asked Questions
Is RSC production-safe?
Yes. Stable since Next.js 13.4 (June 2023). Thousands of enterprise projects in production in 2026.
SEO impact?
Positive. Rendered on the server so Googlebot sees content immediately, with less JS than classic SSR.
Can I stop using useEffect entirely?
No — browser APIs (scroll, resize, localStorage) still need it. But data fetching moves to Server Components.
Next Step
App Router + RSC migration — schedule a technical call.
Yorumlar (0)
Bu konuda yardima mi ihtiyaciniz var?
Ekibimiz, projenize en uygun cozumleri sunmak icin hazir.
Iletisime Gecin