# React 19 Suspense und Concurrent Rendering: Streaming SSR und Interview-Fragen 2026 > Umfassender Leitfaden zu React 19 Suspense, Concurrent Rendering und Streaming SSR. Enthält praktische Codebeispiele und häufige Interview-Fragen für 2026. - Published: 2026-08-21 - Updated: 2026-08-21 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- React 19 hat die Art und Weise, wie moderne Webanwendungen gebaut werden, grundlegend verändert. Mit der stabilen Veröffentlichung von Suspense für Data Fetching und den Verbesserungen im Concurrent Rendering können Entwickler nun reaktive Benutzeroberflächen erstellen, die schneller laden und flüssiger reagieren. Streaming SSR ermöglicht es, HTML-Fragmente progressiv an den Browser zu senden, noch bevor alle Daten verfügbar sind. Dieser Artikel behandelt die Kernkonzepte, praktische Implementierungen und die häufigsten Interview-Fragen zu diesen Themen im Jahr 2026. > **Suspense ist mehr als nur ein Loading-Indikator** > > Während viele Entwickler Suspense nur als Wrapper für Fallback-UIs kennen, liegt seine wahre Stärke in der Koordination von asynchronen Operationen. React kann damit priorisieren, welche Teile der UI zuerst gerendert werden sollen, und ermöglicht so eine optimale User Experience selbst bei langsamen Netzwerkverbindungen. In Kombination mit Server Components wird Suspense zum zentralen Baustein moderner React-Architekturen. ## Grundlagen von React Suspense in Version 19 Suspense ermöglicht es React-Komponenten, auf asynchrone Operationen zu "warten", ohne komplexe State-Management-Logik zu implementieren. Das Konzept basiert auf dem Prinzip, dass Komponenten während des Ladens eine Promise "werfen" können, die React abfängt und einen Fallback anzeigt. Die grundlegende Verwendung von Suspense hat sich seit React 18 stabilisiert, aber React 19 bringt wichtige Verbesserungen. Die Integration mit Server Components ist nun nahtlos, und die neue `use`-Hook ermöglicht direktes Promise-Handling innerhalb von Komponenten. ```tsx import { Suspense, use } from 'react'; interface User { id: string; name: string; email: string; } function UserProfile({ userPromise }: { userPromise: Promise }) { const user = use(userPromise); return (

{user.name}

{user.email}

); } function UserProfileSkeleton() { return (
); } export default function ProfilePage() { const userPromise = fetchUser('123'); return ( }> ); } ``` Der entscheidende Unterschied zu herkömmlichem State-basiertem Data Fetching liegt in der Deklarativität. Die Komponente beschreibt nur, was sie benötigt, nicht wie die Daten geladen werden sollen. React übernimmt die Koordination des Ladevorgangs. ## Concurrent Rendering und seine Auswirkungen Concurrent Rendering ist keine einzelne Feature, sondern ein fundamentaler Wandel in der Art, wie React Rendering-Arbeit priorisiert und unterbricht. Traditionell blockierte ein Rendering-Vorgang den Main Thread, bis er abgeschlossen war. Mit Concurrent Rendering kann React Rendering-Arbeit pausieren, um dringendere Updates wie Benutzerinteraktionen zu verarbeiten. Die praktischen Auswirkungen zeigen sich besonders bei komplexen UIs. Wenn ein Benutzer während eines aufwändigen Rendervorgangs tippt, kann React die Tastatureingabe priorisieren und das ursprüngliche Rendering später fortsetzen. ```tsx import { useState, useTransition, useDeferredValue } from 'react'; function SearchResults({ query }: { query: string }) { // Expensive computation or data fetching const results = searchDatabase(query); return (
    {results.map(result => (
  • {result.title}
  • ))}
); } export function SearchPage() { const [query, setQuery] = useState(''); const [isPending, startTransition] = useTransition(); const deferredQuery = useDeferredValue(query); const handleSearch = (e: React.ChangeEvent) => { const value = e.target.value; setQuery(value); // Immediate update for input startTransition(() => { // Deferred update for expensive rendering }); }; return (
Lädt Ergebnisse...
}>
); } ``` Die Kombination von `useTransition` und `useDeferredValue` ermöglicht eine feinkörnige Kontrolle über Rendering-Prioritäten. `useTransition` markiert State-Updates als nicht-dringend, während `useDeferredValue` einen verzögerten Wert liefert, der bei hoher Auslastung hinterherhinkt. ## Streaming SSR mit React Server Components Streaming SSR revolutioniert die Server-seitige Renderingzeit. Anstatt auf alle Daten zu warten und dann eine vollständige HTML-Seite zu senden, beginnt React sofort mit dem Streaming von HTML-Fragmenten. Sobald ein Suspense-Boundary aufgelöst wird, sendet der Server das entsprechende HTML nach. In Next.js 16 mit App Router ist Streaming SSR standardmäßig aktiviert. Jede Server Component, die in einem Suspense-Boundary eingeschlossen ist, wird automatisch gestreamt. ```tsx // app/dashboard/page.tsx import { Suspense } from 'react'; async function RevenueChart() { const data = await fetchRevenueData(); // 2 Sekunden return (

Umsatz

); } async function RecentOrders() { const orders = await fetchRecentOrders(); // 500ms return (

Letzte Bestellungen

); } export default function DashboardPage() { return (
}> }>
); } ``` Der Browser empfängt zuerst das Layout-HTML mit beiden Skeletons. Sobald `RecentOrders` bereit ist (nach 500ms), streamt der Server das HTML und ein Script, das den Skeleton ersetzt. `RevenueChart` folgt nach 2 Sekunden. Der Time To First Byte (TTFB) verbessert sich dramatisch, da der Server sofort mit dem Senden beginnt. ## Fehlerbehandlung mit Error Boundaries Suspense und Error Boundaries arbeiten zusammen, um sowohl Lade- als auch Fehlerzustände deklarativ zu handhaben. In React 19 können Error Boundaries auch asynchrone Fehler abfangen, die während des Server-Renderings auftreten. ```tsx 'use client'; import { Component, ReactNode } from 'react'; interface Props { children: ReactNode; fallback: ReactNode; } interface State { hasError: boolean; error: Error | null; } export class AsyncErrorBoundary extends Component { constructor(props: Props) { super(props); this.state = { hasError: false, error: null }; } static getDerivedStateFromError(error: Error): State { return { hasError: true, error }; } render() { if (this.state.hasError) { return this.props.fallback; } return this.props.children; } } // Verwendung mit Suspense function DataSection() { return (

Fehler beim Laden der Daten

} > }> ); } ``` Die Hierarchie ist wichtig: Error Boundaries sollten Suspense-Boundaries umschließen, damit Fehler beim Data Fetching korrekt abgefangen werden. Andernfalls könnte ein Fehler die gesamte Seite zum Absturz bringen. ## Optimierungsmuster für Production In Produktionsumgebungen erfordern Suspense und Streaming SSR sorgfältige Optimierung. Zu viele Suspense-Boundaries können zu einem "Popcorn-Effekt" führen, bei dem Inhalte unkoordiniert einblenden. Zu wenige bedeuten längere Wartezeiten. ```tsx // Optimierte Struktur mit strategischen Boundaries export default function ProductPage({ productId }: { productId: string }) { return (
{/* Kritischer Content - wird sofort gestreamt */} }> {/* Sekundärer Content - gruppiert in einem Boundary */} }> {/* Tertiärer Content - kann verzögert laden */} }>
); } ``` Prefetching spielt eine kritische Rolle bei der Performance. Mit React Server Components können Daten bereits geladen werden, bevor der Benutzer navigiert. ```tsx import { prefetch } from 'react-router'; import Link from 'next/link'; function ProductCard({ product }: { product: Product }) { const handleMouseEnter = () => { // Prefetch beim Hover prefetch(`/products/${product.id}`); }; return ( {product.name}

{product.name}

{product.price}

); } ``` ## Häufige Interview-Fragen zu Suspense und Concurrent Rendering Technische Interviews im Jahr 2026 prüfen regelmäßig das Verständnis dieser Konzepte. Hier sind die wichtigsten Fragen und Antworten. **Frage: Was ist der Unterschied zwischen useTransition und useDeferredValue?** `useTransition` wird verwendet, um State-Updates als nicht-dringend zu markieren. Es gibt ein `isPending`-Flag zurück und eine `startTransition`-Funktion. `useDeferredValue` hingegen nimmt einen Wert entgegen und gibt eine verzögerte Version zurück, die bei hoher Rendering-Last hinterherhinken kann. `useTransition` ist für eigene State-Updates, `useDeferredValue` für Props oder Werte von außen. **Frage: Wie funktioniert Streaming SSR technisch?** Streaming SSR nutzt HTTP Transfer-Encoding: chunked. Der Server sendet zuerst das HTML-Gerüst mit Suspense-Fallbacks. Wenn eine Komponente bereit ist, sendet der Server ein HTML-Fragment zusammen mit einem inline `