Rendering-Strategien: SSR, SSG, ISR und Client-Rendering im Vergleich
Kurz: Eine Webseite kann beim Build (SSG), bei jeder Anfrage (SSR), zeitweise neu (ISR) oder im Browser (CSR) erzeugt werden; die Wahl beeinflusst Tempo, Aktualität, Kosten und Suchmaschinen-Tauglichkeit.
Genauer: Die Frage ist: Wann und wo entsteht das HTML? Frameworks wie Next.js erlauben, das je Seite zu wählen.
Im Detail
Die Strategien
- SSG (Static Site Generation): HTML wird beim Build erzeugt und über ein CDN ausgeliefert. Sehr schnell, billig, sicher; aber nur so aktuell wie der letzte Build. Ideal für Blog, Doku, Wiki, Landingpages.
- SSR (Server-Side Rendering): Der Server erzeugt das HTML bei jeder Anfrage; immer aktuell und personalisierbar (Cookies), aber langsamer und teurer (Rechenzeit, ggf. Datenbank).
- ISR (Incremental Static Regeneration): statische Seite mit Ablaufzeit (
revalidate: 3600); nach Ablauf wird im Hintergrund neu gebaut. Guter Kompromiss für Listen, Shops, Nachrichten. - CSR (Client-Side Rendering): Der Browser lädt JavaScript und baut die Seite; gut für Dashboards hinter Login, schlechter für Erstladezeit und SEO.
- Streaming/Suspense: Seite wird in Teilen ausgeliefert; Wichtiges erscheint zuerst.
Entscheidungshilfe
| Anforderung | Wahl |
|---|---|
| Selten ändernde Inhalte, viel Traffic | SSG |
| Inhalte ändern sich minütlich/stündlich | ISR |
| Pro Nutzer unterschiedlich (Warenkorb, Profil) | SSR oder CSR |
| Hinter Login, interaktiv | CSR (oder SSR + Client-Komponenten) |
| SEO wichtig | SSG/ISR/SSR |
| Mischformen sind normal: Statische Hülle, dynamische Teile per Streaming oder Client-Abfrage. |
Auswirkungen
- Datenbank-Last: SSR/ISR fragen sie ab; mit Caching (siehe unstable_cache, Revalidate) und langen Ablaufzeiten sinkt die Last stark, besonders bei serverlosen Datenbanken, die bei Ruhe pausieren und Rechenzeit berechnen.
- Kosten und Tempo: CDN-Auslieferung statischer Seiten ist am günstigsten.
- Ausfallsicherheit: Statische Seiten laufen weiter, selbst wenn die Datenbank nicht erreichbar ist; Builds dürfen deshalb nicht von der Datenbank abhängen oder müssen Fehler abfangen.
- Aktualität: Mit On-Demand-Revalidate (Tags/Pfade) lässt sich nach Änderungen gezielt neu bauen.
Praxis
Beginne statisch, füge Dynamik dort hinzu, wo sie nötig ist. Messe mit Lighthouse/Core Web Vitals (LCP, CLS, INP). Setze Cache-Header passend. Teste das Verhalten bei Datenbank-Ausfall und kalten Starts. In Next.js: export const revalidate = 3600, dynamic = 'force-dynamic', generateStaticParams, Server Components mit fetch und Cache-Optionen (Details der jeweiligen Version in der Doku prüfen, die API ändert sich).
Siehe auch: Next.js App Router, Caching-Strategien, Cache-Tags und revalidateTag, Lighthouse und Core Web Vitals, Serverless