React Server Components (RSC) hebben fundamenteel veranderd hoe we React-applicaties bouwen. Door rendering-logica naar de server te verplaatsen, kunnen we de JavaScript-bundel die naar de client wordt gestuurd aanzienlijk verkleinen, wat leidt tot snellere laadtijden en betere gebruikerservaringen. In dit artikel verkennen we geavanceerde patronen en best practices voor het benutten van RSC's in 2026.
Wat zijn Server Components?
Traditioneel werden React-componenten volledig op de client gerenderd (CSR) of voorgerenderd op de server als HTML (SSR) en vervolgens gehydrateerd op de client. Server Components stellen ons in staat om componenten uitsluitend op de server te renderen. Hun code wordt nooit naar de browser gestuurd.
De Voordelen
- Nul Bundelgrootte: Afhankelijkheden gebruikt in Server Components (zoals markdown-parsers of zware datumbibliotheken) blijven op de server.
- Directe Backend Toegang: Je kunt je database direct in je component opvragen zonder API-endpoints te ontsluiten.
- Automatische Code Splitting: Client-componenten die server-side worden geïmporteerd, worden automatisch gesplit.
Data Fetching Patroon
Met RSC kun je je componenten async maken en data direct awaiten.
// app/users/page.tsx import { db } from '@/lib/db'; export default async function UsersPage() { const users = await db.user.findMany(); return ( <main> <h1>Users</h1> <ul> {users.map((user) => ( <li key={user.id}>{user.name}</li> ))} </ul> </main> ); }
Suspense voor Streaming
Omdat data fetching langzaam kan zijn, wikkel je componenten in <Suspense> om direct een fallback UI te tonen terwijl de data laadt.
import { Suspense } from 'react'; import UserList from './UserList'; import LoadingSkeleton from './LoadingSkeleton'; export default function Page() { return ( <section> <h1>My Users</h1> <Suspense fallback={<LoadingSkeleton />}> <UserList /> </Suspense> </section> ); }
Server en Client Components Combineren
Een van de meest verwarrende aspecten is hoe je Server en Client componenten combineert.
Vuistregel: Server Components kunnen Client Components importeren. Client Components kunnen Server Components niet direct importeren. Je kunt echter een Server Component als children doorgeven aan een Client Component.
Het "Children" Patroon
// 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)}> Count: {count} {children} {/* This can be a Server Component! */} </div> ); }
// ServerPage.tsx import ClientWrapper from './ClientWrapper'; import ServerContent from './ServerContent'; export default function Page() { return ( <ClientWrapper> <ServerContent /> {/* This works perfectly */} </ClientWrapper> ); }
Veelvoorkomende Valkuilen
- Context gebruiken in Server Components: Context is een client-side concept. Als je data server-side wilt delen, geef het door als props of gebruik een gespecialiseerde request-scope cache.
- Event Handlers toevoegen: Je kunt geen
onClickofonChangeaan een Server Component toevoegen. Die logica hoort in een generiek Client Component leaf node.
Conclusie
React Server Components zijn niet zomaar een functie; ze zijn een paradigmaverschuiving. Door de grens tussen server en client te begrijpen, kun je applicaties bouwen die zowel sterk interactief als ongelooflijk snel zijn.