Read in other languages: English 🇺🇸, Polska 🇵🇱, German 🇩🇪, French 🇫🇷, Spanish 🇪🇸, Українська 🇺🇦.
1. Was ist React Native und worin unterscheidet es sich von React?
React Native ist ein Open-Source-Framework zur Entwicklung mobiler Anwendungen mit JavaScript/TypeScript und React.
Wichtigster Unterschied:
- React (React.js): erstellt Web-UIs, die in das Browser-DOM (
div,spanusw.) gerendert werden. - React Native: erstellt iOS/Android-Apps, die in native Plattform-
Komponenten (
View,Text,Imageusw.) gerendert werden.
Beide nutzen dasselbe Komponentenmodell, props/state und Hooks, zielen aber auf unterschiedliche Plattformen und Rendering-Layer.
Kurz gesagt
React Native ist für mobile Apps mit nativen UI-Komponenten, React für Web-UIs im DOM.
2. Erkläre das Konzept von JSX in React Native.
JSX (JavaScript XML) ist eine Syntax-Erweiterung, mit der du UI-Strukturen innerhalb von JavaScript deklarativ in einem HTML-ähnlichen Stil schreiben kannst.
In React Native wird JSX mit nativen Komponenten verwendet:
function Greeting() {
return <Text>Hello, React Native!</Text>;
}Hinweise:
- JSX ist kein HTML. Es wird von Babel in JavaScript-Aufrufe umgewandelt.
- JavaScript-Ausdrücke können in
{}eingebettet werden. - In React Native nutzt JSX native Komponenten (
View,Text) statt Browser- Tags (div,p).
Kurz gesagt
JSX ist eine bequeme Schreibweise zur UI-Beschreibung, die React Native auf native Komponenten abbildet.
3. Wie erstellt man eine funktionale Komponente in React Native?
Eine funktionale Komponente ist eine JavaScript-Funktion, die JSX zurückgibt.
import React from 'react';
import { View, Text } from 'react-native';
function ProfileCard() {
return (
<View>
<Text>Profile</Text>
</View>
);
}
export default ProfileCard;Du kannst auch die Arrow-Function-Syntax verwenden:
const ProfileCard = () => (
<View>
<Text>Profile</Text>
</View>
);Kurz gesagt
Es ist eine normale Funktion, die JSX zurückgibt, häufig kombiniert mit Hooks für State und Effekte.
4. Was sind Core Components in React Native (View, Text, Image usw.)?
Core Components sind eingebaute UI-Bausteine von React Native zum Aufbau mobiler Oberflächen.
Häufige Core Components:
- View: grundlegender Container für Layout und Styling.
- Text: zeigt Textinhalte an.
- Image: rendert Bilder aus lokalen Assets oder von URLs.
- TextInput: Eingabefeld für Text.
- ScrollView: scrollbarer Container.
- FlatList / SectionList: effizientes Rendering großer Listen.
- Pressable / TouchableOpacity: verarbeitet Touch-Interaktionen.
- SafeAreaView: berücksichtigt sichere Bildschirmbereiche (Notches, abgerundete Ecken).
Diese Komponenten werden auf native UI-Elemente unter iOS und Android gemappt.
Kurz gesagt
Das sind die zentralen Bausteine von React Native, aus denen die Oberfläche zusammengesetzt wird.
5. Was sind Props in React Native und wie werden sie verwendet?
Props (Properties) sind schreibgeschützte Eingabewerte, die von einer Elternkomponente an eine Kindkomponente übergeben werden.
Sie werden verwendet, um:
- Daten zu übergeben (Text, Zahlen, Objekte, Arrays).
- Verhalten zu übergeben (Callback-Funktionen).
- Wiederverwendbare Komponenten zu konfigurieren.
Beispiel:
import { View, Text } from 'react-native';
function WelcomeMessage({ name }) {
return (
<View>
<Text>Welcome, {name}!</Text>
</View>
);
}
function App() {
return <WelcomeMessage name="Alex" />;
}Hier ist name ein Prop, das von App an WelcomeMessage übergeben wird.
Kurz gesagt
Props sind unveränderliche Eingaben, um Daten und Verhalten von oben nach unten im Komponentenbaum weiterzugeben.
6. Was ist State in React Native und wie wird er mit Hooks verwaltet?
State sind komponenteneigene Daten, die sich im Laufe der Zeit ändern können und UI-Updates auslösen.
In funktionalen Komponenten wird State meist mit dem useState-Hook verwaltet:
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
function Counter() {
const [count, setCount] = useState(0);
return (
<View>
<Text>Count: {count}</Text>
<Button title="Increment" onPress={() => setCount(count + 1)} />
</View>
);
}Für komplexere Logik kannst du useReducer verwenden.
Kurz gesagt
State sind veränderliche lokale Daten; mit Hooks aktualisierst du sie vorhersehbar und löst gezielt Re-Renders aus.
7. Was ist der Unterschied zwischen State und Props?
state und props speichern beide Daten für das Rendering, haben aber
unterschiedliche Rollen:
- Props: schreibgeschützte Eingaben, die von Eltern- an Kindkomponenten übergeben werden.
- State: interne, veränderliche Daten, die von der Komponente selbst verwaltet werden.
Schnellvergleich:
- Wem gehören die Daten? Props: Elternkomponente. State: aktuelle Komponente.
- Lokal veränderbar? Props: nein. State: ja, z. B. über
useState. - Einsatzzweck: Props: Konfiguration und Datenfluss zwischen Komponenten. State: dynamisches UI-Verhalten innerhalb einer Komponente.
Kurz gesagt
Der Kernunterschied ist Ownership: Props kommen von außen, State gehört der Komponente.
8. Wie verarbeitet man Benutzereingaben in React Native?
Benutzereingaben werden meist über kontrollierte Komponenten verarbeitet,
häufig mit TextInput in Kombination mit State.
import React, { useState } from 'react';
import { View, TextInput, Text } from 'react-native';
function NameForm() {
const [name, setName] = useState('');
return (
<View>
<TextInput
value={name}
onChangeText={setName}
placeholder="Enter your name"
/>
<Text>Hello, {name}</Text>
</View>
);
}Wichtige Events/Handler:
onChangeText: aktualisiert den Text im State.onPress: verarbeitet Button-/Touch-Aktionen.onSubmitEditing: reagiert auf das Absenden über die Tastatur imTextInput.
Kurz gesagt
Bei kontrollierten Inputs liegt der Wert im State und wird über Handler aktualisiert.
9. Wie stylt man Komponenten in React Native?
React Native verwendet JavaScript-Objekte für Styles statt CSS-Dateien.
Du kannst Komponenten auf drei gängige Arten stylen:
- Inline-Styles (schnell, lokal):
<Text style={{ color: 'blue', fontSize: 18 }}>Hello</Text>StyleSheet.create(für die meisten Fälle empfohlen):
const styles = StyleSheet.create({
title: { color: 'blue', fontSize: 18 },
});- Style-Arrays (bedingt/komponiert):
<Text style={[styles.title, isActive && styles.active]}>Hello</Text>Die Syntax ist CSS-ähnlich, aber mit camelCase-Eigenschaften (z. B.
backgroundColor, fontSize).
Kurz gesagt
RN-Styles sind JS-Objekte; zentral definierte Styles verbessern Konsistenz und Wiederverwendbarkeit.
10. Was ist StyleSheet und wann sollte man es verwenden?
StyleSheet ist ein React-Native-Utility, um Styles strukturiert zu definieren
und zu organisieren.
Beispiel:
import { StyleSheet, View, Text } from 'react-native';
const styles = StyleSheet.create({
container: {
padding: 16,
backgroundColor: '#fff',
},
title: {
fontSize: 20,
fontWeight: '600',
},
});
function Card() {
return (
<View style={styles.container}>
<Text style={styles.title}>Card title</Text>
</View>
);
}Wann verwenden:
- Wenn Styles in mehreren Elementen wiederverwendet werden.
- Wenn du saubereren, wartbaren Komponentencode willst.
- Wenn du einen konsistenten, skalierbaren Styling-Ansatz für größere Screens/ Apps brauchst.
Kurz gesagt
StyleSheet ist sinnvoll für saubere, wiederverwendbare Styles und bessere Wartbarkeit.
11. Erkläre Flexbox und seine Rolle im Layout.
Flexbox ist das primäre Layout-System in React Native. Es steuert, wie Komponenten in einem Container dimensioniert, ausgerichtet und verteilt werden.
In React Native unterscheiden sich einige Flexbox-Defaults leicht von Web-CSS:
flexDirectionist standardmäßigcolumn.alignContentist standardmäßigflex-start.flexShrinkist standardmäßig0.
Häufige Eigenschaften:
flex: legt fest, wie viel Platz ein Element relativ zu Geschwistern einnimmt.flexDirection: Layout in Zeile oder Spalte.justifyContent: Ausrichtung auf der Hauptachse.alignItems: Ausrichtung auf der Querachse.gap(in modernen RN-Versionen): Abstand zwischen Kind-Elementen.
Beispiel:
<View
style={{ flex: 1, flexDirection: 'row', justifyContent: 'space-between' }}
>
<View style={{ width: 50, height: 50, backgroundColor: 'red' }} />
<View style={{ width: 50, height: 50, backgroundColor: 'blue' }} />
</View>Kurz gesagt
Flexbox basiert auf Achsenlogik: Hauptachse vs. Querachse plus korrektes
justify/align.
12. Wie setzt man Responsive Design in React Native um?
Responsive Design in React Native entsteht durch die Kombination aus flexiblen Layouts und gerätebewussten APIs.
Gängige Ansätze:
- Flexbox (
flex,%, Ausrichtung) statt fester Größen verwenden. DimensionsoderuseWindowDimensions()für Bildschirmgrößen nutzen.Platformfür plattformspezifische Anpassungen einsetzen.SafeAreaViewnutzen, um Notches und System-UI zu berücksichtigen.- Typografie/Abstände über gemeinsame Konstanten skalieren.
Beispiel:
import { useWindowDimensions, View } from 'react-native';
function ResponsiveCard() {
const { width } = useWindowDimensions();
const isTablet = width >= 768;
return <View style={{ padding: isTablet ? 24 : 16 }} />;
}Kurz gesagt
In RN bedeutet Responsiveness meist: flexible Layouts + Bildschirmmaße + Safe-Area-Berücksichtigung.
13. Wie debuggt man eine React-Native-Anwendung?
Debugging in React Native erfolgt typischerweise mit einer Kombination aus integrierten und externen Tools.
Wichtige Optionen:
- Metro-Logs:
console.log, Warnungen und Fehler im Terminal/Output. - React Native Dev Menu: App neu laden, UI inspizieren, Debug-Tools aktivieren.
- React DevTools: Komponentenbaum, Props und Hook-State inspizieren.
- Flipper: Netzwerk-Inspektion, Logs, Layout-Inspektion, Performance-Plugins.
- Native Tooling: Xcode (iOS) und Android Studio (Android) für native Crashes und Logs.
Best Practice: Probleme mit klaren Schritten reproduzieren, die fehlerhafte Komponente isolieren und auf iOS und Android verifizieren.
Kurz gesagt
Am zuverlässigsten ist ein Tool-Stack aus Logs, DevTools/Flipper und nativen Logs für plattformspezifische Fehler.
14. Was ist Fast Refresh und wie funktioniert es?
Fast Refresh ist eine Entwicklungsfunktion, die die App nach Code-Änderungen sofort aktualisiert und dabei möglichst den Komponenten-State erhält.
So funktioniert es:
- Du speicherst eine Datei.
- Metro baut nur betroffene Module neu.
- React Native injiziert den aktualisierten Code in die laufende App.
- Die UI aktualisiert sich in den meisten Fällen ohne vollständigen Neustart.
Hinweise:
- Lokaler State bleibt bei funktionalen Komponenten oft erhalten.
- Wenn Änderungen die Modulinitialisierung oder Nicht-Komponenten-Exporte betreffen, kann React Native breiter neu laden.
- Es ist ein reines Dev-Feature und kein Produktionsverhalten.
Kurz gesagt
Fast Refresh bringt Änderungen schnell ins laufende Build und behält häufig den lokalen State.
15. Was sind Touchable-Komponenten und wie funktionieren sie?
Touchable-Komponenten sind interaktive Wrapper, die auf Taps/Presses reagieren. Damit können Nutzer Aktionen wie Screen-Wechsel, Formular-Submit oder Auswahl von Elementen auslösen.
Häufige Optionen:
Pressable(modern und flexibel, in vielen Fällen empfohlen).TouchableOpacity(ändert die Opazität beim Drücken).TouchableHighlight(zeigt eine Hervorhebung unter dem Kind-Element).TouchableWithoutFeedback(ohne visuelles Feedback).
Beispiel:
import { Pressable, Text } from 'react-native';
function SaveButton({ onSave }) {
return (
<Pressable onPress={onSave}>
<Text>Save</Text>
</Pressable>
);
}Sie bieten Events wie onPress, onPressIn, onPressOut und onLongPress.
Kurz gesagt
Das sind UI-Wrapper für Press-Interaktionen; in modernen Projekten ist
Pressable oft der Standard.
16. Wie handhabt man Navigation in React Native (React Navigation)?
Navigation wird in React Native üblicherweise mit @react-navigation/*
umgesetzt.
Typisches Setup:
- React-Navigation-Core und benötigte Navigatoren installieren.
- Die App mit
NavigationContainerumschließen. - Stack-/Tab-/Drawer-Navigatoren definieren.
- Mit
navigation.navigate('ScreenName')navigieren.
Für die meisten Apps ist eine Kombination aus Stack + Tab sinnvoll, mit klar getypten Routen.
Kurz gesagt
Nutze die Komposition aus Stack/Tab/Drawer und halte die Routenstruktur explizit.
17. Welche Rolle hat NavigationContainer?
NavigationContainer ist der Root-Provider, der den Navigationszustand verwaltet
und Navigatoren mit der App-Umgebung verbindet.
Er ist zuständig für:
- Das Halten des aktuellen Navigationsbaum-Zustands.
- Die Verarbeitung von Linking/Deep Links.
- Das Bereitstellen des Navigationskontexts für alle Screens.
Ohne ihn funktioniert React Navigation nicht.
Kurz gesagt
Er ist der zentrale Navigationskontext und State-Holder der gesamten App.
18. Wie übergibt man Parameter zwischen Screens?
Parameter werden über Navigationsmethoden übergeben.
Beispiel:
navigation.navigate('Profile', { userId: '42' });Parameter im Ziel-Screen auslesen:
const { userId } = route.params;Nutze Params für kleinen Routen-Kontext, nicht für großen/globalen App-State.
Kurz gesagt
Übergib kleine Routenparameter via navigate und lies sie über route.params
aus.
19. Was ist Deep Linking und wie implementiert man es?
Deep Linking ermöglicht, einen bestimmten App-Screen über eine URL zu öffnen.
Implementierung mit React Navigation:
- URL-Scheme/Universal Links in nativen Konfigurationen definieren.
- Das
linking-Objekt imNavigationContainerkonfigurieren. - URL-Pfade auf Screen-Namen mappen.
So lassen sich z. B. Links wie myapp://product/123 direkt auf den
Produktscreen öffnen.
Kurz gesagt
Deep Linking mappt URLs auf Screens, damit externe Links direkt die passende Route öffnen.
20. Was sind Keys in Listen und warum sind sie wichtig?
key identifiziert Listenelemente eindeutig für React Reconciliation.
Warum wichtig:
- React kann gezielt nur geänderte Zeilen aktualisieren.
- Verhindert fehlerhafte Wiederverwendung von Elementen/State-Bugs.
- Verbessert Rendering-Performance und Vorhersagbarkeit.
Verwende stabile, eindeutige IDs statt des Array-Index (außer bei statischen Listen).
Kurz gesagt
Stabile, eindeutige Keys vermeiden Listen-Bugs und verbessern die Effizienz beim UI-Update.
21. Wie rendert man Listen effizient (FlatList, SectionList)?
Für effizientes Listen-Rendering in React Native solltest du FlatList und
SectionList bevorzugen, statt große Arrays innerhalb von ScrollView zu
mappen.
Warum sie effizient sind:
- Sie rendern Elemente lazy (nur sichtbare Zeilen + Puffer).
- Sie recyceln Item-Views und reduzieren den Speicherverbrauch.
- Sie bieten eingebaute Pagination- und Scroll-Optimierungen.
Einsatzfälle:
FlatList: eindimensionale Liste ähnlicher Elemente.SectionList: gruppierte Liste mit Abschnittsüberschriften.
Einfaches FlatList-Beispiel:
import { FlatList, Text, View } from 'react-native';
function UsersList({ users }) {
return (
<FlatList
data={users}
keyExtractor={item => item.id}
renderItem={({ item }) => (
<View>
<Text>{item.name}</Text>
</View>
)}
/>
);
}Kurz gesagt
Für große Datenmengen sind virtualisierte Listen die beste Wahl für Speicher- und Scroll-Performance.
22. Was ist VirtualizedList und wann sollte man sie verwenden?
VirtualizedList ist die Basis-Engine hinter FlatList und SectionList.
Sie übernimmt windowed rendering für große Datensätze.
Direkter Einsatz ist sinnvoll, wenn:
- deine Datenquelle kein einfaches Array ist,
- du volle Kontrolle über
getItemundgetItemCountbrauchst, FlatList/SectionList-Abstraktionen nicht ausreichen.
In den meisten Apps sind FlatList oder SectionList der bessere Start,
weil sie einfacher sind und typische Szenarien abdecken.
Kurz gesagt
VirtualizedList direkt nur bei Spezialfällen nutzen; sonst reichen FlatList/ SectionList meist aus.
23. Wie lädt man Daten in React Native (fetch, axios)?
Daten kannst du mit dem eingebauten fetch-API oder mit axios laden.
fetch-Beispiel:
async function loadPosts() {
const response = await fetch('https://api.example.com/posts');
if (!response.ok) throw new Error('Request failed');
return response.json();
}axios-Beispiel:
import axios from 'axios';
async function loadPosts() {
const { data } = await axios.get('https://api.example.com/posts');
return data;
}Typischer Ablauf in einer Komponente:
- Loading-State starten.
- Asynchronen Request ausführen.
- Ergebnis oder Fehler im State speichern.
- Loading beenden und entsprechend rendern.
Kurz gesagt
Wichtig ist ein klarer Request-Lifecycle: loading, success, error und saubere Fehlerbehandlung.
24. Was sind Best Practices für API-Calls und Error Handling?
Best Practices für API und Fehlerbehandlung:
- API-Logik in einer Service-Schicht zentralisieren.
- Immer Loading-, Success- und Error-States behandeln.
- Timeouts und Retry-Strategie für temporäre Fehler festlegen.
- Response-Shape vor Nutzung validieren.
- Nutzerfreundliche Fehlermeldungen anzeigen (keine rohen Serverfehler).
- Cancellation (
AbortController) nutzen, um unmounted Screens nicht zu aktualisieren. - Auth-Token-Refresh zentral an einer Stelle halten (Interceptors/Middleware).
Kurzes Muster:
tryRequest.catchNetzwerk-/Serverfehler.- Auf domänenspezifische Fehler mappen.
- Technische Details für Debugging/Monitoring loggen.
Kurz gesagt
Zentralisierte API-Schicht, konsistentes Error-Mapping und klare Retry/Cancel- Strategie sind entscheidend.
25. Wie geht man mit Async Storage um (AsyncStorage Community-Paket)?
AsyncStorage ist eine persistente Key-Value-Lösung für leichte Daten wie
Benutzereinstellungen, Flags und einfache Caches.
Grundlegende Nutzung:
import AsyncStorage from '@react-native-async-storage/async-storage';
async function saveTheme(theme) {
await AsyncStorage.setItem('theme', theme);
}
async function loadTheme() {
return AsyncStorage.getItem('theme');
}Best Practices:
- Objekte mit
JSON.stringify/JSON.parseserialisieren. - Aufrufe in
try/catchkapseln. - Payloads klein halten; nicht als Datenbank verwenden.
- Schlüssel mit Namespace versehen (z. B.
app:user:token). - Für sensible Daten sichere Speicherlösungen nutzen (Keychain/Keystore).
Kurz gesagt
AsyncStorage ist gut für leichte Persistenz, aber nicht für Secrets; Daten serialisieren und Fehler sauber behandeln.
26. Was sind moderne State-Management-Lösungen (Context, Zustand, Redux Toolkit)?
Die passende Lösung hängt vor allem vom Umfang der App und vom Team ab:
- Context API: geeignet für einfache globale Daten mit wenig Boilerplate.
- Zustand: leichtgewichtig, schnell einzurichten, gute Ergonomie.
- Redux Toolkit: strukturierter Ansatz mit Middleware, DevTools und klaren Mustern für größere Projekte.
Wähle das kleinste Tool, das die tatsächliche Komplexität zuverlässig abdeckt.
Kurz gesagt
Bei kleinen Anforderungen reicht Context oft aus, bei wachsender Domänenlogik sind Zustand oder RTK meist die bessere Wahl.
27. Wie verwaltet man globalen State ohne Redux?
Globaler State lässt sich gut mit Context + Hooks oder mit schlanken Stores wie Zustand/Jotai lösen.
Ein verbreitetes Vorgehen:
- Provider pro Domäne definieren.
- Updates in Custom Hooks kapseln.
- Server-State getrennt halten (z. B. React Query/Apollo).
So bleibt die Architektur klar, ohne den Overhead einer vollständigen Redux-Umgebung.
Kurz gesagt
Nutze Context oder leichte Stores plus saubere Hook-Abstraktionen, wenn Redux für dein Szenario zu schwer ist.
28. Was sind React Hooks und welche werden häufig verwendet?
Hooks sind Funktionen, mit denen Funktionskomponenten State, Side Effects und weitere React-Features verwenden können.
Häufige Hooks:
useStateuseEffectuseMemouseCallbackuseRefuseContextuseReducer
Durch eigene Hooks lässt sich wiederverwendbare Logik sauber aus Komponenten auslagern.
Kurz gesagt
Hooks bringen zustandsbehaftete Logik in Funktionskomponenten und fördern Wiederverwendung über Custom Hooks.
29. Was ist useEffect und wie ersetzt es Lifecycle-Methoden?
useEffect führt Side Effects nach dem Rendern aus und kann bei Bedarf Aufräumlogik zurückgeben.
Typische Zuordnung von Klassen-Lifecycle zu Hooks:
componentDidMount->useEffect(..., [])componentDidUpdate->useEffect(..., [deps])componentWillUnmount-> Cleanup-Funktion aususeEffect
Damit wird Lifecycle-Verhalten in Funktionskomponenten einheitlich abgebildet.
Kurz gesagt
Mit useEffect steuerst du Effekte und Cleanup über Abhängigkeiten statt über separate Klassenmethoden.
30. Was sind useMemo und useCallback und wann sollte man sie einsetzen?
useMemo zwischenspeichert berechnete Werte, useCallback stabilisiert Funktionsreferenzen.
Sinnvoller Einsatz, wenn:
- Berechnungen teuer sind.
- stabile Referenzen Child-Re-Renders reduzieren.
- Werte/Funktionen als Dependencies in anderen Hooks genutzt werden.
Wichtig: nicht pauschal einsetzen, sondern dort, wo Profiling einen echten Nutzen zeigt.
Kurz gesagt
useMemo und useCallback gezielt zur Stabilisierung verwenden, wenn messbare Performancegewinne nötig sind.
31. Was sind Refs und wann sollte man sie verwenden?
Refs sind veränderbare Referenzen auf Komponenteninstanzen oder native Elemente. Damit kannst du imperative APIs nutzen, ohne Re-Renders auszulösen.
Typische Anwendungsfälle:
TextInputfokussieren oder Fokus entfernen.- Scroll-Methoden auslösen (
scrollToOffset,scrollToEnd). - Layout messen (
measure,measureInWindow). - Mutable Werte speichern, die keine UI-Aktualisierung triggern sollen.
Beispiel:
import React, { useRef } from 'react';
import { View, TextInput, Button } from 'react-native';
function LoginForm() {
const inputRef = useRef(null);
return (
<View>
<TextInput ref={inputRef} placeholder="Email" />
<Button title="Focus input" onPress={() => inputRef.current?.focus()} />
</View>
);
}Nutze Refs für imperative Aktionen, nicht als Ersatz für normalen State/Props-Flow.
Kurz gesagt
Refs sind für direkten imperativen Zugriff gedacht (Fokus/Scroll/Messung), nicht für regulären Datenfluss.
32. Wie erstellt man Custom Hooks?
Ein Custom Hook ist eine wiederverwendbare Funktion mit Präfix use, die React Hooks (useState, useEffect usw.) zu gemeinsamer Logik bündelt.
Regeln:
- Der Name muss mit
usebeginnen. - Hooks nur auf oberster Ebene des Custom Hooks aufrufen.
- Nur die Werte/Funktionen zurückgeben, die Komponenten brauchen.
Beispiel:
import { useEffect, useState } from 'react';
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
// Hier Netzwerkänderungen abonnieren
return () => {
// Hier Abo aufräumen
};
}, []);
return isOnline;
}Custom Hooks verbessern Wiederverwendung, Lesbarkeit und Trennung von Verantwortlichkeiten.
Kurz gesagt
Lagere wiederkehrende zustandsbehaftete Logik in use*-Funktionen aus, damit Komponenten schlank bleiben.
33. Was bedeutet Performance-Optimierung in React Native?
Performance-Optimierung heißt in React Native, Render-, JavaScript- und Layout-Overhead zu reduzieren, damit Interaktionen flüssig bleiben (auch auf schwächeren Geräten).
Wichtige Bereiche:
- Rendering: unnötige Re-Renders vermeiden.
- Listen:
FlatList/SectionListrichtig konfigurieren. - JavaScript-Workload: teure Berechnungen aus kritischen Render-Pfaden nehmen.
- Bilder: korrekt skalieren, komprimieren und cachen.
- JS-Native-Kommunikation: kostenintensive Cross-Layer-Operationen minimieren.
Ziele sind typischerweise stabile 60 FPS, schneller Start und reaktionsschnelle Touch-Interaktionen.
Kurz gesagt
Erst messen, dann gezielt Renderpfade, Listen, Bilder und JS-Hotspots optimieren.
34. Wie vermeidet man unnötige Re-Renders?
Unnötige Re-Renders vermeidest du, indem Props stabil bleiben und State nur dann aktualisiert wird, wenn es wirklich nötig ist.
Praktische Techniken:
React.memofür reine Funktionskomponenten nutzen.useMemofür teure abgeleitete Werte einsetzen.useCallbackfür stabile Callback-Referenzen verwenden.- State möglichst lokal halten.
- Keine neuen Objekte/Funktionen inline erzeugen, wenn sie tief als Props weitergereicht werden.
- Große Komponenten in kleinere, fokussierte Teile aufspalten.
- In Listen stabile Keys verwenden.
Zusätzlich immer profilen (React DevTools/Flipper) und nur echte Bottlenecks optimieren.
Kurz gesagt
Stabile Props, lokaler State und selektive Memoisierung senken unnötige Renderkosten effektiv.
35. Was ist Memoization in React Native?
Memoization ist eine Technik, bei der berechnete Ergebnisse oder Render-Ausgaben zwischengespeichert und wiederverwendet werden, solange sich die Eingaben nicht ändern.
Typische Werkzeuge in React Native:
React.memo: memoisiert Komponenten-Rendering per Props-Vergleich.useMemo: memoisiert berechnete Werte.useCallback: memoisiert Funktionsreferenzen.
Beispiel:
import React, { useMemo } from 'react';
function Total({ items }) {
const sum = useMemo(() => {
return items.reduce((acc, item) => acc + item.price, 0);
}, [items]);
return <Text>{sum}</Text>;
}Memoization gezielt einsetzen; übermäßige Nutzung erhöht Komplexität ohne garantierten Nutzen.
Kurz gesagt
Memoization verhindert unnötige Neuberechnungen und Re-Renders, wenn Inputs unverändert bleiben.
36. Was ist die Hermes-Engine und warum ist sie wichtig?
Hermes ist eine JavaScript-Engine, die speziell für React Native optimiert wurde.
Warum sie wichtig ist:
- Schnellere App-Startzeit.
- Geringerer Speicherverbrauch auf vielen Geräten.
- Stabilere und besser vorhersagbare Performance auf Android/iOS.
- Gute Integration in das RN-Tooling.
Hermes ist in vielen produktiven React-Native-Apps die Standardwahl.
Kurz gesagt
Hermes verbessert in vielen RN-Apps vor allem Startverhalten und Speichernutzung.
37. Was ist die neue React-Native-Architektur?
Die New Architecture modernisiert die internen RN-Mechanismen und basiert auf:
- Fabric Renderer.
- TurboModules.
- JSI (JavaScript Interface).
- Bridgeless-Ausrichtung.
Ziele sind niedrigere Latenz zwischen JS und Native, bessere Concurrency-Unterstützung und höhere Gesamtperformance.
Kurz gesagt
Die neue Architektur kombiniert Fabric, TurboModules und JSI, um Overhead zu senken und besser zu skalieren.
38. Was sind Fabric und TurboModules?
Fabric ist das neue Rendering-System, TurboModules sind das moderne Modul-System für native Funktionen.
Gemeinsam ermöglichen sie:
- Effizientere UI-Aktualisierungen.
- Schnelleren Zugriff auf native Module.
- Bessere Typsicherheit durch Codegen.
- Verbesserte Start- und Laufzeitperformance.
Kurz gesagt
Fabric modernisiert das UI-Rendering, TurboModules modernisieren den Zugriff auf native APIs.
39. Was ist JSI und wie ersetzt es die alte Bridge?
JSI (JavaScript Interface) ist eine C++-Schnittstelle, über die JavaScript und Native deutlich direkter miteinander kommunizieren.
Im Vergleich zur alten Bridge:
- Weniger schwergewichtiges asynchrones JSON-Messaging.
- Niedrigerer Overhead bei Aufrufen und Runtime-Integrationen.
- Grundlage für Features der neuen Architektur wie TurboModules/Fabric.
Dadurch werden Kommunikationsengpässe zwischen den Schichten spürbar reduziert.
Kurz gesagt
JSI ersetzt den Bridge-Overhead durch direktere JS-Native-Kommunikation.
40. Was ist der Bridgeless-Modus in React Native?
Der Bridgeless-Modus ist eine Architektur-Richtung, bei der React Native ohne den Legacy-Bridge-Laufzeitpfad arbeitet.
Vorteile:
- Weniger Kommunikations-Overhead.
- Klareres, moderneres Runtime-Modell.
- Bessere Abstimmung mit Fabric, TurboModules und JSI.
Er ist Teil der langfristigen Entwicklung von RN in Richtung mehr Performance und Wartbarkeit.
Kurz gesagt
Bridgeless reduziert die Abhängigkeit von der alten Bridge und verbessert so die moderne Runtime-Basis.
41. Wie erreicht React Native eine nahezu native Performance?
React Native erreicht eine nahezu native Performance, indem echte native UI-Komponenten gerendert und die Arbeit zwischen JavaScript- und Native-Schicht gezielt optimiert wird.
Wesentliche Gründe:
- Die UI wird mit nativen Views (
UIView,android.view) statt in einer WebView dargestellt. - Das deklarative Update-Modell von React reduziert unnötige UI-Arbeit.
- Hermes kann Startzeit und Speichernutzung verbessern.
- Die New Architecture (Fabric, TurboModules, JSI) senkt Bridge-Overhead.
- Optimierte Listenkomponenten (
FlatList,SectionList) nutzen Virtualisierung.
Die tatsächliche Performance hängt trotzdem vom App-Design ab: schwere JS-Tasks, unoptimierte Re-Renders und große Bilder können die App ausbremsen.
Kurz gesagt
React Native wirkt nativ, wenn Renderpfade sauber optimiert und JavaScript-Last kontrolliert werden.
42. Was sind Native Modules und wann sollte man sie verwenden?
Native Modules sind plattformspezifische iOS/Android-Module, die native Funktionen für JavaScript verfügbar machen.
Du nutzt sie, wenn:
- benötigte APIs weder im RN-Core noch in Community-Paketen vorhanden sind,
- tieferer Zugriff auf Geräte-/OS-Funktionen nötig ist,
- bestimmte Logik aus Performancegründen nativ laufen soll.
Beispiele:
- Erweiterte Kamera- oder Bluetooth-Features.
- Integration proprietärer SDKs (Payments, Biometrics, Analytics).
- Betriebssystemspezifische Hintergrunddienste.
Wenn es ein gepflegtes Community-Paket gibt, ist das meist die bessere erste Option. Eigene Native Modules lohnen sich bei speziellen Anforderungen.
Kurz gesagt
Native Modules sind sinnvoll, wenn dir für wichtige Plattformfunktionen keine passende Standardlösung reicht.
43. Wie schreibt man nativen Code für React Native (Swift/Kotlin)?
Du schreibst nativen Code, indem du auf iOS (Swift/Objective-C) und/oder Android (Kotlin/Java) ein Modul erstellst und Methoden/Events nach JavaScript exponierst.
Typischer Ablauf:
- Native Modulklasse pro Plattform anlegen.
- Methoden, Konstanten und Events für React Native exportieren.
- Modul im nativen Projekt registrieren.
- Modul aus JavaScript/TypeScript aufrufen.
Minimales JS-Beispiel:
import { NativeModules } from 'react-native';
const { DeviceInfoModule } = NativeModules;
async function loadDeviceName() {
const name = await DeviceInfoModule.getDeviceName();
return name;
}In modernen RN-Projekten sind TurboModules/Codegen-Patterns für langfristige Kompatibilität meist vorzuziehen.
Kurz gesagt
Native Funktionen als Module bereitstellen und dann über klar definierte JS-Schnittstellen nutzen.
44. Wie integriert man React Native in eine bestehende native App?
React Native kann als einzelnes Feature in eine vorhandene iOS/Android-App eingebettet werden, statt die gesamte Anwendung neu zu schreiben.
Üblicher Ansatz:
- React-Native-Abhängigkeiten in die nativen Projekte aufnehmen.
- Bundle und Runtime-Setup für RN einrichten.
- Einen RN-Root-Screen aus der nativen Navigation starten.
- Daten über Props, Events oder Module zwischen Native und RN austauschen.
Typische Einsatzfälle:
- Ein plattformübergreifendes Modul (z. B. Einstellungen/Profil) in einer sonst nativen App.
- Schrittweise Migration älterer Screens.
So lässt sich das Risiko bei der Modernisierung senken und die Einführung von RN inkrementell steuern.
Kurz gesagt
RN lässt sich screenweise integrieren, damit Migration und Modernisierung kontrolliert und schrittweise erfolgen.
45. Wie geht man mit plattformspezifischem Code um (Platform API)?
Plattformspezifisches Verhalten wird mit der Platform-API und plattformspezifischen Dateiendungen umgesetzt.
Haupttechniken:
- Laufzeitprüfungen mit
Platform.OS(ios,android). - Plattformauswahl mit
Platform.select(...). - Dateisplitting über Endungen wie
Component.ios.tsxundComponent.android.tsx.
Beispiel:
import { Platform, Text } from 'react-native';
const label = Platform.select({
ios: 'Hello iOS',
android: 'Hello Android',
default: 'Hello',
});
function Screen() {
return <Text>{label}</Text>;
}Der beste Weg ist, möglichst viel Logik gemeinsam zu halten und nur notwendige Unterschiede zu isolieren.
Kurz gesagt
Nutze Platform-Checks oder plattformspezifische Dateien, aber halte den gemeinsamen Codeanteil so groß wie möglich.
46. Wie baut man Komponenten für Unterschiede zwischen iOS und Android?
Baue eine gemeinsame Kernlogik und trenne nur die Stellen, an denen sich UI oder Verhalten plattformspezifisch unterscheiden müssen.
Typische Techniken:
Platform.OSbzw.Platform.selectverwenden.- Dateien nach Plattform aufteilen (
Component.ios.tsx,Component.android.tsx). - Design-System-Tokens mit plattformspezifischen Overrides einsetzen.
Halte die Divergenz bewusst klein, damit Wartung und Weiterentwicklung nicht unnötig teuer werden.
Kurz gesagt
Ein gemeinsamer Komponentenvertrag plus gezielte Plattform-Overrides ist der robusteste Ansatz.
47. Wie geht man mit Gesten in React Native um?
Für zuverlässige und performante Interaktionen nutzt man in der Praxis spezialisierte Gesture-Libraries.
Gängiger Stack:
react-native-gesture-handlerfür Gestenerkennung.react-native-reanimatedfür flüssige, gestengesteuerte Animationen.- Kombination aus Tap-, Pan-, Fling- und Pinch-Handlern je nach Screen-Anforderung.
Wichtig ist, schwere JS-Arbeit während aktiver Gesten zu vermeiden.
Kurz gesagt
Für produktionsreife Gesture-UX: Gesture Handler für Erkennung, Reanimated für flüssige Reaktion.
48. Was ist PanResponder und wann sollte man ihn verwenden?
PanResponder ist der eingebaute Gesture-Responder von React Native für Touch-Bewegungen.
Sinnvoll, wenn:
- Gestenanforderungen einfach sind,
- möglichst keine zusätzliche Abhängigkeit gewünscht ist.
Für komplexe oder besonders performanzkritische Gesten ist meist die Kombination aus Gesture Handler und Reanimated besser geeignet.
Kurz gesagt
PanResponder passt für einfache Fälle; bei anspruchsvollen Gesten ist der moderne Library-Stack meist überlegen.
49. Welche Libraries nutzt man für Gesten (Gesture Handler, Reanimated)?
Der häufigste Produktions-Stack für Gesten besteht aus:
react-native-gesture-handlerfür robuste Gesture-Recognition.react-native-reanimatedfür performante Animationen und Worklets.
Beide werden meist gemeinsam eingesetzt, wenn Interaktionen flüssig und präzise sein müssen.
Kurz gesagt
Gesture Handler erkennt Gesten stabil, Reanimated setzt sie performant in Animationen um.
50. Was ist Reanimated und warum wird es verwendet?
Reanimated ist eine Hochleistungs-Animationsbibliothek für React Native.
Warum sie häufig eingesetzt wird:
- Flüssigere Animationen mit weniger Ruckeln.
- Sehr gute Unterstützung für gesture-getriebene Übergänge.
- Effizientes Ausführen der Animationslogik (Worklets, UI-thread-nahe Verarbeitung).
- Gut geeignet für komplexe Interaktionen wie Bottom Sheets oder Shared Transitions.
Kurz gesagt
Reanimated ist die Standardwahl für anspruchsvolle, performante Animationen in modernen RN-Apps.
51. Was ist die Animated API und wie funktioniert sie?
Animated ist das eingebaute Animationssystem von React Native, mit dem UI-Übergänge über animierte Werte umgesetzt werden.
Funktionsprinzip:
- Einen animierten Wert erstellen (
new Animated.Value(0)). - Diesen Wert an Style-Properties binden (
opacity,transformusw.). - Animationen mit APIs wie
Animated.timing,springoderdecaystarten.
Beispiel:
import React, { useRef } from 'react';
import { Animated, Button } from 'react-native';
function FadeInBox() {
const opacity = useRef(new Animated.Value(0)).current;
const start = () => {
Animated.timing(opacity, {
toValue: 1,
duration: 400,
useNativeDriver: true,
}).start();
};
return (
<>
<Animated.View
style={{ opacity, width: 120, height: 120, backgroundColor: 'tomato' }}
/>
<Button title="Fade in" onPress={start} />
</>
);
}Kurz gesagt
Animated arbeitet wertbasiert; mit useNativeDriver laufen unterstützte Animationen meist deutlich flüssiger.
52. Was ist der Unterschied zwischen deklarativen und imperativen Animationen?
Der Unterschied liegt darin, wie die Animation beschrieben und gesteuert wird.
- Deklarativ: Zielzustand und Übergang werden auf höherer Ebene definiert; das Framework übernimmt die Ausführung.
- Imperativ: Der Ablauf wird Schritt für Schritt manuell gesteuert (starten, stoppen, Werte aktualisieren).
In React Native gilt oft:
LayoutAnimationund viele Reanimated-Muster wirken deklarativ.Animated.Valuemit explizitem.start()-Orchestrieren wirkt eher imperativ.
Deklarative Ansätze sind meist wartbarer, imperative bieten mehr Feinkontrolle für komplexe Sequenzen.
Kurz gesagt
Deklarativ beschreibt das gewünschte Ergebnis, imperativ steuert den Ablauf explizit.
53. Wie implementiert man flüssige Animationen?
Für flüssige Animationen muss Arbeit auf dem Hauptthread reduziert und teure Re-Renders während der Bewegung vermieden werden.
Best Practices:
- Wenn möglich
useNativeDriver: truenutzen. transformundopacitybevorzugen statt layoutlastiger Properties.- Animierte Komponenten isolieren und bei Bedarf memoizen.
- Schwere Berechnungen während Gesten/Animationen vermeiden.
- Für anspruchsvolle Interaktionen
react-native-reanimatedeinsetzen. - Große Listen/Bilder optimieren, wenn sie mitanimiert werden.
Immer auf echten Mid-Range-Geräten testen, nicht nur im Emulator/Simulator.
Kurz gesagt
Setze auf transform/opacity und halte JS-Last während aktiver Animation minimal.
54. Was ist LayoutAnimation und wann sollte man es verwenden?
LayoutAnimation animiert globale Layout-Änderungen (Position/Größe), wenn Views eingefügt, entfernt oder in ihrer Größe verändert werden.
Sinnvolle Anwendungsfälle:
- Bereiche ein- und ausklappen.
- Listeneinträge mit einfachen Übergängen hinzufügen/entfernen.
- UI-Updates mit automatischer Layout-Interpolation.
Beispiel:
import { LayoutAnimation, UIManager, Platform } from 'react-native';
if (
Platform.OS === 'android' &&
UIManager.setLayoutAnimationEnabledExperimental
) {
UIManager.setLayoutAnimationEnabledExperimental(true);
}
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
setExpanded(prev => !prev);Für einfache Layout-Transitions ist es sehr praktisch; bei komplexen, gesture-getriebenen Abläufen ist Reanimated häufig die bessere Wahl.
Kurz gesagt
LayoutAnimation eignet sich für einfache Layout-Übergänge, nicht für komplexe Interaktions-Choreografien.
55. Wie geht man mit Safe Areas um (SafeAreaView)?
Safe Areas verhindern, dass Inhalte mit Notches, abgerundeten Ecken oder Systemleisten überlappen.
Empfohlener Ansatz:
react-native-safe-area-contextverwenden.- App-Root mit
SafeAreaProviderumschließen. - In Screens/Komponenten
SafeAreaViewoderuseSafeAreaInsets()nutzen.
Beispiel:
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
function App() {
return (
<SafeAreaProvider>
<SafeAreaView style={{ flex: 1 }}>{/* screen content */}</SafeAreaView>
</SafeAreaProvider>
);
}So bleibt das Spacing auf iOS und Android konsistent und Inhalte bleiben sichtbar.
Kurz gesagt
Mit Safe-Area-Context stellst du sicher, dass UI-Inhalte nicht von Notches oder System-UI verdeckt werden.
56. Wie geht man mit Änderungen der Geräteausrichtung um?
Ausrichtungswechsel verarbeitet man, indem man auf Dimensions-/Orientation-Änderungen hört und das Layout dynamisch anpasst.
Optionen:
useWindowDimensions()für responsive Neuberechnung.- Orientation-Libraries zum expliziten Sperren/Abonnieren.
- Native Plattformkonfiguration, wenn Rotation eingeschränkt werden muss.
Portrait-/Landscape-Übergänge sollten immer auf echten Geräten getestet werden.
Kurz gesagt
Reagiere auf Größen- und Ausrichtungsänderungen und passe das Layout ohne UX-Brüche an.
57. Was ist PixelRatio und wann ist es nützlich?
PixelRatio liefert Hilfsfunktionen zur Pixeldichte des Geräts.
Nützlich für:
- Skalierung von UI-Assets auf hochauflösenden Displays.
- Runden von Layoutgrößen, um Unschärfe zu vermeiden.
- Laden passender Bildgrößen je nach Dichte.
Damit werden Darstellungen über verschiedene Geräte hinweg schärfer und konsistenter.
Kurz gesagt
PixelRatio hilft bei dichtebewusster Skalierung, damit UI und Bilder auf allen Screens klar bleiben.
58. Wie implementiert man benutzerdefinierte Schriftarten?
Custom Fonts werden als App-Assets eingebunden und anschließend über fontFamily verwendet.
Typischer Ablauf:
- Font-Dateien (
.ttf/.otf) in Assets ablegen. - Linking konfigurieren (RN CLI oder Expo-Config).
- Font-Namen in Styles referenzieren.
- In Expo Fonts vor dem Rendern mit
expo-fontladen.
Eine konsistente Typografie-Skala plus Fallback-Strategie sorgt für stabile Darstellung.
Kurz gesagt
Schriften als Assets einbinden, korrekt laden und konsequent über ein Typografie-System einsetzen.
59. Wie berücksichtigt man Accessibility in React Native?
Barrierefreiheit sollte von Anfang an Teil der Komponentenentwicklung sein.
Wichtige Maßnahmen:
- Verständliche Labels und Hinweise setzen.
- Semantische Rollen und Zustände definieren.
- Ausreichenden Kontrast und Touch-Zielgrößen sicherstellen.
- Dynamische Textskalierung unterstützen.
- Mit VoiceOver (iOS) und TalkBack (Android) testen.
Accessibility verbessert die UX insgesamt, nicht nur für Nutzer mit Assistive Tech.
Kurz gesagt
Accessibility ist Basisqualität: klare Labels, korrekte Rollen/Zustände, guter Kontrast und Screen-Reader-Tests.
60. Was sind AccessibilityRole und AccessibilityState?
accessibilityRole beschreibt, was ein Element ist (z. B. Button, Header, Link).
accessibilityState beschreibt seinen aktuellen Zustand (z. B. disabled, selected, checked, busy, expanded).
Dadurch können Screen Reader interaktive Elemente mit relevantem Kontext ansagen.
Beispiel:
<Pressable
accessibilityRole="button"
accessibilityState={{ disabled: isDisabled }}
>
<Text>Submit</Text>
</Pressable>Kurz gesagt
Role beschreibt den Elementtyp, State den aktuellen Interaktionszustand.
61. Wie handhabt man Push-Benachrichtigungen?
Push-Notifications werden üblicherweise über Plattformdienste plus RN-Library umgesetzt.
Typisches Setup:
- Provider wählen: Firebase Cloud Messaging (FCM), APNs (iOS) oder Dienste wie OneSignal.
- Native Berechtigungen und Tokens konfigurieren (APNs-Token / FCM-Token).
- Listener für Foreground-, Background- und Opened-Events registrieren.
- Deep Links/Navigation beim Tippen auf eine Notification verarbeiten.
Häufige Libraries:
@react-native-firebase/messagingfür FCM.notifeefür erweiterte lokale/remote Notification-Handling-Szenarien.
Best Practice: kleine Payloads, abgesicherte Endpunkte und sauberes Token-Refresh-Handling.
Kurz gesagt
Wichtig sind saubere Token-Registrierung, Permission-Flow sowie Foreground/Background- und Tap-Navigation-Handling.
62. Wie implementiert man Background-Tasks?
Background-Tasks hängen von Plattformgrenzen und Aufgabentyp ab (Sync, Location, Uploads, Notifications).
Ansätze:
- Native Background-APIs über Libraries nutzen.
- Periodische Jobs für leichte Aufgaben planen.
- Auf Android Headless Tasks verwenden, wenn die App beendet/im Hintergrund ist.
Gängige Tools:
react-native-background-fetchfür periodische Fetch-Tasks.@react-native-firebase/messaging-Background-Handler für Push-getriggerte Arbeit.- Native Services/Worker für komplexere Fälle.
Wichtig: iOS und Android haben strikte Batterie-/Scheduling-Regeln, daher ist exaktes Timing nicht garantiert.
Kurz gesagt
Background-Verarbeitung ist plattformbeschränkt; plane auf Zuverlässigkeit statt auf sekundengenaue Ausführung.
63. Wie geht man mit Offline-Modus und Datensynchronisierung um?
Offline-Fähigkeit basiert auf einem Local-First-Ansatz plus Synchronisierung bei wiederhergestellter Verbindung.
Kernstrategie:
- Daten lokal persistieren (AsyncStorage, SQLite, Realm usw.).
- Schreiboperationen im Offline-Zustand in eine Queue legen.
- Konnektivitätsänderungen erkennen.
- Queue beim Reconnect erneut ausführen und Konflikte auflösen.
Empfohlene Praktiken:
- API-Operationen möglichst idempotent gestalten.
- Timestamps/Versionierung für Conflict Resolution verwenden.
- Klaren UI-Status anzeigen: offline, syncing, failed, synced.
- Retry-/Backoff-Policy gegen Request-Stürme einsetzen.
Kurz gesagt
Local-First-Speicherung plus Write-Queue und konfliktbewusster Sync macht Offline-UX robust.
64. Wie implementiert man Caching-Strategien?
Caching reduziert Latenz, Netzwerklast und unnötige Neuberechnungen.
Typische Cache-Ebenen:
- API-Response-Cache: In-Memory plus persistenter Cache.
- Image-Cache: optimierte Image-Libraries oder HTTP-Cache-Header.
- Computed-Data-Cache: Memoization (
useMemo) für teure Ableitungen. - Request-Cache: z. B. React Query/Apollo mit normalisierten Caches.
Praktische Regeln:
- TTL-/Invalidierungsregeln pro Ressource definieren.
- Stale-while-revalidate-Muster für responsive UI nutzen.
- Cache bei Logout oder Auth-Kontextwechsel bereinigen.
- Unbegrenztes Cache-Wachstum vermeiden.
Kurz gesagt
Wirksames Caching braucht klare Scopes und Invalidierung; stale-while-revalidate liefert oft die beste UX-Balance.
65. Was ist GraphQL und wie nutzt man es in React Native?
GraphQL ist eine Query-Sprache plus Runtime für APIs, bei der Clients exakt die Datenfelder anfragen, die sie benötigen.
Warum nützlich in React Native:
- Reduziert Over-Fetching und Under-Fetching.
- Passt gut zu screenbasierten Datenanforderungen.
- Arbeitet gut mit starken Client-Caching-Strategien.
Typische Nutzung:
- Queries/Mutations/Subscriptions definieren.
- Client-Library verwenden (meist Apollo Client).
- Operationen in Hooks/Komponenten ausführen.
- Loading-, Error- und Cache-Updates behandeln.
Kleines Beispielschema:
query GetUser($id: ID!) {
user(id: $id) {
id
name
avatar
}
}Kurz gesagt
Mit GraphQL fordert der Screen nur benötigte Felder an und minimiert unnötigen Datenverkehr.
66. Was ist Apollo Client und wann sollte man ihn verwenden?
Apollo Client ist ein verbreiteter GraphQL-Client für Queries, Mutations, Subscriptions und normalisiertes Caching.
Sinnvoll, wenn:
- die App stark auf GraphQL-APIs aufbaut,
- leistungsfähige Cache-Mechanismen und Update-Tools benötigt werden,
- ein einheitliches GraphQL-Muster über viele Screens gewünscht ist.
Für REST-lastige Apps können leichtere Alternativen einfacher sein.
Kurz gesagt
Apollo ist ideal, wenn GraphQL plus starker Client-Cache ein zentraler Architekturbaustein ist.
67. Was ist NetInfo und wie verwendet man es?
@react-native-community/netinfo liefert den aktuellen Netzwerkstatus der App.
Typische Einsatzfälle:
- Offline/Online-Wechsel erkennen.
- Netzwerkaktionen offline deaktivieren oder in Queue legen.
- Bei wiederhergestellter Verbindung Sync/Retry auslösen.
NetInfo ist ein zentrales Fundament für zuverlässige Offline-First-UX.
Kurz gesagt
NetInfo zeigt Konnektivität an, damit Requests intelligent gesteuert und Wiederholungen gezielt ausgelöst werden können.
68. Wie geht man mit Echtzeit-Updates um (WebSockets, Subscriptions)?
Echtzeit-Updates werden in der Regel mit WebSockets oder GraphQL-Subscriptions umgesetzt.
Muster:
- Persistente Verbindung aufbauen.
- Relevante Channels/Events abonnieren.
- Eingehende Events in lokalen/globalen State mergen.
- Bei Verbindungsabbruch mit Backoff reconnecten.
App-Lifecycle und Netzwerkwechsel sollten mitbehandelt werden, damit keine veralteten Sockets bestehen bleiben.
Kurz gesagt
Dauerhafte Verbindung halten, Events sauber in State integrieren und Reconnect/Backoff zuverlässig managen.
69. Was sind gängige Test-Tools (Jest, Detox)?
Ein typischer RN-Teststack besteht aus mehreren Ebenen:
- Jest: Unit- und Integrations-Tests.
- React Native Testing Library: komponentennahe Interaktionstests.
- Detox: End-to-End-Tests auf Emulator/Simulator/Gerät.
- ESLint/TypeScript in CI: statische Qualitäts- und Korrektheitsprüfungen.
Die Kombination dieser Ebenen ergibt eine belastbare Testabdeckung.
Kurz gesagt
Beste Abdeckung entsteht schichtweise: Jest für Logik/Komponenten, Detox für reale End-to-End-Flows.
70. Wie schreibt man Unit-Tests in React Native?
Unit-Tests werden meist mit Jest geschrieben, oft ergänzt durch Testing Library für Komponenten.
Grundablauf:
- Inputs/Initialzustand vorbereiten (Arrange).
- Verhalten ausführen (Act).
- Ergebnis, State oder Callbacks prüfen (Assert).
Gute Unit-Tests sind isoliert, deterministisch und schnell.
Kurz gesagt
Fokus auf reproduzierbares Verhalten statt Implementierungsdetails sorgt für stabile Unit-Tests.
71. Wie führt man End-to-End-Tests durch?
End-to-End-Tests (E2E) prüfen komplette User-Flows in einer realen oder simulierten App-Umgebung inklusive UI, Navigation und Backend-Integration.
Typischer Ablauf:
- App im Testmodus starten.
- UI wie ein Nutzer bedienen (tippen, tippen/eingeben, scrollen).
- Sichtbare Ergebnisse und Navigationszustände validieren.
- Tests in CI auf mehreren Geräten/Konfigurationen ausführen.
Das gängigste E2E-Tool im RN-Umfeld ist Detox.
Best Practices:
- Stabile
testIDs für wichtige Elemente vergeben. - Tests deterministisch halten (Netzwerk/Daten möglichst kontrollieren).
- Zuerst kritische Journeys absichern (Auth, Checkout, Core-Flows).
Kurz gesagt
E2E-Tests validieren geschäftskritische Nutzerpfade über echte Navigations- und Integrationsgrenzen hinweg.
72. Welche Debugging-Tools gibt es (Flipper)?
Beim React-Native-Debugging kombiniert man typischerweise Runtime-Logs, Komponenteninspektion und native Diagnostik.
Häufige Tools:
- Flipper: Plugins für Logs, Network, Layout-Inspector und Performance.
- React DevTools: Komponentenbaum, Props, State und Hooks inspizieren.
- Metro-Logs: Console-Ausgaben sowie Runtime-Warnungen/Fehler.
- Xcode / Android Studio: native Crash-Logs, Device-Logs, Breakpoints.
- Hermes-Debug-Support: JS-Engine-spezifische Profiling-/Inspection-Funktionen.
Flipper ist besonders hilfreich als zentraler Desktop-Hub für JS- und Native-Debugging.
Kurz gesagt
Effektives Debugging kombiniert Flipper/DevTools mit nativen Logs aus Xcode und Android Studio.
73. Wie profiliert man Performance in React Native?
Performance-Profiling identifiziert reale Bottlenecks bei Rendering, JS-Ausführung und UI-Thread-Last.
Wichtige Methoden:
- React DevTools Profiler für teure Re-Renders verwenden.
- Flipper-Plugins für Performance- und Netzwerk-Timings nutzen.
- Startup-Zeit und Screen-Transition-Latenz auf echten Geräten messen.
- Listenverhalten analysieren (
FlatList-Konfiguration, dropped frames). - Native Seite mit Xcode Instruments / Android Profiler untersuchen.
Worauf achten:
- Häufige unnötige Re-Renders.
- Lange JS-Tasks, die Interaktionen blockieren.
- Hohe Bild-/Layout-Last auf kritischen Screens.
Immer möglichst release-nahe Builds profilieren, nicht nur Debug-Builds.
Kurz gesagt
Nur Profiling auf realistischen Builds zeigt die echten Performance-Probleme, die optimiert werden sollten.
74. Was ist Expo und wann sollte man es verwenden?
Expo ist eine Plattform samt Toolchain rund um React Native, die Entwicklung, Builds und Updates deutlich vereinfacht.
Sinnvoll, wenn:
- schnelleres Setup und hohe Entwicklerproduktivität gewünscht sind,
- häufige Native-Features über Expo SDK benötigt werden (Kamera, Notifications usw.),
- vereinfachte Cloud-/Local-Build-Workflows (EAS) bevorzugt werden.
Expo umfasst:
- Dev-Tools und Runtime.
- Expo-SDK-Module.
- Build- und Submission-Tooling.
- OTA-Update-Support über Expo-Services.
Für viele Apps ist Expo ein starker Standard, sofern nicht von Anfang an tiefe Native-Kontrolle nötig ist.
Kurz gesagt
Expo ist ideal, wenn du schneller liefern und den nativen Setup-Aufwand minimieren willst.
75. Was ist der Unterschied zwischen Expo Managed und Bare Workflow?
Der Kernunterschied liegt im Grad der nativen Kontrolle.
- Managed Workflow: Expo verwaltet die native Konfiguration. Du arbeitest primär in JS/TS plus Expo-Config. Schnellere Entwicklung, weniger native Wartung.
- Bare Workflow: Volle iOS/Android-Projekte unter eigener Kontrolle (ähnlich zu plain RN). Mehr Flexibilität, aber auch mehr Setup- und Wartungsaufwand.
Managed passt, wenn Geschwindigkeit und Einfachheit priorisiert werden. Bare ist richtig, wenn eigene Native-Module oder tiefe Low-Level-Integrationen nötig sind.
Kurz gesagt
Managed maximiert Geschwindigkeit, Bare maximiert native Kontrolle und Anpassbarkeit.
76. Was sind Vor- und Nachteile von Expo?
Vorteile:
- Schnelles Projekt-Setup und kurze Iterationszyklen.
- Umfangreiches SDK für häufige Native-Features.
- Einfache Build-/Update-Pipeline mit EAS.
- Gute Developer Experience für kleine und mittlere Teams.
Nachteile:
- Weniger direkte Native-Kontrolle im Managed Workflow.
- Manche Native-Edge-Cases erfordern Bare/Eject.
- Abhängigkeit von Entscheidungen und Tools im Expo-Ökosystem.
Expo ist sehr produktiv, bringt aber Trade-offs bei tiefer Low-Level-Flexibilität.
Kurz gesagt
Expo beschleunigt Entwicklung und Releases, kann bei sehr spezifischer Native-Anpassung jedoch einschränken.
77. Wie handhabt man App-Builds und Deployment?
Eine typische Build-/Release-Pipeline umfasst:
- Versionierung und Changelog.
- CI-Builds für Android/iOS.
- Automatisierte Tests und Quality Gates.
- Signing und Artefakt-Erzeugung.
- Store-Submission (Play Console / App Store Connect).
- Post-Release-Monitoring und Rollback-Plan.
Expo-Apps nutzen häufig EAS Build/Submit, Bare-Apps oft Fastlane oder CI-Skripte.
Kurz gesagt
Releases sollten als klarer Pipeline-Prozess laufen: Versionierung, CI-Checks, Signing, Submission, Monitoring.
78. Was ist Code Signing und warum ist es wichtig?
Code Signing verifiziert kryptografisch Identität und Integrität einer App.
Warum wichtig:
- Bestätigt die Echtheit des Publishers.
- Verhindert, dass manipulierte Binaries als vertrauenswürdig gelten.
- Ist für die Store-Distribution verpflichtend.
iOS arbeitet mit Zertifikaten/Provisioning-Profilen, Android mit Keystores.
Kurz gesagt
Code Signing ist der Nachweis für Authentizität und eine Pflichtvoraussetzung für vertrauenswürdige Verteilung.
79. Wie verwaltet man Umgebungen (dev/staging/prod)?
Setze je Build-Ziel eine explizite Environment-Konfiguration auf.
Gängiges Setup:
- Getrennte API-Endpunkte und Feature-Flags.
- Build-Varianten/Flavors (Android) und Schemes (iOS).
- Environment-spezifische Secrets über sichere CI-Variablen.
- Klare Release-Channel-Benennung.
Die Auswahl der Umgebung sollte deterministisch sein und in der App-Diagnostik sichtbar bleiben.
Kurz gesagt
Trenne Konfigurationen sauber pro Umgebung und halte Secrets konsequent außerhalb des Quellcodes.
80. Was ist CodePush / OTA-Updates und wann sollte man es nutzen?
OTA-Updates liefern JavaScript/Assets ohne vollständiges Store-Release aus.
Sinnvoll für:
- Schnelle Bugfixes in der JS-Schicht.
- Kleine Inhalts- und Logik-Updates.
Grenzen:
- Native Binärcode kann damit nicht aktualisiert werden.
- Store-Richtlinien müssen eingehalten werden.
OTA sollte für sichere inkrementelle JS-Updates genutzt werden, nicht als Ersatz für Binary-Releases.
Kurz gesagt
OTA ist ideal für schnelle JS-Korrekturen, während Native-Änderungen weiterhin ein Store-Binary erfordern.
81. Was sind Best Practices für die Strukturierung einer großen Codebase?
Bei großen React-Native-Projekten sollte die Struktur Auffindbarkeit, Feature-Ownership und langfristiges Refactoring unterstützen.
Ein verbreiteter Ansatz ist feature-first:
- Nach Domänen/Features gruppieren (
features/auth,features/profileusw.). - Gemeinsame UI in
components/, generische Hooks inhooks/halten. - API-/Datenebene trennen (
services/,api/,store/). - App-weite Konfiguration/Konstanten zentralisieren (
config/,theme/,env/). - Klare Grenzen und öffentliche Entry-Points je Feature definieren.
Zusätzlich sollte Konsistenz per Linting, Formatting, TypeScript und dokumentierten Architekturregeln abgesichert werden.
Kurz gesagt
Feature-Grenzen als primäre Struktur machen Ownership, Wiederverwendung und Refactoring deutlich beherrschbarer.
82. Wie stellt man Skalierbarkeit und Wartbarkeit sicher?
Skalierbarkeit und Wartbarkeit entstehen aus sauberer Architektur plus disziplinierten Engineering-Prozessen.
Wichtige Praktiken:
- Modulare Feature-Grenzen und wiederverwendbare Primitives nutzen.
- Business-Logik außerhalb von UI-Komponenten halten.
- TypeScript für sichere Refactorings einsetzen.
- Automatisierte Tests auf Unit/Integration/E2E-Ebene einführen.
- Codequalität mit ESLint, Prettier, CI-Checks und Code-Review durchsetzen.
- Performance-Regressions und Crash-Analytics kontinuierlich verfolgen.
- Muster für State, Navigation, Networking und Error Handling dokumentieren.
Eine skalierbare Codebase ist vorhersagbar: neue Features folgen denselben Konventionen mit minimalen Ausnahmen.
Kurz gesagt
Skalierung gelingt mit konsistenter Architektur, automatisierten Qualitätsbarrieren und klaren Team-Standards.
83. Was sind Best Practices für den Umgang mit sensiblen Daten?
Sensible Daten (Tokens, Secrets, PII) müssen in Speicherung, Übertragung und Logs geschützt werden.
Best Practices:
- Secrets nie im Quellcode hardcoden und keine privaten Keys in der App ausliefern.
- Sicheren Storage nutzen (iOS Keychain / Android Keystore-Wrapper).
- Für alle API-Aufrufe HTTPS/TLS verwenden.
- Gespeicherte sensible Daten und Aufbewahrungsdauer minimieren.
- Sensitive Felder in Logs, Analytics und Crash-Reports maskieren.
- Token/Keys rotieren und Widerruf (Revocation) unterstützen.
- Bei entsprechendem Threat Model Jailbreak/Root- und Tamper-Detection ergänzen.
AsyncStorage ist für hochsensible Geheimnisse nicht geeignet.
Kurz gesagt
Secrets gehören in sichere Speicherpfade mit minimaler Exposition, niemals in ungeschützte Standardablagen.
84. Wie handhabt man Authentifizierung (Biometrie, Tokens)?
Authentifizierung kombiniert in RN meist einen sicheren Token-Lifecycle mit optionalem biometrischem Re-Auth für Komfort.
Typischer Ablauf:
- Nutzer meldet sich an (Credentials/OAuth/Social).
- Backend liefert Access- und Refresh-Token.
- Tokens sicher speichern (nicht in plain AsyncStorage).
- Access-Token an API-Requests anhängen.
- Bei Ablauf Access-Token über Refresh-Token erneuern.
- Bei Logout Tokens und Session-State vollständig löschen.
Biometrie-Nutzung:
- Face ID / Touch ID / Android-Biometrie für lokale Re-Authentifizierung nutzen.
- Server-Authentifizierung tokenbasiert halten; Biometrie schützt lokalen Zugriff.
Zentraler Auth-State und Request-Interceptor vermeiden doppelte Logik.
Kurz gesagt
Ein robuster Auth-Flow braucht sicheren Token-Umgang und optionale Biometrie als lokale Komfortschicht.
85. Was ist react-native-webview und wann sollte man es verwenden?
react-native-webview ist eine Komponente, die Web-Inhalte innerhalb der mobilen App rendert.
Einsatzfälle:
- Externe oder interne Webseiten anzeigen.
- Bestehende Web-Flows einbetten (Help Center, Zahlungsseiten, Doku).
- Hybride Module integrieren, wenn ein kompletter Native-Rewrite nicht nötig ist.
Beispiel:
import { WebView } from 'react-native-webview';
function DocsScreen() {
return <WebView source={{ uri: 'https://example.com/docs' }} />;
}Für kritische Kernflows mit Bedacht nutzen: UX, Performance, Sicherheit und tiefe Native-Integration sind oft mit vollwertigen RN/Native Screens besser.
Kurz gesagt
WebView eignet sich für abgegrenzte Web-Inhalte, Kernfunktionen der App sollten meist nativ/RN umgesetzt werden.
86. Was ist react-native-svg und warum ist es nützlich?
react-native-svg stellt in React Native grundlegende SVG-Render-Primitives bereit.
Warum nützlich:
- Auflösungsunabhängige Vektorgrafiken.
- Ideal für Icons, Charts und Illustrationen.
- Flexibler als statische PNG-Assets.
Für viele designintensive Apps ist es eine Standardabhängigkeit.
Kurz gesagt
SVG-Support sorgt für scharfe, skalierbare Grafiken über unterschiedliche Displaydichten hinweg.
87. Wie implementiert man eine Drawer-Navigation?
Dafür wird üblicherweise @react-navigation/drawer verwendet.
Grundablauf:
- Abhängigkeiten für den Drawer Navigator installieren.
Drawer.Navigatormit den Screens anlegen.- Optional den Drawer-Content anpassen.
- Bei Bedarf mit Stack-/Tab-Navigation kombinieren.
Primäre Routen gehören in den Drawer; übermäßige Verschachtelung sollte vermieden werden.
Kurz gesagt
Drawer-Navigation eignet sich für Top-Level-Bereiche, solange die Hierarchie klar und flach bleibt.
88. Was ist gesture-basierte Navigation?
Gesture-basierte Navigation bedeutet, dass Nutzer per Wisch- und Touch-Mustern zwischen Screens navigieren (Back-Swipe, Tab-Swipe, Drawer-Drag).
In React Native wird das typischerweise durch React Navigation plus Gesture Handler unterstützt.
Vorteile:
- Natürlichere, native wirkende Interaktionen.
- Schnellere Einhand-Navigation in vielen Flows.
Kurz gesagt
Gesten-Navigation verbessert mobile UX deutlich, wenn sie an Plattformkonventionen angepasst ist.
89. Wie implementiert man Shared-Element-Transitions?
Shared-Element-Transitions animieren ein gemeinsames UI-Element zwischen zwei Screens.
Typische Umsetzung:
- Eine Library mit Shared-Transition-Support einsetzen.
- Quell- und Ziel-Elementen identische Shared-IDs geben.
- Navigations-Transition passend konfigurieren.
Das verbessert die visuelle Kontinuität in List/Detail-Flows.
Kurz gesagt
Shared-Transitions halten den visuellen Kontext beim Wechsel zwischen Liste und Detailansicht stabil.
90. Was ist der Fabric-Renderer und was ist der Unterschied?
Fabric ist der neue Renderer von React Native innerhalb der New Architecture.
Unterschiede zum Legacy-Renderer:
- Bessere Integration mit Concurrent-React-Patterns.
- Effizientere Rendering-Pipeline.
- Engere Zusammenarbeit mit JSI/TurboModules.
- Geringere Latenz bei bestimmten UI-Updates.
Fabric ist ein zentraler Bestandteil der RN-Modernisierung.
Kurz gesagt
Fabric steigert Rendering-Effizienz und passt in das moderne Runtime-Modell von React Native.
91. Was ist der Vorteil der TurboModules-Architektur?
TurboModules sind Teil der New Architecture von React Native und verbessern, wie native Module aus JavaScript geladen und aufgerufen werden.
Hauptvorteile:
- Lazy Loading: Module werden nur bei Bedarf initialisiert.
- Bessere Performance: weniger Startup-Overhead und geringere Bridge-Kosten.
- Typsicherheit via Codegen: robustere Verträge zwischen JS und Native.
- Höhere Wartbarkeit: klarere Modul-Schnittstellen und modernisierte Native-Integration.
TurboModules sind besonders wertvoll in großen Apps mit vielen nativen Abhängigkeiten.
Kurz gesagt
TurboModules verbessern Startzeit und Native-Zugriff durch bedarfsgeladenes, typisiertes Modul-Handling.
92. Wie geht man mit Error Boundaries in React Native um?
Error Boundaries fangen Render-Fehler in Kind-Komponentenbäumen ab und verhindern, dass die gesamte UI abstürzt.
In React Native werden sie als Klassenkomponenten umgesetzt mit:
static getDerivedStateFromError(error)componentDidCatch(error, info)
Beispiel:
import React from 'react';
import { Text, View } from 'react-native';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, info) {
// Fehler an Monitoring senden
}
render() {
if (this.state.hasError) {
return (
<View>
<Text>Something went wrong.</Text>
</View>
);
}
return this.props.children;
}
}Kritische Screen-Bereiche sollten mit Boundaries umschlossen und an Monitoring-Tools angebunden werden.
Kurz gesagt
Error Boundaries isolieren Render-Crashes und zeigen Fallback-UI statt die gesamte App zu brechen.
93. Wie handhabt man globale Fehler?
Globales Error Handling umfasst unbehandelte JS-Exceptions, Promise-Rejections und native Crashes.
Gängige Strategie:
- Globalen JS-Error-Handler konfigurieren.
- Unhandled Promise Rejections erfassen.
- Crash-/Error-Monitoring integrieren (z. B. Sentry, Bugsnag).
- Kontext (User/Session/Screen) sicher mitloggen.
- Wenn möglich Fallback-UI zeigen und kontrolliert recovern.
Native Crashes sollten zusätzlich über Plattform-Tooling und Monitoring-SDKs erfasst werden.
Kurz gesagt
Ungefangene JS- und Native-Fehler zentral sammeln und mit ausreichend Kontext reporten.
94. Was ist AppState und wie wird es verwendet?
AppState zeigt an, ob die App aktiv, im Hintergrund oder inaktiv ist.
Typische Zustände:
active: App ist im Vordergrund und interaktiv.background: App läuft im Hintergrund.inactive: Übergangszustand (vor allem iOS).
Einsatzfälle:
- Timer, Video oder Polling pausieren/fortsetzen.
- Sensible Daten beim Rückkehr in den Vordergrund aktualisieren.
- Analytics-/Session-Lifecycle-Events auslösen.
Beispiel:
import { AppState } from 'react-native';
const subscription = AppState.addEventListener('change', nextState => {
// State-Wechsel behandeln
});
// Später:
subscription.remove();Kurz gesagt
Mit AppState steuerst du sauber, welche Arbeit im Vordergrund läuft und was im Hintergrund pausiert.
95. Wie handhabt man den Android-Back-Button (BackHandler)?
Unter Android lässt sich der Hardware-Back-Button über BackHandler gezielt steuern.
Muster:
- Auf
hardwareBackPresssubscriben. truezurückgeben, um das Event selbst zu konsumieren.falsezurückgeben, damit Standardverhalten greift (z. B. Navigation zurück).
Beispiel:
import { BackHandler } from 'react-native';
import { useEffect } from 'react';
useEffect(() => {
const sub = BackHandler.addEventListener('hardwareBackPress', () => {
// Eigene Logik
return false;
});
return () => sub.remove();
}, []);Bei React Navigation zuerst deren Back-Handling-APIs nutzen und BackHandler für Spezialfälle einsetzen.
Kurz gesagt
Back-Events bewusst behandeln und mit Navigation konsistent integrieren.
96. Wie optimiert man die Bundle-Größe?
Bundle-Optimierung fokussiert sich darauf, ausgeliefertes JS und Assets zu reduzieren.
Praktische Schritte:
- Ungenutzte Abhängigkeiten entfernen.
- Nur benötigte Module importieren.
- Bilder und Medien komprimieren bzw. korrekt skalieren.
- Minifizierung und Produktionsoptimierungen aktivieren.
- Schwere Features dort aufteilen, wo die Architektur es erlaubt.
Kleinere Bundles verbessern Startzeit und Update-Auslieferung.
Kurz gesagt
Weniger ausgeliefertes JS/Asset-Volumen bedeutet schnelleren Start und effizientere Updates.
97. Wie handhabt man Versions-Upgrades und Migrationen?
Upgrades sollten schrittweise und mit automatisierter Validierung erfolgen.
Empfohlener Ablauf:
- In kleinen Schritten upgraden.
- RN-Release-Notes und Breaking Changes prüfen.
- Upgrade-Helper/Diffs für React Native nutzen.
- Vollständige Tests auf iOS und Android durchführen.
- Mit Monitoring und Rollback-Bereitschaft ausrollen.
Große Mehrversionssprünge möglichst vermeiden.
Kurz gesagt
Inkrementelle Upgrades plus Release-Note-Checks und vollständige Regressionstests minimieren Migrationsrisiko.
98. Was sind die Grenzen von React Native?
Typische Einschränkungen:
- Manche fortgeschrittenen Native-APIs erfordern eigenes Native-Development.
- Die Qualität von Ecosystem-Paketen variiert.
- Bei schwacher Architektur oder hoher JS-Last kann Performance leiden.
- Upgrades und Native-Tooling sind teils komplex.
Trotzdem ist RN für viele Cross-Platform-Apps sehr effektiv.
Kurz gesagt
React Native ist produktiv, aber anspruchsvolle Spezialfälle brauchen oft natives Know-how und sorgfältiges Tuning.
99. Wie implementiert man Echtzeit-Synchronisierung?
Echtzeit-Sync kombiniert Live-Transport mit konfliktresistenter lokaler Datenpflege.
Typische Strategie:
- Live-Events via WebSocket/Subscriptions empfangen.
- Optimistische Updates für User-Aktionen anwenden.
- Lokalen State für Offline-Kontinuität persistieren.
- Beim Reconnect Server-Truth mit lokalen Änderungen abgleichen.
- Versionierung und Conflict-Resolution-Regeln nutzen.
So bleiben Daten aktuell, ohne Konsistenz zu verlieren.
Kurz gesagt
Robuster Echtzeit-Sync braucht Event-Streams, Offline-Persistenz und klare Konfliktauflösung.
100. Wie entwirft man eine skalierbare Mobile-Architektur?
Skalierbare Mobile-Architektur setzt auf klare Grenzen und vorhersagbare Abläufe.
Kernprinzipien:
- Feature-basierte modulare Struktur.
- Trennung von UI, Domain-Logik und Datenebene.
- Explizite State-Strategie (lokal/global/server-state).
- Konsistente Muster für Navigation, Fehlerbehandlung und Networking.
- Automatisierte Quality Gates (Tests, Lint, CI, Monitoring).
Architektur sollte auf langfristige Änderbarkeit optimiert sein, nicht nur auf schnellen Start.
Kurz gesagt
Skalierbarkeit entsteht durch modulare Grenzen, klaren Datenfluss und konsequent durchgesetzte Team-Konventionen.