React Server Components (RSC) haben die Art und Weise, wie wir React-Anwendungen erstellen, grundlegend verändert. Indem wir die Rendering-Logik auf den Server verlagern, können wir das an den Client gesendete JavaScript-Bundle erheblich reduzieren, was zu schnelleren Ladezeiten und besseren Benutzererfahrungen führt. In diesem Artikel werden wir fortgeschrittene Muster und Best Practices für die Nutzung von RSCs im Jahr 2026 untersuchen.
Was sind Server Components?
Traditionell wurden React-Komponenten vollständig auf dem Client (CSR) gerendert oder auf dem Server als HTML (SSR) vorgerendert und dann auf dem Client hydriert. Server Components ermöglichen es uns, Komponenten ausschließlich auf dem Server zu rendern. Ihr Code wird niemals an den Browser gesendet.
Die Vorteile
- Null Bundle-Größe: Abhängigkeiten, die in Server Components verwendet werden (wie Markdown-Parser oder schwere Datumsbibliotheken), bleiben auf dem Server.
- Direkter Backend-Zugriff: Sie können Ihre Datenbank direkt in Ihrer Komponente abfragen, ohne API-Endpunkte offenzulegen.
- Automatisches Code-Splitting: Client-Komponenten, die serverseitig importiert werden, werden automatisch code-gesplittet.
Datenabruf-Muster
Mit RSC können Sie Ihre Komponenten async machen und Daten direkt abwarten.
// app/users/page.tsx import { db } from '@/lib/db'; export default async function UsersPage() { const users = await db.user.findMany(); return ( <main> <h1>Benutzer</h1> <ul> {users.map((user) => ( <li key={user.id}>{user.name}</li> ))} </ul> </main> ); }
Suspense für Streaming
Da der Datenabruf langsam sein kann, wickeln Sie Ihre Komponenten in <Suspense> ein, um sofort eine Fallback-Benutzeroberfläche anzuzeigen, während die Daten geladen werden.
import { Suspense } from 'react'; import UserList from './UserList'; import LoadingSkeleton from './LoadingSkeleton'; export default function Page() { return ( <section> <h1>Meine Benutzer</h1> <Suspense fallback={<LoadingSkeleton />}> <UserList /> </Suspense> </section> ); }
Verschachtelung von Server und Client Components
Einer der verwirrendsten Aspekte ist die Kombination von Server- und Client-Komponenten.
Faustregel: Server Components können Client Components importieren. Client Components können Server Components nicht direkt importieren. Sie können jedoch eine Server Component als children an eine Client Component übergeben.
Das "Children"-Muster
// ClientComponent.tsx 'use client'; import { useState } from 'react'; export default function ClientWrapper({ children }) { const [count, setCount] = useState(0); return ( <div onClick={() => setCount((c) => c + 1)}> Zähler: {count} {children} {/* Das kann eine Server Component sein! */} </div> ); }
// ServerPage.tsx import ClientWrapper from './ClientWrapper'; import ServerContent from './ServerContent'; export default function Page() { return ( <ClientWrapper> <ServerContent /> {/* Das funktioniert perfekt */} </ClientWrapper> ); }
Häufige Fallstricke
- Context in Server Components verwenden: Context ist ein clientseitiges Konzept. Wenn Sie Daten serverseitig teilen müssen, übergeben Sie sie als Props oder verwenden Sie einen spezialisierten Request-Scope-Cache.
- Hinzufügen von Event-Handlern: Sie können
onClickoderonChangenicht zu einer Server Component hinzufügen. Diese Logik gehört in einen generischen Client Component-Blattknoten.
Fazit
React Server Components sind nicht nur ein Feature; sie sind ein Paradigmenwechsel. Indem Sie die Grenze zwischen Server und Client verstehen, können Sie Anwendungen erstellen, die sowohl hoch interaktiv als auch unglaublich schnell sind.