Best Practices und Code-Organisation in React Native
Best Practices und Code-Organisation
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Dieses Kapitel fasst zusammen, WARUM unser Projekt so strukturiert ist, wie es ist – als bewusste Rückschau über beide Serien hinweg ("React Native für Einsteiger" + "React Native für Profis"), mit besonderem Fokus auf die Unterschiede zu "React für Profis" Kapitel 45 (Web).
Die Ordnerstruktur im Rückblick
GENAU dieselbe Typ-basierte Struktur wie im Web-Pendant: screens/ (entspricht pages/ im Web), components/, store/, api/, types/. EIN Unterschied fällt sofort auf: kein hooks/-Ordner mehr – wir haben ihn in Kapitel 2 entfernt, weil useCart.js vollständig durch store/cartStore.ts ersetzt wurde. Ein guter Reminder: Ordnerstrukturen sind kein Selbstzweck, sie sollten sich mit der tatsächlichen Architektur mitentwickeln, nicht als Altlast bestehen bleiben.
Namenskonventionen: identisch, mit einer RN-Ergänzung
Alle Konventionen aus "React für Profis" Kapitel 45 gelten unverändert (PascalCase-Komponenten, use-Präfix für Hooks, handle/on-Präfix für Event-Handler/Callback-Props). RN-spezifisch dazu: Screen-Komponenten tragen KONSEQUENT das Suffix Screen (ProductListScreen, CartScreen), NICHT Page wie im Web-Pendant – eine kleine, aber in der RN-Community fest etablierte Konvention, die sofort signalisiert "das ist ein Navigations-Ziel", nicht "das ist eine wiederverwendbare Komponente".
Wann eine Screen-Datei aufteilen?
ProductListScreen ist nach 5 Kapiteln (Badge, Favoriten, Performance-Tuning) eine unserer größeren Dateien geworden. GENAU wie in "React für Profis" Kapitel 45 empfohlen: die Such-/Filter-Logik ließe sich in einen Custom Hook auslagern, die Header-Badge-Logik in eine eigene Komponente. Ein RN-spezifischer zusätzlicher Kandidat: getItemLayout/keyExtractor/renderItem-Funktionen einer komplexen FlatList lassen sich oft sinnvoll AUSSERHALB der Komponentenfunktion definieren (als eigenständige, benannte Funktionen statt Inline-Definitionen), was gleichzeitig Lesbarkeit UND Performance verbessert (stabile Funktionsreferenzen, siehe Kapitel 5).
Plattform-spezifischer Code: ein RN-eigenes Organisationsmuster
Ein Muster, das im Web-Pendant keine Entsprechung hat: Dateien mit .ios.tsx/.android.tsx-Endungen werden von Metro AUTOMATISCH plattformspezifisch aufgelöst, ohne Platform.select() (siehe "React Native Referenz", Thema "Plattform- und Geräteinformationen") explizit im Code schreiben zu müssen:
components/
ShareButton.ios.tsx # wird auf iOS automatisch geladen
ShareButton.android.tsx # wird auf Android automatisch geladen
# Beide exportieren dieselbe Komponente unter demselben Namen -
# der Rest der App importiert einfach "./ShareButton", ohne die Plattform zu kennenNutzen Sie dieses Muster, wenn sich die Implementierung ZWISCHEN Plattformen so stark unterscheidet, dass Platform.select() innerhalb EINER Datei unübersichtlich würde – für kleinere Unterschiede (wie unser elevation/shadow*-Beispiel aus der "React Native Referenz"-Serie) bleibt Platform.select() die einfachere Wahl.
ESLint für React Native
npx expo install --dev eslint eslint-config-expoeslint-config-expo ist das RN-spezifische Äquivalent zu eslint-plugin-react-hooks aus "React für Profis" Kapitel 45 – enthält dieselben Hooks-Regeln PLUS zusätzliche, Expo-/RN-spezifische Regeln (z. B. Warnungen bei veralteten Image-Props, die durch expo-image-Äquivalente ersetzt werden sollten).
Tipp: Derselbe Kernratschlag wie im Web-Pendant: KONSISTENZ schlägt "Perfektion". Unser Projekt hat mehrere leicht unterschiedliche, aber konsequent durchgehaltene Muster etabliert (Zustand für Warenkorb, Redux Toolkit für Favoriten, Screen-Suffix für Navigation) – wichtiger als "welches Muster ist theoretisch am besten" ist, dass ein neuer Teamkollege, der EIN Beispiel versteht, sofort ALLE ähnlich strukturierten Stellen im Projekt wiedererkennt.