Vercel React Best Practices
Umfassender Leitfaden zur Leistungsoptimierung für React- und Next.js-Anwendungen, gepflegt von Vercel. Enthält 70 Regeln in 8 Kategorien, priorisiert nach Auswirkung, zur Unterstützung automatisierter Refaktorisierung und Codegenerierung.
Wann anwenden
Diese Richtlinien sind zu beachten, wenn:
- Neue React-Komponenten oder Next.js-Seiten geschrieben werden
- Datenabruf (client- oder serverseitig) implementiert wird
- Code auf Leistungsprobleme überprüft wird
- Vorhandener React/Next.js-Code refaktorisiert wird
- Die Bundle-Größe oder Ladezeiten optimiert werden
Regelkategorien nach Priorität
| Priorität | Kategorie | Auswirkung | Präfix |
|---|---|---|---|
| 1 | Wasserfälle eliminieren | KRITISCH | async- |
| 2 | Bundle-Größenoptimierung | KRITISCH | bundle- |
| 3 | Serverseitige Leistung | HOCH | server- |
| 4 | Clientseitiger Datenabruf | MITTEL-HOCH | client- |
| 5 | Re-Render-Optimierung | MITTEL | rerender- |
| 6 | Rendering-Leistung | MITTEL | rendering- |
| 7 | JavaScript-Leistung | NIEDRIG-MITTEL | js- |
| 8 | Fortgeschrittene Muster | NIEDRIG | advanced- |
Kurzreferenz
1. Wasserfälle eliminieren (KRITISCH)
async-cheap-condition-before-await– Günstige synchrone Bedingungen vor dem Awaiten von Flags oder entfernten Werten prüfenasync-defer-await– await in die Zweige verschieben, in denen es tatsächlich verwendet wirdasync-parallel– Promise.all() für unabhängige Operationen verwendenasync-dependencies– better-all für partielle Abhängigkeiten verwendenasync-api-routes– Promises früh starten, spät in API-Routen awatenasync-suspense-boundaries– Suspense zum Streamen von Inhalten verwenden
2. Bundle-Größenoptimierung (KRITISCH)
bundle-barrel-imports– Direkt importieren, Barrel-Dateien vermeidenbundle-analyzable-paths– Statisch analysierbare Import- und Dateisystempfade bevorzugen, um breite Bundles und Traces zu vermeidenbundle-dynamic-imports– next/dynamic für schwere Komponenten verwendenbundle-defer-third-party– Analytics/Logging nach der Hydration ladenbundle-conditional– Module nur laden, wenn die Funktion aktiviert istbundle-preload– Bei Hover/Fokus vorladen für gefühlte Geschwindigkeit
3. Serverseitige Leistung (HOCH)
server-auth-actions– Server-Aktionen wie API-Routen authentifizierenserver-cache-react– React.cache() für pro-Request-Deduplizierung verwendenserver-cache-lru– LRU-Cache für Cross-Request-Caching verwendenserver-dedup-props– Doppelte Serialisierung in RSC-Props vermeidenserver-hoist-static-io– Statische I/O (Schriftarten, Logos) auf Modulebene hebenserver-no-shared-module-state– Veränderlichen Module-Level-Request-Status in RSC/SSR vermeidenserver-serialization– Daten minimieren, die an Client-Komponenten übergeben werdenserver-parallel-fetching– Komponenten umstrukturieren, um Abrufe zu parallelisierenserver-parallel-nested-fetching– Verschachtelte Abrufe pro Element in Promise.all verkettenserver-after-nonblocking– after() für nicht blockierende Operationen verwenden
4. Clientseitiger Datenabruf (MITTEL-HOCH)
client-swr-dedup– SWR zur automatischen Request-Deduplizierung verwendenclient-event-listeners– Globale Event-Listener deduplizierenclient-passive-event-listeners– Passive Listener für Scroll verwendenclient-localstorage-schema– localStorage-Daten versionieren und minimieren
5. Re-Render-Optimierung (MITTEL)
rerender-defer-reads– Keinen Status abonnieren, der nur in Callbacks verwendet wirdrerender-memo– Teure Arbeit in memoized Komponenten auslagernrerender-memo-with-default-value– Standardmäßig nicht-primitive Props auf Modulebene hebenrerender-dependencies– Primitive Abhängigkeiten in Effekten verwendenrerender-derived-state– Abgeleitete Booleans abonnieren, nicht Rohwertererender-derived-state-no-effect– Status während des Renderings ableiten, nicht in Effektenrerender-functional-setstate– Funktionellen setState für stabile Callbacks verwendenrerender-lazy-state-init– Funktion an useState für teure Werte übergebenrerender-simple-expression-in-memo– memo für einfache Primitive vermeidenrerender-split-combined-hooks– Hooks mit unabhängigen Abhängigkeiten aufteilenrerender-move-effect-to-event– Interaktionslogik in Event-Handler verschiebenrerender-transitions– startTransition für nicht dringende Aktualisierungen verwendenrerender-use-deferred-value– Teures Rendern verzögern, um Eingaben reaktionsschnell zu haltenrerender-use-ref-transient-values– Refs für transiente häufige Werte verwendenrerender-no-inline-components– Keine Komponenten innerhalb von Komponenten definieren
6. Rendering-Leistung (MITTEL)
rendering-animate-svg-wrapper– Div-Wrapper animieren, nicht das SVG-Elementrendering-content-visibility– content-visibility für lange Listen verwendenrendering-hoist-jsx– Statisches JSX außerhalb von Komponenten extrahierenrendering-svg-precision– SVG-Koordinatengenauigkeit reduzierenrendering-hydration-no-flicker– Inline-Script für clientseitige Daten verwendenrendering-hydration-suppress-warning– Erwartete Diskrepanzen unterdrückenrendering-activity– Activity-Komponente für ein-/ausblenden verwendenrendering-conditional-render– Ternären Operator verwenden, nicht && für Bedingungenrendering-usetransition-loading– useTransition für Ladezustand bevorzugenrendering-resource-hints– React DOM Resource Hints zum Vorladen verwendenrendering-script-defer-async– defer oder async auf Script-Tags verwenden
7. JavaScript-Leistung (NIEDRIG-MITTEL)
js-batch-dom-css– CSS-Änderungen über Klassen oder cssText gruppierenjs-index-maps– Map für wiederholte Lookups erstellenjs-cache-property-access– Objekteigenschaften in Schleifen cachenjs-cache-function-results– Funktionsergebnisse in modulebene Map cachenjs-cache-storage– localStorage/sessionStorage-Lesezugriffe cachenjs-combine-iterations– Mehrere filter/map in eine Schleife kombinierenjs-length-check-first– Array-Länge vor teurem Vergleich prüfenjs-early-exit– Frühzeitig aus Funktionen zurückkehrenjs-hoist-regexp– RegExp-Erstellung außerhalb von Schleifen hebenjs-min-max-loop– Schleife für Min/Max anstelle von sort verwendenjs-set-map-lookups– Set/Map für O(1)-Lookups verwendenjs-tosorted-immutable– toSorted() für Unveränderlichkeit verwendenjs-flatmap-filter– flatMap zum Mappen und Filtern in einem Durchlauf verwendenjs-request-idle-callback– Nicht kritische Arbeit in Browser-Leerlauf verschieben
8. Fortgeschrittene Muster (NIEDRIG)
advanced-effect-event-deps– Ergebnisse von useEffectEvent nicht in Effekt-Abhängigkeiten aufnehmenadvanced-event-handler-refs– Event-Handler in Refs speichernadvanced-init-once– App einmal pro App-Lauf initialisierenadvanced-use-latest– useLatest für stabile Callback-Refs
So verwenden Sie
Lesen Sie einzelne Regeldateien für detaillierte Erklärungen und Codebeispiele:
rules/async-parallel.md
rules/bundle-barrel-imports.md
Jede Regeldatei enthält:
- Kurze Erklärung, warum es wichtig ist
- Falsches Codebeispiel mit Erklärung
- Richtiges Codebeispiel mit Erklärung
- Zusätzlicher Kontext und Referenzen
Vollständiges kompiliertes Dokument
Für die vollständige Anleitung mit allen erweiterten Regeln: AGENTS.md