Technologie
React im Jahr 2026: Neue Primitive (Actions, Activity, useEffectEvent) und die Compiler-Ära
React 19 → 19.2 hat nicht nur Features ergänzt – es hat verändert, wie wir Apps strukturieren. Dieser Guide erklärt die Ideen hinter Actions, <Activity/>, useEffectEvent, Performance Tracks, SSR-Suspense-Batching, Partial Pre-rendering und React Compiler 1.0 – mit praktischen Architektur-Hinweisen und echten Quellen.

Was du aus diesem Artikel mitnimmst
Das ist kein Changelog-Dump. Es ist ein Mental Model: was sich geändert hat, warum es existiert und wie es Architektur beeinflusst.
• Das „Warum“ hinter Reacts neuen Primitiven (weniger Glue-Code, mehr offizielle Patterns). [1][2][3]
• Wann Actions, <Activity/> und useEffectEvent das richtige Werkzeug sind (und wann nicht). [1][2][6][8]
• Wie Performance Tracks Debugging und Performance-Diskussionen verändert. [2][5]
• Was React 19.2 beim SSR-Streaming mit Suspense (Batching) ändert. [2]
• Wie React Compiler 1.0 die Memoization-Story verändert (ohne Magie). [3]
• Eine Roadmap für Deep-Dives, die wir zu jedem Konzept veröffentlichen (mit echtem Code und Patterns). [1][2][3]
Der echte Shift: React macht aus „Folklore“-Patterns offizielle Primitive
React war früher ein bisschen wie LEGO ohne Anleitung: Du konntest alles bauen, aber jedes Team erfand seinen eigenen „richtigen Weg“ für Async-Mutations, State über Screens hinweg oder Effect-Dependency-Bugs.
React 19 und 19.2 fühlen sich anders an. Das Core-Team macht häufige Patterns zu Primitiven: Actions für Async-UI-State, <Activity/> für „verstecken, aber State behalten“, useEffectEvent zum Trennen von event-artiger Logik aus Effects und offizielle Performance Tracks, um Scheduling zu verstehen. [1][2][5]
Und dann gibt es React Compiler 1.0: eine große Wette, dass manuelle Memoization kein täglicher Job sein sollte. [3]
Actions: Async-UI-Flows sollen langweilig werden (im besten Sinne)
Wenn deine UI Mutations macht (Profil speichern, Checkout, Kommentar, Upload), hast du wahrscheinlich diese State-Machine schon oft gebaut: idle → pending → success/error → optimistic UI → rollback → toasts → redirects.
React 19s Actions-Ansatz will das mit Primitiven wie useActionState, <form action={...}> und useFormStatus standardisieren – und optimistische Updates mit useOptimistic weniger schmerzhaft machen. [1][8]
Ein kleines Beispiel, das die Form des Ansatzes zeigt:
import { useActionState } from "react";
type SaveState = { ok: true } | { ok: false; error: string };
async function saveDisplayName(
_prev: SaveState,
formData: FormData,
): Promise<SaveState> {
const name = String(formData.get("name") ?? "").trim();
if (name.length < 2) return { ok: false, error: "Name is too short." };
const res = await fetch("/api/profile/name", {
method: "POST",
body: JSON.stringify({ name }),
headers: { "content-type": "application/json" },
});
if (!res.ok) return { ok: false, error: "Failed to save." };
return { ok: true };
}
export function DisplayNameForm({ initialName }: { initialName: string }) {
const [state, action, isPending] = useActionState<SaveState, FormData>(
saveDisplayName,
{ ok: true },
);
return (
<form action={action} className="space-y-2">
<input name="name" defaultValue={initialName} />
<button type="submit" disabled={isPending}>
{isPending ? "Saving…" : "Save"}
</button>
{state.ok ? null : <p role="alert">{state.error}</p>}
</form>
);
}Architektur-Hinweis: Actions sind stark, wenn der Mutation-Flow UI-owned ist und du ein standardisiertes pending/result-Handshake willst – ohne eine weitere Abstraktionsschicht. Wenn du Caching, Retries, Offline-Queues oder Cross-Screen-Sync brauchst, ist ein Data-Layer (React Query, SWR, eigener Event Bus) oft sinnvoller. Actions reduziert Boilerplate an den Rändern – ersetzt aber keine systemweite Datenarchitektur. [1][8]
<Activity />: „verstecken“ wird ein First-Class-Konzept
Tab-UIs, Side Panels, Wizards und Multi-Step-Flows haben einen klassischen Trade-off:
- unmount wenn hidden → weniger Memory, aber State geht verloren und Subscriptions werden abgebaut
- mounted lassen → State bleibt, aber man bastelt sich „hidden but alive“-Patterns zusammen
React 19.2 führt <Activity mode="visible|hidden"> als Alternative zu conditional rendering ein. In 19.2 unterstützt es visible und hidden. [2]
Ein Mini-Beispiel für ein „keep alive“-Tab:
import { Activity } from "react";
export function SettingsTabs({ tab }: { tab: "profile" | "billing" }) {
return (
<div>
<Activity mode={tab === "profile" ? "visible" : "hidden"}>
<ProfileTab />
</Activity>
<Activity mode={tab === "billing" ? "visible" : "hidden"}>
<BillingTab />
</Activity>
</div>
);
}Architektur-Hinweis: Nutze <Activity/>, wenn du vorhersehbare State-Retention bei Visibility-Toggles willst (Tabs, Drawer, Navigation Shell). <Activity/> macht die Intention explizit; es stoppt nicht automatisch teure Timer/Subscriptions in hidden UI – du musst weiterhin planen, wo diese Arbeit lebt. [2]
useEffectEvent: nicht neu verbinden, nur weil sich das Theme ändert
Effects haben eine bekannte Spannung: Du willst korrekte Dependency Arrays, aber manchmal soll ein Handler trotzdem die neuesten Werte sehen, ohne dass der Effect neu läuft.
React 19.2s useEffectEvent formalisiert dieses Pattern. Im React-19.2-Post gibt es das Chat-Beispiel: Ein theme-Wechsel sollte die Verbindung nicht neu aufbauen, aber die Notification soll das neueste Theme nutzen. useEffectEvent trennt diese „event-like“-Logik aus dem Effect. [2][6]
Ein praktisches Beispiel (Analytics/Logging), das linter-freundlich bleibt:
import { useEffect, useEffectEvent } from "react";
type Props = { userId: string; plan: "free" | "pro" };
declare function subscribeToBillingEvents(
userId: string,
onEvent: (name: string) => void,
): () => void;
declare function track(event: string, props: Record<string, string>): void;
export function BillingWatcher({ userId, plan }: Props) {
const onBillingEvent = useEffectEvent((name: string) => {
track("billing_event", { name, plan });
});
useEffect(() => {
return subscribeToBillingEvents(userId, (name) => onBillingEvent(name));
}, [userId]);
return null;
}Architektur-Hinweis: useEffectEvent ist ein großer Gewinn, wenn du heute den Hooks-Linter deaktivierst, nur um Effect-Re-Runs zu vermeiden. Aber nicht alles einwickeln: React warnt explizit davor, es nur zum „Linter ruhigstellen“ zu verwenden. Nutze es, wenn die Logik konzeptionell ein Event ist – nicht Teil des reaktiven „System synchronisieren“-Effects. [2][6]
Performance Tracks: React-Scheduling wird sichtbar (und debuggbar)
Früher war Performance-Debugging oft Rätselraten: „Warum fühlt sich dieses Update langsam an?“. Performance Tracks zeigt Reacts Arbeit klar in der Timeline.
Performance Tracks machen Apps nicht magisch schneller. Sie machen Performance-Arbeit ehrlicher: weniger „Vibes“, mehr Beweise. [5]
Warum das zählt
Statt „React ist langsam“ siehst du, was React wann getan hat – besonders rund um Interaktionen und Scheduling. [5]
Wo es am meisten hilft
Ideal für langsame Klicks, Input-Lag, Suspense-Reveals und lange Commits, weil die Arbeit in der Timeline beschriftet ist. [5]
Performance Tracks in Aktion: React-Arbeit erscheint als eigene Tracks in der Performance-Timeline. [2][5]
Section performance-tracks screenshotÜbersicht: Timeline trennt Scheduler, Components und wichtige Phasen (blocking, transitions, suspense). [5]
Section performance-tracks screenshotScheduler-Track: Timing von Events sowie Phasen wie update, render, commit und waiting for paint. [5]
Section performance-tracks screenshotClose-up: hilfreich, um zu sehen, welche Phase eine langsame Interaktion dominiert. [5]
Section performance-tracks screenshotReact 19.2 SSR: gebatchte Suspense-Reveals reduzieren „progressives Chaos“
React 19.2 ändert, wie servergerenderte Suspense-Boundaries revealen: Boundaries, die gleichzeitig fertig werden, können zusammen gebatcht werden. Ziel: SSR-Streaming näher an Client-Verhalten bringen und awkward progressive Reveals reduzieren. [2]
Gutes Beispiel für Reacts 2026-Richtung: Reveals vorhersehbarer machen – weniger abhängig von Timing-Zufällen. [2]
Effekt für Nutzer
Weniger „eins poppt auf, dann das nächste, dann das nächste“, wenn Boundaries gleichzeitig fertig werden. [2]
Effekt für Devs
SSR-Streaming wird client-näher, was Mental Models und Debugging vereinfacht. [2]
Architektur-Hinweis
Suspense-Boundaries sind Teil der UX. Gruppiere, was zusammen erscheinen soll, trenne, was später kommen darf. [2]
React Compiler 1.0: Memoization wandert vom Code Review ins Build-Time
React Compiler 1.0 ist stabil und produktionsreif. Ein Build-Time-Tool, das Components und Hooks durch automatische Memoization optimiert – plus compiler-gestützte Lint Rules via eslint-plugin-react-hooks Presets. [3]
Die Idee ist nicht „React ist langsam ohne Compiler“. Sondern: manuelle Memoization ist fehleranfällig, inkonsistent zwischen Teams und endet oft als Cargo-Cult useMemo/useCallback überall.
React empfiehlt pragmatisch: dem Compiler standardmäßig vertrauen, useMemo/useCallback als Escape Hatches behalten, wenn präzise Kontrolle nötig ist (oft bei Effect Dependencies). Und: vor dem Entfernen bestehender Memoization sorgfältig testen, weil sich Compiler-Output ändern kann. [3]
Ein kleines Beispiel, was sich architektonisch ändert (weniger Hand-Optimierung):
type Props = { items: Array<{ id: string; price: number }>; taxRate: number };
declare function expensiveTotal(items: Props["items"], taxRate: number): number;
declare function CheckoutSummary(props: { total: number }): JSX.Element;
export function Cart({ items, taxRate }: Props) {
const total = expensiveTotal(items, taxRate);
return <CheckoutSummary total={total} />;
}Mit Compiler kannst du Code oft deklarativ lassen und Tooling entscheiden lassen, was sicher memoisiert werden kann – solange du die Rules of React einhältst und sauber testest. [3]
Partial Pre-rendering: neuer Hebel für „statische Shell + dynamisches Füllen“
Partial Pre-rendering (React DOM, 19.2) bedeutet: statische Teile vorab prerendern (CDN-friendly) und später „resume“, um dynamische Inhalte zu füllen. Der React-19.2-Post zeigt den Flow prerender() → postponed state speichern → resume(). [2]
Architektur-Hinweis: Für content-heavy Sites, bei denen die Shell meist statisch ist, aber Personalisierung/Daten dynamisch sind, ist PPR spannend. Der Trade-off ist operativ: Das ist nicht „nur React“, sondern eine Rendering-Pipeline und eine Framework/Bundler-Integrationsentscheidung. [2]
React Server Components: stabil, aber betrachte das Ökosystem als System
React Server Components (RSC) sind auf React-Ebene in React 19 stabil, aber die Docs warnen explizit: die darunterliegenden APIs, die Bundler/Frameworks nutzen, können zwischen React-19.x-Minors brechen und folgen nicht SemVer. Für Implementer wird empfohlen, auf eine konkrete React-Version zu pinnen oder Canary zu nutzen. [4]
Außerdem: Security Advisories ernst nehmen. Das React Team hat RSC-Schwachstellen in react-server-dom-* publiziert und Upgrades auf gefixte Versionen empfohlen. [7]
Architektur-Hinweis: Wenn du RSC nutzt, behandle React-Version, Framework/Bundler-Integration und react-server-dom-* Packages als eine Upgrade-Einheit – mit echter Patch-Disziplin.
Serien-Roadmap: nächste Deep Dives (mit echtem Code und Patterns)
Dieser Post ist der Überblick. Danach gehen wir tief – Konzept für Konzept – mit realen Beispielen und Architektur-Trade-offs.
• Actions in echten Apps: Forms, optimistic UI, Error Shaping und Integration mit React Query/SWR. [1][8]
• <Activity/> in der Praxis: Tab Shells, Drawer, route-ähnliche Patterns und Hidden-Subtree-Leaks vermeiden. [2]
• useEffectEvent-Patterns: Analytics, Subscriptions, Real-time Sockets und linter-freundliches Effect-Design. [2][6]
• Performance-Tracks-Playbook: worauf achten, typische Muster, Phasen in echten Apps interpretieren. [5]
• SSR-Suspense-Boundary-Design: Batching-Implikationen und Boundaries für saubere Reveals. [2]
• React-Compiler-Adoption: inkrementeller Rollout, Teststrategie und wann manuelle Memoization bleibt. [3]
• Partial-Pre-rendering-Architektur: was prerendern, wo resume, CDN/Edge-Implikationen. [2]
• RSC-Hardening-Checklist: Pinning, Patch-Cadence und Advisory-Response-Playbooks. [4][7]
Quellen
Wir nutzen nur Quellen, die Aussagen und Beispiele in diesem Artikel direkt stützen.
• 1. React v19 (offiziell): Actions, useActionState, <form> Actions, useFormStatus, useOptimistic Quelle lesen ↗
• 2. React 19.2 (offiziell): <Activity/>, useEffectEvent, Performance Tracks, SSR Batching, Partial Pre-rendering Quelle lesen ↗
• 3. React Compiler v1.0 (offiziell): stabile Release, automatische Memoization, Lint Rules, inkrementelle Adoption Quelle lesen ↗
• 4. Server-Components-Referenz (offiziell): Stabilität + Warnung zu Bundler/Framework APIs; Pinning Guidance Quelle lesen ↗
• 5. React Performance Tracks (offiziell): Was gezeigt wird und wie man Profiling/Dev Builds nutzt Quelle lesen ↗
• 6. Separating Events from Effects (offiziell): Mental Model hinter useEffectEvent Quelle lesen ↗
• 7. RSC Security Advisory (offiziell): DoS und Source Code Exposure; Upgrade Guidance Quelle lesen ↗
• 8. useActionState Reference (offiziell): API-Definition und Usage Details Quelle lesen ↗
FAQ
Wenn du bereits auf React 19 bist, ist 19.2 ein sinnvolles Upgrade wegen neuer Primitive und DevTools-Verbesserungen. Wenn du React Server Components nutzt, beachte außerdem die Security Advisories des React Teams und stelle sicher, dass betroffene Packages auf gefixte Versionen aktualisiert sind. [2][7]
Nein. Actions reduziert UI-seitiges Boilerplate für Mutations und Forms. Data Libraries bleiben stark für Caching, Retries, Background Refresh, Offline-Verhalten und Cross-Screen-Konsistenz. In vielen Apps kombinierst du beides bewusst. [1][8]
Es hilft, Effect-Dependencies korrekt zu halten, ohne Effects neu zu starten, nur weil ein Handler die neuesten Werte braucht. Besonders nützlich, wenn du heute den Hooks-Linter deaktivierst, um Re-Runs zu vermeiden. [2][6]
Konzeptionell ja, aber wichtig ist: die Intention wird explizit und React bekommt ein passendes Primitive für „hidden but alive“-UI. Das hilft Architektur und ermöglicht zukünftige Scheduling/Prioritization-Verbesserungen. [2]
Nicht automatisch. React empfiehlt: dem Compiler standardmäßig vertrauen, Memo Hooks als Escape Hatches behalten, wenn präzise Kontrolle nötig ist (oft bei Effect Dependencies). Und sorgfältig testen, bevor du bestehende Memoization entfernst. [3]
RSC ist auf React-Ebene in React 19 stabil, aber die Ecosystem-Integration (Bundler/Framework) ist eine Systemfrage. Befolge Pinning-Guidance, wo relevant, und tracke Security Advisories für `react-server-dom-*`. [4][7]
Upgrade ohne Regressionen? Wir können helfen.
Reacts neue Primitive sind stark – aber sichere Adoption braucht Engineering-Hygiene: Tests, Linting und einen klaren Architekturplan.
Wenn du ein React-Upgrade planst (oder Compiler/Actions/RSC ohne Production-Breaks einführen willst), kann PAS7 Studio mit einem Audit-first Ansatz und einer Rollout-Strategie für deinen Stack helfen.