React Server Components (RSC) sind die größte Veränderung in React seit Hooks. Sie ermöglichen serverseitiges Rendering ohne Client-JavaScript und revolutionieren Performance. Dieser Guide zeigt Ihnen, wie Sie sie richtig einsetzen.
Was Sind Server Components?
Server Components rendern ausschließlich auf dem Server und senden nur HTML zum Client. Kein JavaScript wird gebündelt oder zum Browser geschickt.
// Server Component (Standard in Next.js 15)
async function BlogPost({ id }) {
// Direkter Datenbankzugriff
const post = await db.posts.findOne({ id });
return (
<article>
<h1>{post.title}</h1>
<p>{post.content}</p>
</article>
);
}
// Kein 'use client' = Server Component
// Keine useState, useEffect, Event Handler
// Direkt async/await für Data FetchingServer vs Client Components: Entscheidungsframework
Server Component: Data Fetching, SEO-Content, statische UI
Client Component: Interaktivität, Browser APIs, React Hooks
Hybrid: Verschachteln Sie Client in Server für beste Performance
Die richtige Balance zwischen Server und Client Components ist entscheidend für Performance-Optimierung.
Data Fetching Patterns in RSC
Server Components ermöglichen direktes async/await ohne useEffect-Chaos:
// ❌ Alt: Client Component mit useEffect
'use client'
function Products() {
const [products, setProducts] = useState([]);
useEffect(() => {
fetch('/api/products')
.then(res => res.json())
.then(setProducts);
}, []);
return <ProductList products={products} />;
}
// ✅ Neu: Server Component mit async/await
async function Products() {
const products = await fetch('https://api.example.com/products');
const data = await products.json();
return <ProductList products={data} />;
}Streaming und Suspense für Bessere UX
Server Components kombiniert mit Suspense ermöglicht progressives Rendering:
import { Suspense } from 'react';
export default function Page() {
return (
<div>
<h1>Produkte</h1>
<Suspense fallback={<ProductsSkeleton />}>
<ProductList />
</Suspense>
</div>
);
}
// ProductList wird gestreamt sobald Daten bereit
async function ProductList() {
const products = await fetchProducts(); // Langsame API
return products.map(p => <ProductCard key={p.id} {...p} />);
}Composition Patterns: Client in Server verschachteln
Der Trick ist, Client Components sparsam einzusetzen und in Server Components zu verschachteln:
// Server Component (Parent)
async function ProductPage({ id }) {
const product = await fetchProduct(id);
return (
<div>
<ProductDetails product={product} /> {/* Server */}
<AddToCartButton productId={id} /> {/* Client */}
<Reviews productId={id} /> {/* Server */}
</div>
);
}
// Client Component (nur wo nötig)
'use client'
function AddToCartButton({ productId }) {
const [loading, setLoading] = useState(false);
return (
<button onClick={() => addToCart(productId)}>
Add to Cart
</button>
);
}Häufige Fehler und Wie Man Sie Vermeidet
'use client' zu oft verwenden - Komponenten sind Standard Server
Props von Server an Client ohne Serialisierung
Browser APIs in Server Components (z.B. localStorage)
Heavy Dependencies in Client Components importieren
Performance-Gewinne in Zahlen
In unserem Production SaaS mit Server Components:
JavaScript Bundle: -60% (von 250KB auf 100KB)
First Contentful Paint: -40% (von 2.1s auf 1.3s)
Time to Interactive: -55% (von 3.8s auf 1.7s)
Lighthouse Score: 73 → 96
Diese Performance-Verbesserungen wirken sich direkt auf SEO aus.
Integration mit SaaS-Architekturen
Server Components sind ideal für SaaS-Apps mit Multi-Tenancy. Sie können Tenant-Kontext serverseitig prüfen ohne Client-Code:
Fazit
React Server Components sind ein Paradigmenwechsel. Sie ermöglichen dramatische Performance-Verbesserungen, aber erfordern ein Umdenken. Nutzen Sie Server Components als Standard, Client Components nur bei Bedarf, und verschachteln Sie sie intelligent. Die Zukunft von React ist hybrid – Server und Client working together.
