JavaScript React Anti-Patterns, die Teams verlangsamen

#JavaScript React Anti-Patterns
Sandor Farkas - Founder & Lead Developer at Wolf-Tech

Sandor Farkas

Gründer & Lead Developer

Experte für Softwareentwicklung und Legacy-Code-Optimierung

JavaScript React Anti-Patterns, die Teams verlangsamen

Schnell React-Features zu liefern ist selten dadurch begrenzt, wie schnell wir Code schreiben können. Es ist begrenzt durch wie sicher wir Code ändern können. Eine Handvoll JavaScript React Anti-Patterns erhöht still und leise den Koordinationsaufwand, verlangsamt Reviews, erzeugt flockige Bugs und macht Onboarding mühsam.

Dieser Leitfaden richtet sich an Tech Leads, Senior Engineers und Engineering Manager, die eine pragmatische Antwort auf folgende Frage suchen: Welche React-Gewohnheiten verlangsamen uns, und was sollten wir stattdessen tun?

Was "Teams verlangsamen" wirklich bedeutet (und wie man es misst)

Bevor Sie irgendetwas refactoren, einigen Sie sich auf das, was "langsam" in Ihrer Organisation bedeutet. In der Praxis zeigen sich React Anti-Patterns als:

  • Lange Lead Time von "ready" bis "merged" (große PRs, hohe Review-Last)
  • Hohe Change Failure Rate (Regressionen, Rollbacks, Hotfixes)
  • Langsames Onboarding (neue Entwickler finden nicht, wo die Dinge sind)
  • Releases mit niedrigem Vertrauen (manuelle QA-Heldentaten)

Wenn Sie eine gemeinsame Sprache für Delivery-Performance wollen, sind die DORA-Metriken eine nützliche Basis (Lead Time, Deployment-Häufigkeit, Change Failure Rate, Time to Restore). Siehe Googles Überblick über DORA-Metriken.

Eine schnelle Übersicht der häufigsten React Anti-Patterns

Nutzen Sie dies als Triage-Tabelle. Wenn Sie mehrere Zeilen erkennen, haben Sie wahrscheinlich einen Verstärkereffekt (jedes Anti-Pattern macht die anderen schwerer zu beheben).

Anti-PatternWas man im Alltag siehtWarum es Teams verlangsamtBesserer Standard
"God-Komponenten"Eine Datei besitzt Data Fetching, Geschäftsregeln, UI und NavigationPRs sind riesig, Änderungen kollidieren, Testing ist schwerOrchestrierung (Route) von Komponenten trennen, UI-Komponenten schlank halten
Server-State in useEffectuseEffect(() => fetch(...)) überallRace Conditions, duplizierte Logik, inkonsistentes CachingEine Server-State-Bibliothek verwenden (TanStack Query/RTK Query/SWR)
Effect-Dependency-ChaosDeaktivierte Lint-Regeln, mysteriöse Re-RendersBugs treten spät auf, Fixes sind risikoreichReact Hook-Regeln befolgen, Effects isolieren, Logik auslagern
Context als globaler StateEin "AppContext" versorgt allesRe-Render-Stürme, versteckte KopplungContext eng halten (Feature oder Komponenten-Subtree), Stores gezielt einsetzen
Globaler Store für allesRedux/Zustand hält UI-State, Form-State, URL-StateSchwer debuggbares Verhalten, schwer wiederverwendbare ScreensState klassifizieren (Server, URL, UI, Form) und bewusst platzieren
Vorzeitige AbstraktionenGenerische "SuperButton", "ApiService", "SmartTable"Jede Änderung erfordert Framework-ArbeitKonkrete Komponenten bevorzugen, erst nach bewiesener Duplizierung abstrahieren
Keine Grenzen in der Codebaseshared/ und utils/ werden AblageVerantwortlichkeit unklar, zirkuläre Deps wachsenFeature-first Module mit durchsetzbaren Abhängigkeitsregeln
Fehlende Validierung und Contracts"Es funktioniert mit diesem Payload" AnnahmenLaufzeitfehler, kostspieliges DebuggingTypisierte + Laufzeit-Validierung an Grenzen (z.B. Zod)
Tests konzentriert in E2EWenige langsame flockige End-to-End-TestsTeams hören auf, CI zu vertrauenÜberwiegend Unit-/Komponenten-Tests + ein E2E pro kritischer Journey

Wenn Sie die "guten Standards" als Gegenstück zu diesem Artikel wollen, hat Wolf-Tech Begleitleitfäden wie React application architecture: state, data, and routing und das React development playbook for teams.

Eine Split-Screen-Illustration: links eine verschlungene React-Komponente mit vielen Pfeilen (Data Fetching, State, UI, Navigation) in einer Box; rechts eine saubere Architektur mit einer Route-Schicht, die Daten orchestriert, und kleinen präsentationalen Komponenten darunter.

Anti-Pattern 1: "God-Komponenten", die alles tun

Wie es aussieht

Eine einzelne Komponentendatei:

  • Fetcht Daten
  • Hält komplexen abgeleiteten State
  • Implementiert Geschäftsregeln
  • Rendert einen großen UI-Baum
  • Navigiert beim Submit

Warum es Teams verlangsamt

God-Komponenten werden zu Merge-Conflict-Magneten. Sie tendieren auch dazu, fragile, ungetestete bedingte Pfade anzuhäufen ("wenn Nutzer X und Status Y..."). Das Ergebnis ist:

  • Große PRs und lange Review-Zyklen
  • Hohes Regressionsrisiko
  • Geringe Wiederverwendbarkeit (die Komponente ist zu spezifisch zum Extrahieren)

Besserer Standard

Behandeln Sie Routes/Pages als Orchestrierungs-Nähte und halten Sie Komponenten fokussiert.

Eine praktische Aufteilung:

  • Route-Schicht: Data Loading, Auth-/Permissions-Checks, Error Boundaries, Navigation
  • Feature-Komponenten: präsentational + lokaler UI-State
  • Domain-Logik: extrahierte Funktionen mit Tests

Wolf-Techs React front end architecture for product teams behandelt diesen "Routes orchestrieren, Features implementieren"-Ansatz im Detail.

Anti-Pattern 2: Server-State als "nur React-State" behandeln

Wie es aussieht

Wiederholte Muster in der gesamten App:

useEffect(() => {
  setLoading(true)
  fetch(`/api/orders?user=${userId}`)
    .then(r => r.json())
    .then(data => setOrders(data))
    .catch(setError)
    .finally(() => setLoading(false))
}, [userId])

Warum es Teams verlangsamt

Wenn jedes Team Fetching neu erfindet, erhält man inkonsistentes Verhalten:

  • Duplizierte Caching-Logik (oder gar kein Caching)
  • Wasserfälle und Race Conditions
  • Inkonsistentes Error-Handling und Retries
  • "Refetch"-Semantik ist unklar

Besserer Standard

Eine Server-State-Bibliothek verwenden und Query-Keys, Stale-Times und Invalidierungsregeln standardisieren. TanStack Query ist eine verbreitete Wahl, aber der Schlüssel ist Konsistenz.

Dies stimmt mit Reacts Empfehlung überein, App-Architektur nicht allein aus Effects abzuleiten. Die React-Dokumentation über Synchronizing with Effects und die Rules of Hooks sind es wert, neu zu lesen, wenn eine Codebase abweicht.

Anti-Pattern 3: Effect-Dependency-Chaos (und die Lint-Regel deaktivieren)

Wie es aussieht

  • // eslint-disable-next-line react-hooks/exhaustive-deps
  • Effects, die mehrere unzusammenhängende Dinge tun
  • Effects, die "funktionieren", aber nur weil State zufällig in einer bestimmten Reihenfolge aktualisiert wird

Warum es Teams verlangsamt

Das erzeugt "Action at a distance". Ein Entwickler ändert eine Variable, und ein Effect beginnt still und heimlich häufiger zu feuern (oder gar nicht). Diese Bugs sind:

  • Schwer zu reproduzieren
  • Schwer zu reviewen (man muss das Laufzeitverhalten mental simulieren)
  • Oft mit mehr Effects "gefixt", was das Problem verschlimmert

Besserer Standard

  • Jeden Effect auf eine Synchronisationsaufgabe beschränken.
  • Reine Transformationen aus Effects heraushalten.
  • Event-Handler für Nutzeraktionen bevorzugen, nicht Effects.

Außerdem: die Regel in CI durchsetzen. Wenn das Team sie häufig deaktivieren muss, ist das ein Signal, dass die Komponentengrenzen falsch gesetzt sind.

Anti-Pattern 4: React Context als globalen Store verwenden

Wie es aussieht

  • Ein AppContext-Provider an der Root
  • Er speichert Nutzer, Berechtigungen, Theme, Feature Flags, gecachte Daten, UI-Toggles

Warum es Teams verlangsamt

Context ist nicht "schlecht", aber breiter Context erzeugt versteckte Kopplung und Re-Render-Druck. Im Laufe der Zeit erhält man:

  • Unerwartete Re-Renders, wenn unzusammenhängende Context-Werte sich ändern
  • Schwer nachverfolgbare Abhängigkeiten (jede Komponente kann alles lesen)
  • Riskante Refactors (das Ändern der Context-Form bricht viele Consumer)

Besserer Standard

  • Context eng und lokal halten (Feature-Subtree oder eine einzelne Komponentenfamilie).
  • Für häufig ändernde Werte, die von vielen Nodes benötigt werden, einen dedizierten Store mit Selektoren verwenden (und ihn als explizite Abhängigkeit behandeln).
  • Für Server-State nicht "über Context cachen". Eine Server-State-Bibliothek verwenden.

Anti-Pattern 5: Eine globale State-Lösung für alle State-Typen

Wie es aussieht

Alles geht in Redux/Zustand/MobX:

  • Formulareingaben
  • URL-Filter
  • Modal offen/geschlossen
  • Server-Antworten

Warum es Teams verlangsamt

Verschiedene State-Typen haben unterschiedliche Lebenszyklen und Korrektheitsnormen. Wenn alles zusammen gespeichert wird:

  • Unnötige Koordination wird geschaffen (jede Änderung berührt "den Store")
  • Cross-Feature-Kopplung wird gefördert
  • Debugging wird zur Timeline-Archäologie

Besserer Standard

State klassifizieren und dort platzieren, wo er hingehört:

  • Server-State: gefetcht, gecacht, invalidiert (Server-State-Tooling verwenden)
  • URL-State: teilbar, Back-Button-Verhalten (Router/Search-Params verwenden)
  • UI-State: flüchtige lokale Toggles (Komponenten-State)
  • Form-State: Validierungs- und Submissions-Lebenszyklus (Form-Bibliothek)

Wolf-Techs React application architecture: state, data, and routing bietet ein konkretes Modell, das Sie schnell einsetzen können.

Anti-Pattern 6: Vorzeitige Abstraktionen und "Framework Building" innerhalb der App

Wie es aussieht

  • Ein generischer "API-Client", der HTTP-Semantik verbirgt
  • Eine überkonfigurierbare "Table"-Komponente für jede Liste
  • Ein "SmartInput", der jeden Form-Use-Case unterstützen will

Warum es Teams verlangsamt

Übermäßige Abstraktion verschiebt Arbeit von der Produkt-Lieferung zur internen Framework-Wartung:

  • Einfache Feature-Änderungen erfordern Änderungen an gemeinsamen Abstraktionen
  • Reviews werden politisch ("das betrifft andere Teams")
  • Engineers vermeiden es, gemeinsamen Code anzufassen, oder fassen ihn an und brechen anderen Code

Besserer Standard

  • Konkrete Komponenten pro Journey oder Feature bevorzugen.
  • Nur abstrahieren wenn:
    • Sie wiederholte Logik mindestens 3-mal sehen, und
    • Sie einen stabilen API-Contract definieren können.

Für große gemeinsam genutzte Komponenten ist der sicherste Weg oft "headless core + thin wrappers" und explizite Contracts. Wolf-Techs React patterns for large, shared components geht darauf ein.

Anti-Pattern 7: Keine durchsetzbaren Modul-Grenzen (der shared/-Dump)

Wie es aussieht

  • shared/, common/, utils/ wachsen ohne Verantwortlichkeit
  • Zufällige Cross-Imports zwischen Features
  • Zirkuläre Abhängigkeitsprobleme treten im Laufe der Zeit auf

Warum es Teams verlangsamt

Ohne Grenzen verliert man Parallelismus:

  • Teams treten sich gegenseitig auf die Füße
  • Refactors werden beängstigend (unbekannter Blast-Radius)
  • Onboarding wird zu "Stammesswissen"

Besserer Standard

Ein feature-first Modul-Layout mit einer dünnen gemeinsamen Schicht einführen und Grenzen mit Tooling durchsetzen (ESLint-Regeln, Abhängigkeits-Constraints). Wenn Ihr Repo bereits groß ist, machen Sie das schrittweise:

  • Beginnen Sie damit, "keine Imports über Features hinweg" als Ziel zu definieren.
  • Code nur verschieben, wenn er angefasst wird (Boy-Scout-Regel).
  • Abhängigkeitsregeln hinzufügen und PRs fehlschlagen lassen, die sie brechen.

Anti-Pattern 8: Fehlende Contracts an Grenzen (Typen und Laufzeit-Validierung)

Wie es aussieht

  • API-Antworten werden als korrekt angenommen
  • Eine kleine Backend-Änderung bricht einen Frontend-Screen
  • "Fix" ist, mehr Optional-Chaining hinzuzufügen

Warum es Teams verlangsamt

Wenn Contracts implizit sind:

  • Debug-Zeit explodiert
  • Bugs entkommen zur Produktion
  • Cross-Team-Arbeit wird langsamer (mehr Koordination, mehr Meetings)

Besserer Standard

Zwei Schichten verwenden:

  • Type-Level-Contracts (TypeScript-Typen oder generierte Typen)
  • Laufzeit-Validierung an Grenzen (z.B. Zod-Schemas)

Wolf-Techs React tutorial: build a production-ready feature slice zeigt, wie Contracts und Validierung in ein auslieferbares Feature passen.

Anti-Pattern 9: Performance-Arbeit, die reaktiv statt budgetiert ist

Wie es aussieht

  • "Die App ist langsam"-Meldungen kommen spät
  • Teams jagen Micro-Optimierungen in React-Renders
  • Niemand kann beantworten, was "schnell genug" bedeutet

Warum es Teams verlangsamt

Unbegrenzte Performance-Arbeit wird zu einer Steuer auf jedes Release. Außerdem verfehlt die ausschließliche Konzentration auf Render-Micro-Optimierungen größere Ursachen (Daten-Wasserfälle, Payload-Gewicht, Third-Party-Skripte).

Besserer Standard

  • Einige Performance-Budgets festlegen, die an Nutzerergebnisse geknüpft sind (z.B. Core Web Vitals).
  • Mit Lab- und Field-Daten messen.

Für React-Apps bietet Wolf-Techs React website performance guide (LCP, CLS, TTFB) einen konkreten Workflow. Für Core Web Vitals-Hintergrundinformationen siehe web.dev/vitals.

Anti-Pattern 10: Tests konzentriert in einer kleinen, flockigen E2E-Suite

Wie es aussieht

  • CI dauert lange
  • E2E schlägt sporadisch fehl
  • Entwickler starten Pipelines neu, bis sie durchlaufen

Warum es Teams verlangsamt

Flockige Tests erzeugen eine Kultur des geringen Vertrauens. Wenn CI nicht vertraut wird:

  • PR-Review wird langsamer (mehr manuelle Überprüfung)
  • Releases werden verzögert
  • Bugs entkommen, weil Teams fehlschlagende Tests deaktivieren oder ignorieren

Besserer Standard

Anstreben:

  • Schnelle Komponenten-Tests für kritische UI-Logik
  • Fokussierte Unit-Tests für Domain-Logik
  • Ein E2E pro kritischer Journey (Smoke Tests), nicht pro Edge Case

Wenn Sie eine breitere "Release-Zuverlässigkeits"-Basis wollen, ist die front end development checklist for reliable UI releases eine solide Referenz.

Ein praktisches 30-Minuten-Audit, das Sie diese Woche durchführen können

Wenn Sie das umsetzbar machen wollen, nehmen Sie eine Codebase und beantworten Sie diese Fragen:

  • Fungieren Routes/Pages als Orchestrierungs-Nähte, oder sind Geschäftsregeln über zufällige Komponenten verstreut?
  • Haben wir einen konsistenten Ansatz für Server-State (Queries, Mutations, Invalidierung, Retries)?
  • Werden Hook-Lint-Regeln durchgesetzt oder häufig deaktiviert?
  • Können wir auf einen kleinen Satz von Modul-Grenzen (Features) zeigen und sie durchsetzen?
  • Validieren wir API-Grenzen (Typen plus Laufzeit-Checks) statt Payloads zu vertrauen?
  • Ist CI schnell und vertrauenswürdig, oder langsam und flockig?

Eine einfache Checklisten-Tafel mit Spalten: "Anti-Pattern erkannt", "Belege (PRs, Incidents)", "Kleinster Fix" und "Verantwortlicher", mit einigen Beispielzeilen für React Effects, Modul-Grenzen und Test-Flakiness.

Häufig gestellte Fragen

Was ist das größte React Anti-Pattern, das Teams am meisten verlangsamt? Der häufigste "Velocity-Killer" ist die God-Komponente (zu viele Aufgaben an einem Ort). Sie treibt riesige PRs, Merge-Konflikte und fragile Änderungen an. Die Trennung von Orchestrierung und UI ist in der Regel der höchste Hebel.

Ist die Verwendung von useEffect für Data Fetching immer ein Anti-Pattern? Nicht immer, aber es wird eines, wenn es Ihre Standard-App-Architektur ist. Für alles jenseits einfacher Demos verhindert eine Server-State-Bibliothek plus konsistente Query-Konventionen duplizierte Logik, Race Conditions und inkonsistentes Error-Handling.

Ist React Context schlechte Praxis? Nein. Context ist großartig für scoped Dependencies (Theme, Locale, eine Komponentenfamilie). Das Anti-Pattern ist die Verwendung eines breiten, globalen Contexts als allgemeinen State-Container für schnell ändernde Werte.

Sollten wir unsere React-App neu schreiben, um diese Probleme zu beheben? In der Regel nein. Die meisten Teams erzielen bessere Ergebnisse mit inkrementellen Refactors: Lint-Regeln durchsetzen, Grenzen definieren, Server-State standardisieren und die schlimmsten Hotspots schrittweise angehen.

Wie priorisieren wir, welches Anti-Pattern wir zuerst angehen? Beginnen Sie mit dem, das in messbarem Schmerz auftaucht: größte PRs, häufigste Regressionen oder der langsamste Feedback-Loop (CI-Flakiness). Nehmen Sie einen kleinen Slice, beheben Sie ihn und machen Sie den Fix zu einem Standard.


Brauchen Sie einen schnellen, praktischen React-Bereinigungsplan?

Wenn Ihre React-Codebase die Lieferung verlangsamt, liegt die Lösung selten in "mehr React-Experten" und fast nie in "einem vollständigen Rewrite". Es handelt sich meist um einen kleinen Satz Architektur- und Qualitäts-Guardrails, die konsequent angewendet werden.

Wolf-Tech hilft Teams dabei, JavaScript React Codebases durch Full-Stack-Lieferung, Code-Qualitätsberatung und Legacy-Optimierung zu modernisieren und zu skalieren. Wenn Sie eine objektive Bewertung (mit einem priorisierten, inkrementellen Plan) wollen, beginnen Sie ein Gespräch bei Wolf-Tech.