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-Pattern | Was man im Alltag sieht | Warum es Teams verlangsamt | Besserer Standard |
|---|---|---|---|
| "God-Komponenten" | Eine Datei besitzt Data Fetching, Geschäftsregeln, UI und Navigation | PRs sind riesig, Änderungen kollidieren, Testing ist schwer | Orchestrierung (Route) von Komponenten trennen, UI-Komponenten schlank halten |
Server-State in useEffect | useEffect(() => fetch(...)) überall | Race Conditions, duplizierte Logik, inkonsistentes Caching | Eine Server-State-Bibliothek verwenden (TanStack Query/RTK Query/SWR) |
| Effect-Dependency-Chaos | Deaktivierte Lint-Regeln, mysteriöse Re-Renders | Bugs treten spät auf, Fixes sind risikoreich | React Hook-Regeln befolgen, Effects isolieren, Logik auslagern |
| Context als globaler State | Ein "AppContext" versorgt alles | Re-Render-Stürme, versteckte Kopplung | Context eng halten (Feature oder Komponenten-Subtree), Stores gezielt einsetzen |
| Globaler Store für alles | Redux/Zustand hält UI-State, Form-State, URL-State | Schwer debuggbares Verhalten, schwer wiederverwendbare Screens | State klassifizieren (Server, URL, UI, Form) und bewusst platzieren |
| Vorzeitige Abstraktionen | Generische "SuperButton", "ApiService", "SmartTable" | Jede Änderung erfordert Framework-Arbeit | Konkrete Komponenten bevorzugen, erst nach bewiesener Duplizierung abstrahieren |
| Keine Grenzen in der Codebase | shared/ und utils/ werden Ablage | Verantwortlichkeit unklar, zirkuläre Deps wachsen | Feature-first Module mit durchsetzbaren Abhängigkeitsregeln |
| Fehlende Validierung und Contracts | "Es funktioniert mit diesem Payload" Annahmen | Laufzeitfehler, kostspieliges Debugging | Typisierte + Laufzeit-Validierung an Grenzen (z.B. Zod) |
| Tests konzentriert in E2E | Wenige langsame flockige End-to-End-Tests | Teams 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.

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?

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.

