Back

Reaktivitätsmodelle im Vergleich: React, Vue, Angular, Svelte

Reaktivitätsmodelle im Vergleich: React, Vue, Angular, Svelte

Wenn Sie mit mehreren JavaScript-Frameworks gearbeitet haben, ist Ihnen aufgefallen, dass sie State und UI-Updates sehr unterschiedlich handhaben. Das mentale Modell hinter jedem Ansatz prägt, wie Sie Komponenten strukturieren, Side Effects verwalten und über Performance nachdenken. Hier ist eine klare Aufschlüsselung, wie React, Vue, Angular und Svelte aktuell über Reaktivität denken.

Wichtigste Erkenntnisse

  • Reaktivität ist der Mechanismus, der Ihre UI mit dem Anwendungs-State synchron hält — Frameworks unterscheiden sich darin, wie granular diese Synchronisation ist.
  • React verwendet grobkörnige Reaktivität (erneutes Ausführen von Komponentenfunktionen und Diffing eines virtuellen DOM), während Vue, Angular Signals und Svelte 5 feinkörnige Ansätze verwenden, die Abhängigkeiten direkt verfolgen.
  • Der React Compiler in React 19 verringert den Performance-Unterschied durch automatisierte Memoization zur Build-Zeit.
  • Angular vollzieht einen Übergang von Zone.js-basierter Change Detection zu einem signal-gesteuerten, zoneless-Modell.
  • Svelte 5 Runes ersetzen die ältere $:-Syntax durch explizite, compiler-verarbeitete reaktive Primitive, die sowohl innerhalb als auch außerhalb von .svelte-Dateien funktionieren.

Was „Reaktivität” tatsächlich bedeutet

Reaktivität ist der Mechanismus, der Ihre UI mit Ihrem Anwendungs-State synchron hält. Wenn sich der State ändert, entscheidet das Framework, was aktualisiert wird und wie. Der Hauptunterschied zwischen Frameworks liegt nicht darin, ob sie Reaktivität unterstützen — das tun sie alle —, sondern darin, wie granular diese Reaktivität ist.

Grobkörnige Reaktivität bedeutet, dass das Framework Komponenten-Code erneut ausführt, um herauszufinden, was sich geändert hat. Feinkörnige Reaktivität bedeutet, dass das Framework bereits genau weiß, welche DOM-Knoten von welchem State abhängen, sodass es die erneute Ausführung vollständig überspringt.

Schneller Vergleich der Reaktivitätsmodelle

FrameworkReaktivitätstypKern-PrimitiveUpdate-Bereich
React 21GrobkörniguseState / HooksKomponenten-Subtree
Vue 3Feinkörnigref / reactive (Proxy)Abhängigkeits-getrackt
Angular 19Grob → FeinSignals + Zone.js (optional)Komponente → Signal-Knoten
Svelte 5FeinkörnigRunes ($state, $derived)Kompilierte DOM-Bindings

Reacts Render-Zyklus und der React Compiler

Reacts Reaktivitätsmodell basiert auf einer einfachen Regel: Wenn sich der State ändert, wird die Komponentenfunktion erneut ausgeführt. React rekonstruiert ein virtuelles DOM, vergleicht es mit der vorherigen Version und committet nur die tatsächlichen Änderungen ins DOM.

Dieser grobkörnige Ansatz ist nachsichtig. Sie können State auf beliebige Weise lesen und transformieren, und React findet es heraus. Der Kompromiss ist, dass unnötige Re-Renders leicht eingeführt werden können.

Mit React 19 und dem React Compiler wird manuelle Memoization mit useMemo und useCallback weniger notwendig. Der React Compiler kann viele Memoization-Optimierungen automatisch zur Build-Zeit anwenden, wodurch der Bedarf an manuellem useMemo und useCallback in einigen Fällen reduziert wird.

Vues Proxy-basiertes Reaktivitätssystem

Das Reaktivitätssystem von Vue 3 verwendet JavaScript-Proxies, um Lese- und Schreibzugriffe abzufangen. Wenn Sie innerhalb einer Komponente oder eines computed auf ein ref- oder reactive-Objekt zugreifen, zeichnet Vue diese Abhängigkeit automatisch auf. Wenn sich der Wert ändert, werden nur die Teile der UI aktualisiert, die ihn lesen.

Vue 3.5 hat dies weiter verfeinert und die Speichernutzung verbessert sowie den Overhead für tief reaktive Objekte reduziert. Das Ergebnis ist ein System, bei dem feinkörniges Dependency-Tracking zur Laufzeit ohne Compiler-Schritt erfolgt.

Das mentale Modell ist explizit: Wrappen Sie State in ref(), leiten Sie Werte mit computed() ab und handhaben Sie Side Effects mit watch oder watchEffect. Vues Reaktivität funktioniert konsistent, egal ob Sie sich in einer .vue-Datei oder einem einfachen .js-Modul befinden.

Angular Signals und die Abkehr von Zone.js

Angulars traditionelle Change Detection stützte sich auf Zone.js, um asynchrone Operationen zu monkey-patchen und Checks über den Komponentenbaum hinweg auszulösen — ein grobkörniger Ansatz mit erheblichem Overhead.

Angular Signals, eingeführt in Angular 16 und jetzt die empfohlene reaktive Primitive, ändern dies grundlegend. Ein signal() verfolgt seine eigenen Consumer. Wenn es aktualisiert wird, werden nur die Komponenten und berechneten Werte, die es lesen, zur Überprüfung markiert. Angular bewegt sich aktiv in Richtung zoneless Change Detection, bei der Zone.js optional ist und Signals Updates direkt steuern.

import { signal, computed } from '@angular/core'

const count = signal(0)
const doubled = computed(() => count() * 2)

Dies bringt Angulars Reaktivitätsmodell in Bezug auf Granularität viel näher an Vue heran, während die starke TypeScript-Integration und das Dependency-Injection-System erhalten bleiben.

Svelte 5 Runes: Compiler-gesteuerte feinkörnige Reaktivität

Svelte hat schon immer einen Compiler verwendet, um effizienten Update-Code zu generieren. Svelte 5 ersetzt die älteren $:-reaktiven Deklarationen durch Runes — eine Reihe expliziter reaktiver Primitive, die wie Funktionsaufrufe aussehen, aber zur Compile-Zeit verarbeitet werden.

<script>
  let count = $state(0)
  let doubled = $derived(count * 2)

  $effect(() => {
    console.log('count changed:', count)
  })
</script>

$state deklariert reaktiven State, $derived erstellt berechnete Werte und $effect handhabt Side Effects. Der Compiler verwendet diese Runes, um präzise DOM-Update-Anweisungen zu generieren, sodass nur die spezifischen Knoten berührt werden, die vom geänderten State abhängen.

Svelte 5 Runes funktionieren auch konsistent außerhalb von .svelte-Dateien in .svelte.js-Modulen und lösen damit die frühere Reibung, Stores für gemeinsame reaktive Logik zu benötigen.

Der zentrale Kompromiss: Ergonomie vs. Präzision

Grobkörnige Systeme wie React sind schwerer zu brechen — Sie können State überall lesen und das Framework kümmert sich um den Rest. Feinkörnige Systeme wie Vue, Angular Signals und Svelte 5 Runes sind präziser, erfordern aber, dass Sie ihre Regeln befolgen. Verletzen Sie diese Regeln (wie das Destrukturieren eines reaktiven Proxy oder Signals), bricht die Reaktivität stillschweigend.

Die gute Nachricht: Ein defektes reaktives Binding ist normalerweise offensichtlich und schnell zu beheben. Ein langsamer Komponentenbaum, der durch unnötige Re-Renders verursacht wird, ist viel schwieriger zu diagnostizieren.

Das richtige Reaktivitätsmodell wählen

Jeder Ansatz spiegelt unterschiedliche Prioritäten wider:

  • React — maximale Flexibilität, großes Ökosystem, compiler-unterstützte Optimierung in React 19
  • Vue — feinkörnige Laufzeit-Reaktivität mit sanfter Lernkurve
  • Angular — Enterprise-Scale-Apps, die sich in Richtung Signals und zoneless-Architektur bewegen
  • Svelte — kleinster Output, compiler-erzwungene feinkörnige Updates mit moderner Runes-Syntax

Fazit

Das Reaktivitätsmodell, mit dem Sie arbeiten, prägt, wie Sie über State denken. Reacts grobkörniger, virtuelles-DOM-basierter Ansatz bietet Flexibilität auf Kosten potenziellen Over-Renderings — eine Lücke, die der React Compiler schließt. Vue und Angular Signals tracken Abhängigkeiten zur Laufzeit für präzise Updates, während Svelte 5 Runes diese Präzision in den Compiler selbst verlagern und minimalen Output ohne Laufzeit-Reaktivitäts-Overhead produzieren. Das Verständnis dieser zugrunde liegenden Update-Mechanismen — nicht nur der Syntax — macht Sie zu einem effektiveren Entwickler, unabhängig davon, welches Framework Sie wählen.

FAQs

Nicht direkt. Das Reaktivitätssystem jedes Frameworks ist eng mit seiner Rendering-Pipeline gekoppelt. Sie können jedoch framework-agnostische State-Manager wie Zustand, Jotai oder Nanostores projektübergreifend verwenden. Diese Bibliotheken verwalten State unabhängig und integrieren sich mit dem jeweiligen Framework, das die UI rendert.

Nicht unbedingt. Feinkörnige Systeme vermeiden standardmäßig unnötige Re-Renders, fügen aber Overhead für Dependency-Tracking hinzu. Bei kleinen Komponenten mit einfachem State kann Reacts grobkörniges Diffing genauso schnell sein. Performance-Unterschiede werden in großen Komponentenbäumen mit häufigen, lokalisierten State-Änderungen bedeutsam.

Nein. Ab Angular 18 ist zoneless Change Detection als experimentelle Option verfügbar, und Angular 19 fördert sie weiter. Neue Projekte können sich vollständig auf Signals für Change Detection verlassen. Zone.js wird weiterhin für Rückwärtskompatibilität unterstützt, aber das Angular-Team empfiehlt die Migration zu einer signal-basierten, zoneless-Architektur.

Svelte 4 verwendete die Dollar-Doppelpunkt-Label-Syntax, um reaktive Statements zu markieren, die nur innerhalb von Svelte-Komponentendateien funktionierten. Svelte 5 Runes wie $state, $derived und $effect sind explizite Primitive, die vom Compiler verarbeitet werden. Sie funktionieren sowohl in .svelte- als auch in .svelte.js-Dateien, was gemeinsame reaktive Logik einfacher und vorhersehbarer macht.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay