Skip to content

Kapitel 6: Server & Client Components

📖 Lernziele

In diesem Kapitel lernen Sie:

  • ✅ Was Server Components sind und warum sie nützlich sind
  • ✅ Was Client Components sind und wann man sie verwendet
  • ✅ Die wichtigsten Unterschiede zwischen beiden
  • ✅ Die 'use client' Directive korrekt zu verwenden
  • ✅ Wann welcher Komponenten-Typ geeignet ist
  • ✅ Daten zwischen Server und Client Components zu übergeben

6.1 Was sind Server Components?

🎯 Kernkonzept

Server Components (RSC) werden auf dem Server gerendert und als HTML an den Browser gesendet.

📝 Standardverhalten (Next.js 14)

Jede Komponente in app/ ist standardmäßig eine Server Component:

jsx
// app/page.js (Server Component - Standard!)
export default function HomePage() {
  // Dieser Code läuft NUR auf dem Server
  const data = await fetchDataFromDatabase();
  
  return <h1>{data.title}</h1>;
}

✅ Vorteile von Server Components

VorteilErklärung
Kleinere Bundle-GrößeKein JavaScript wird an den Browser gesendet
Direkter DatenbankzugriffKeine API-Schicht nötig
Bessere SEOHTML wird vollständig auf dem Server generiert
SicherheitSensible Daten bleiben auf dem Server

6.2 Was sind Client Components?

🎯 Kernkonzept

Client Components werden im Browser gerendert und ermöglichen Interaktivität.

📝 Aktivierung ('use client' Directive)

jsx
// components/Counter.js (Client Component)
'use client'; // ⚠️ WICHTIG: Muss am Anfang stehen!

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <button onClick={() => setCount(count + 1)}>
      Geklickt: {count} mal
    </button>
  );
}

✅ Wann Client Components nötig sind

FeatureBenötigt Client Component?
useState, useEffect Hooks✅ Ja
Event Handler (onClick, onChange)✅ Ja
Browser-APIs (localStorage, window)✅ Ja
Datenabfrage mit useEffect✅ Ja

6.3 Unterschiede im Detail

📊 Vergleichstabelle

AspektServer ComponentClient Component
RenderingServerBrowser
Interaktivität❌ Keine✅ Ja (Hooks, Events)
Datenbankzugriff✅ Direkt❌ Nur über API
Bundle-Größe0 KBGrößer (enthält JS)
DirectiveKeine'use client'
Browser-APIs❌ Nicht verfügbar✅ Verfügbar

🎬 Beispiel: Kombination beider Typen

Server Component (app/page.js):

jsx
// Server Component (Standard)
import Counter from '@/components/Counter';

export default async function HomePage() {
  // Datenbankabfrage auf dem Server
  const posts = await getPostsFromDB();
  
  return (
    <main>
      <h1>Willkommen!</h1>
      
      {/* Client Component für Interaktivität */}
      <Counter />
      
      {/* Server Component für Datenanzeige */}
      <ul>
        {posts.map(post => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
    </main>
  );
}

Client Component (components/Counter.js):

jsx
'use client';

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <button onClick={() => setCount(count + 1)}>
      Klicks: {count}
    </button>
  );
}

6.4 'use client' Directive Regeln

⚠️ Wichtige Regeln

RegelErklärung
PositionMuss ganz oben in der Datei stehen
VererbungAlle importierten Child-Komponenten werden ebenfalls zu Client Components
Nicht umkehrbarEine Client Component kann nicht zu einer Server Component werden

✅ Richtig:

jsx
'use client'; // ✅ Ganz oben

import { useState } from 'react';

export default function MyComponent() {
  // ...
}

❌ Falsch:

jsx
import { useState } from 'react';

'use client'; // ❌ Falsch! Muss ganz oben stehen

export default function MyComponent() {
  // ...
}

6.5 Wann welchen Typ verwenden?

🎯 Entscheidungshilfe

Verwenden Sie eine Server Component, wenn:

  • ✅ Sie Daten direkt aus einer Datenbank abfragen
  • ✅ Keine Interaktivität nötig ist (reine Anzeige)
  • ✅ Die Komponente eine kleine Bundle-Größe haben soll
  • ✅ SEO wichtig ist

Verwenden Sie eine Client Component, wenn:

  • ✅ Sie Hooks verwenden (useState, useEffect)
  • ✅ Sie Event-Handler benötigen (onClick, onSubmit)
  • ✅ Sie Browser-APIs verwenden (localStorage, geolocation)
  • ✅ Sie Zustand (State) verwalten müssen

📝 Empfohlene Strategie (Next.js 14)

1. Standardmäßig Server Component verwenden
2. Nur bei Bedarf zu Client Component wechseln ('use client')
3. Interaktive Teile in eigene Client Components auslagern

6.6 Datenübergabe (Server → Client)

🎯 Daten von Server an Client übergeben

Server Component:

jsx
// app/page.js (Server Component)
import Counter from '@/components/Counter';

export default async function HomePage() {
  const initialCount = 10; // Daten vom Server
  
  return (
    <Counter startWert={initialCount} />
  );
}

Client Component:

jsx
// components/Counter.js (Client Component)
'use client';

import { useState } from 'react';

export default function Counter({ startWert }) {
  const [count, setCount] = useState(startWert); // Server-Daten verwenden
  
  return (
    <button onClick={() => setCount(count + 1)}>
      Klicks: {count}
    </button>
  );
}

⚠️ Wichtig: Nur serialisierbare Daten!

jsx
// ✅ Funktioniert (serialisierbar)
<ClientComponent daten={{ name: 'Max', alter: 25 }} />

// ❌ Funktioniert nicht (nicht serialisierbar)
<ClientComponent daten={{ funktion: () => console.log('Hi') }} />

📝 Zusammenfassung

In diesem Kapitel haben Sie gelernt:

KonzeptErklärung
Server ComponentsAuf dem Server gerendert, keine Interaktivität, kleine Bundle-Größe
Client ComponentsIm Browser gerendert, interaktiv, benötigt 'use client'
UnterschiedeRendering-Ort, Interaktivität, Bundle-Größe, Datenbankzugriff
EntscheidungshilfeServer zuerst, Client nur bei Bedarf
DatenübergabeÜber Props (nur serialisierbare Daten)

✅ Nächste Schritte

  1. Übung: Erstellen Sie eine Server Component, die Daten aus einer API lädt
  2. Übung: Erstellen Sie eine Client Component mit useState
  3. Weiter geht's: Kapitel 7 - Datenabfrage (Data Fetching)

🎯 Selbsttest

Frage 1: Was ist der Standard-Typ einer Komponente in Next.js 14 (App Router)?

Antwort anzeigen Server Component (keine `'use client'` Directive nötig).

Frage 2: Wann müssen Sie 'use client' verwenden?

Antwort anzeigen Wenn Sie Hooks (`useState`, `useEffect`) oder Event-Handler (`onClick`) verwenden möchten.

Frage 3: Können Server Components direkt auf eine Datenbank zugreifen?

Antwort anzeigen Ja, das ist einer der Hauptvorteile von Server Components.

🚀 Weiter zu Kapitel 7: Datenabfrage

Frei für alle Anfänger