- Ein Vergleich zwischen Backbone aus den frühen 2010er-Jahren und React im Jahr 2025, der hinterfragt, wie groß der tatsächliche Fortschritt im Frontend in 15 Jahren wirklich war
- React wirkt auf den ersten Blick schlank und modern, verbirgt seine Einfachheit intern jedoch hinter komplexen Abstraktionsschichten
- Backbone ist zwar wortreicher im Code, aber Ereignisfluss und DOM-Manipulation sind explizit, sodass auch Einsteiger das Verhalten leicht nachverfolgen können
- Bei React ist Debugging wegen Themen wie State-Management, Dependency-Arrays und Closure-Problemen schwierig, wenn man das Innenleben nicht versteht
- Letztlich wird das Wesen „Ereignisse + Zustand = UI“ wieder in Erinnerung gerufen und der Bedarf an einem neuen Modell mit Einfachheit und einer hackbaren Struktur aufgeworfen
15 Jahre Fortschritt
- Ein Beispiel für ein Passwort-Eingabefeld, einmal geschrieben mit einem Framework der 2010er (Backbone) und einmal mit React, das sich über mehr als zehn Jahre entwickelt hat
- Beide Implementierungen sind ähnlich lang und funktional identisch
- React wurde durch unzählige Entwicklerstunden und ein riesiges Ökosystem unterstützt
- Der Autor merkt jedoch an, dass weniger interessant sei, „wie viel besser React geworden ist“, sondern eher, „wie wenig Fortschritt es gegeben hat“
- React liefert die Illusion äußerer Einfachheit, tatsächlich steigt die Verständnishürde aber durch komplexe Abstraktionen
- Backbone stellt den einfachen Ablauf explizit dar: Ereignis tritt auf → Handler läuft → HTML wird erzeugt → DOM wird eingefügt
- React dagegen verbirgt die internen Abläufe, und sobald man über einfache Beispiele hinausgeht, entstehen Probleme, die sich nur mit Verständnis der internen Mechanismen lösen lassen
Die Illusion der Einfachheit (The Illusion of Simplicity)
- React-Code sieht sauber aus, aber das ist das Ergebnis einer Entscheidung für abstrakte Komplexität statt expliziter Einfachheit
- Backbone ist wortreich, zeigt aber klar, „was wann passiert“
- Auch Einsteiger können den Codefluss leicht verfolgen
- In React sind interner Zustand und Rendering-Logik verborgen, wodurch unerwartete Bugs häufig auftreten
- Beispiel: Wenn bei Listeneinträgen der key auf den Index geändert wird, erkennt React sie als andere Komponenten und setzt den Zustand zurück
- Wenn
value zu undefined wird, kommt es durch den Wechsel von unkontrollierter zu kontrollierter Komponente zum Zurücksetzen des Eingabewerts
- Auch Endlosschleifen bei der Verwendung von
useEffect sind ein häufiges Problem
- Wenn das Dependency-Array Objekte enthält, die bei jedem Rendern neu erzeugt werden, wertet React das als Änderung
- Um das zu verhindern, braucht man mit
useMemo und useCallback eine Stabilisierung von Identitäten
- Dadurch muss man auf Konzepte achten, die früher keine Rolle spielten
- Es gibt auch das Problem, dass Click-Handler auf veralteten Zustand (stale state) zugreifen
- Der Grund ist, dass Funktionen den Zustand zum Zeitpunkt ihrer Erzeugung capturen
- Lösungen sind, den Zustand ins Dependency-Array aufzunehmen oder funktionale Updates wie
setState(x => x + 1) zu verwenden
- Beide Methoden wirken jedoch eher wie ein Workaround
Magie hat einen hohen Preis (Magic Has a High Price)
- Diese Probleme sind keine Ausnahmefälle, sondern allgemeine Probleme, die in Apps ab mittlerer Größe häufig auftreten
- Für Debugging muss man den Reconciliation-Algorithmus, die Render-Phase und den Scheduler (Batch Update) verstehen
- React ist so aufgebaut, dass es „funktioniert, auch wenn man nicht weiß warum“, aber sobald Probleme auftreten, muss man das Innenleben kennen, um sie zu lösen
- Die Komplexität ist so groß, dass es sogar heißt, man müsse React selbst einmal bauen, um es wirklich zu verstehen
- Es gibt Tutorials wie “Build your own React”
- Dass man für einen simplen Passwort-Validator Virtual DOM, Scheduling-Prioritäten und Concurrent Rendering verstehen soll, hat jedoch eine kritische Aussagekraft
- Backbone und jQuery besitzen eine ehrliche und hackbare Struktur
- Man kann den Quellcode direkt ansehen und verändern
- Auf DOM-Methoden basierend sind sie leicht zu verstehen und zu erweitern
- Dagegen erschweren die Abstraktionsschichten von React den Zugriff auf und die Veränderung des Inneren
Was kommt als Nächstes? (So, What's Next?)
- Letztlich versuchen sowohl React als auch Backbone, dasselbe Problem zu lösen: „Ereignisse + Zustand = UI“
- In großen Apps mag die Komplexität von React gerechtfertigt sein, für die meisten kleinen und mittleren Apps ist sie jedoch eine übermäßige Last
- Es braucht ein neues UI-Modell mit Einfachheit und Transparenz
- Ein System, das so robust wie das DOM, aber intuitiv ist
- Mit einer sofort verständlichen und veränderbaren Struktur wie bei Backbone oder jQuery
2 Kommentare
Bei kleinen bis mittelgroßen Apps scheint es besser, JavaScript-Klassen zu entwerfen, statt auf Backbone oder jQuery zu setzen, um sich auf das Nächste vorzubereiten.
Die Templates in jQuery oder Backbone wieder auswendig zu lernen und damit weiterzumachen, wirkt wie ein Rückschritt.
Hacker-News-Kommentare
Ich habe alles verwendet: Backbone, Angular 1, Ember und React
Man darf nicht übersehen, warum React populär geworden ist. Bei Komposition von Komponenten, Ereignisbehandlung, State-Management und effizienten DOM-Updates hat React chronische Probleme bestehender Frameworks gelöst
Bei Backbone war das Management des DOM-Lebenszyklus komplex, und Event-Handler mussten als Strings angegeben werden, was die Wartung erschwerte. React hat diese Probleme mit unidirektionalem State-Flow und virtuellem DOM vereinfacht
Wenn ich heute pures JS verwenden wollte, hielte ich eine Template-Lösung wie lit-html für deutlich besser als Backbone
Frontend war früher schon komplex und ist es heute auch, aber heute ist es deutlich weniger schmerzhaft
Die Komplexität einer App entsteht nicht durch die Anzahl der Komponenten, sondern durch State-Management
Wegen des bidirektionalen Datenflusses im Backbone Store hatte ich oft Probleme mit eingefrorenen UIs. Die Innovation von React war die Flux-Architektur rund um unidirektionalen Datenfluss
Ein gutes Framework ist für mich ein Werkzeug, das einen natürlich in den „Pit of Success“ führt. React hat diese Rolle gut erfüllt
Probleme wie stale closures, endlose
useEffect-Schleifen oder zurückgesetzte Eingaben durch geänderte Keys gab es in Backbone nichtDie Probleme von Backbone waren sichtbar und leicht zu debuggen, aber die Probleme von React verstecken sich hinter Abstraktionen
Die meisten Apps haben nicht die Größenordnung von Facebook, daher kann ein expliziter und einfacher Ansatz sogar besser sein
Beliebte Technologien pauschal als „schlecht“ abzutun, wirkt wie eine Art naive Arroganz
Natürlich garantiert Popularität keine Qualität, aber anzunehmen, dass brillante Ingenieure weltweit sich alle haben täuschen lassen, ist überzogen
Wenn Großunternehmen und Marketing etwas pushen, übernehmen CTOs es, und wenn die eigene Karriere daran hängt, sagt niemand „das ist nicht so toll“. Popularität ≠ Eignung
React hat nicht allein durch technische Überlegenheit gewonnen, sondern auch dank Facebooks Marketing und der sich selbst verstärkenden Dynamik des Ökosystems
Selbst nach 15 Jahren sind Code-Länge und Komplexität nicht drastisch gesunken. Es ist nur auf andere Weise komplexer geworden
Der Blick zurück ist keine Nostalgie, sondern soll prüfen, ob wir unverhältnismäßige Komplexität hinzugefügt haben
Das Web wirkt immer noch wie der Wilde Westen der Design Patterns. Als ich das akzeptiert habe, war ich innerlich ruhiger
Letztlich muss man je nach Projekt die Trade-offs neu bewerten
Die Behauptung „für einfache Dinge braucht man React nicht“ ist ein verbreiteter React-Irrtum (React fallacy)
React an simplen Beispielen zu bewerten, ist wie „eine Sprache anhand der Länge von Hello World zu beurteilen“
Der Grund, React auch für einfache Dinge zu verwenden, ist, dass man es auch für komplexe Dinge verwendet. Ein konsistentes Toolset ist bei der Wartung von Vorteil
Backbone sah „wie ein Framework aus, war in Wirklichkeit aber ein Haufen Glue Code“
Der eigentliche Sieg von React war, dass direkte DOM-Manipulation nicht mehr nötig war und reaktives State-Management möglich wurde. Diese beiden Dinge haben die Produktivität stark erhöht
Alter Tutorial-Link, Archiv-Version
Heute interessiert mich stärker, wie LLMs Code verstehen. Deklarative Syntax wie JSX ist LLM-freundlich
Aber React nach
useEffectwirkt in Bezug auf Ausdruckskraft und Explizitheit eher verschwommenerEs wird gut sichtbar, warum React so populär geworden ist
React-Code besteht größtenteils aus purem JS und HTML, und im Kern braucht man nur
useState. Es ist intuitiv und auch ohne Dokumentation verständlichBackbone hing bei der Wartbarkeit an String-Selektoren wie
.space-y-2. Wenn man nur einen Klassennamen änderte, ging die halbe App kaputtReact hat dieses Problem strukturell gelöst
Bei Backbone-Code ist klar, „was wann passiert“, während man bei React die internen Abläufe verstehen muss
Ich selbst habe Dan Abramovs Guide zu
useEffectund Mark Eriksons Blog mehrfach gelesen, um zu verstehen, wann React was tutBackbone-Code habe ich auch nach 10 Jahren sofort verstanden
Vor 6 Jahren haben wir ein Team von Backbone auf Angular umgestellt
Backbone war intuitiv und ohne Magie, also gut für Junioren, aber am Ende waren TypeScript und Angular systematischer
Jetzt nutzen wir NG20 und sind zufrieden. Wenn Browser irgendwann mehr Funktionen nativ bereitstellen, kehren wir vielleicht wieder zu einem einfacheren Ansatz zurück
Wir programmieren immer auf Abstraktionen
Entscheidend ist, ob diese Abstraktionen Produktivitätsgewinn im Verhältnis zur Komplexität bringen und ob man ihnen vertrauen kann
Selbst im schlimmsten Fall müssen sie noch debuggbar sein
React verarbeitet Undo-Verhalten in Eingabefeldern natürlicher als Backbone
Backbone macht Undo zeichenweise, React rückgängig pro Wort