React Native und GraphQL 2026: Apollo Client, Abfragen und Interview-Fragen
Integration von GraphQL in React Native mit Apollo Client 4.0. Dieses Tutorial behandelt Queries, Mutations, Caching-Strategien und häufige Interview-Fragen zur mobilen GraphQL-Entwicklung.

GraphQL hat sich zur bevorzugten API-Schicht für React Native-Anwendungen entwickelt, die flexibles Datenabrufen und effiziente Netzwerknutzung erfordern. Apollo Client 4.0, Ende 2025 veröffentlicht, bringt eine schlankere Architektur mit 20-30% kleineren Bundles und verbesserter TypeScript-Unterstützung, die speziell für mobile Umgebungen konzipiert wurde.
Apollo Client 4.0 entkoppelt React-spezifische Exports nach @apollo/client/react, unterstützt React 19 Suspense sowie den React Compiler und ersetzt den monolithischen ApolloError durch spezifische Fehlerklassen für besseres Debugging.
Apollo Client 4 in React Native einrichten
Der Installationsprozess bleibt unkompliziert. Apollo Client 4.0 funktioniert sowohl mit Expo als auch mit reinen React Native-Projekten.
# Installation
npm install @apollo/client graphqlDie Client-Initialisierung erfordert einen HttpLink für Netzwerkanfragen und einen InMemoryCache für die lokale Zustandsverwaltung.
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client';
const httpLink = new HttpLink({
uri: 'https://api.example.com/graphql',
// Text-Streaming für @defer und Subscriptions aktivieren
fetchOptions: {
reactNative: { textStreaming: true },
},
});
export const apolloClient = new ApolloClient({
link: httpLink,
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
// Paginierte Ergebnisse zusammenführen
products: {
keyArgs: ['category'],
merge(existing = [], incoming) {
return [...existing, ...incoming];
},
},
},
},
},
}),
});Die typePolicies-Konfiguration behandelt die Cache-Normalisierung für paginierte Daten – eine häufige Anforderung in mobilen Apps mit unendlichem Scrollen.
Die App mit ApolloProvider umhüllen
Das Provider-Muster verbindet Apollo Client mit dem React-Komponentenbaum. Er sollte auf der obersten Ebene platziert werden, typischerweise in App.tsx oder dem Expo Router Layout.
import { ApolloProvider } from '@apollo/client/react';
import { apolloClient } from './src/apollo/client';
import { RootNavigator } from './src/navigation';
export default function App() {
return (
<ApolloProvider client={apolloClient}>
<RootNavigator />
</ApolloProvider>
);
}Apollo Client 4.0 importiert React Hooks aus @apollo/client/react statt aus dem Haupt-Einstiegspunkt. Diese Änderung reduziert die Bundle-Größe, wenn der Core-Client in Nicht-React-Kontexten läuft.
Typsichere GraphQL-Queries schreiben
GraphQL Code Generator erzeugt TypeScript-Typen aus dem Schema und eliminiert so Runtime-Typabweichungen. Die Installation erfolgt zusammen mit dem Client-Plugin.
# Codegen-Tools installieren
npm install -D @graphql-codegen/cli @graphql-codegen/client-presetDie Codegen-Konfiguration verweist auf das Schema und spezifiziert die Ausgabeorte.
import type { CodegenConfig } from '@graphql-codegen/cli';
const config: CodegenConfig = {
schema: 'https://api.example.com/graphql',
documents: ['src/**/*.tsx', 'src/**/*.ts'],
generates: {
'./src/gql/': {
preset: 'client',
config: {
documentMode: 'string',
},
},
},
};
export default config;Das Ausführen von npx graphql-codegen generiert typisierte Document Nodes, die der useQuery-Hook verwendet.
Daten mit useQuery abrufen
Der useQuery-Hook verwaltet Ladezustände, Fehler und Cache-Aktualisierungen. Apollo Client 4.0 führt die dataState-API für vorhersehbarere Zustandsübergänge ein.
import { useQuery } from '@apollo/client/react';
import { graphql } from '../gql';
import { ActivityIndicator, FlatList, Text, View } from 'react-native';
const GET_PRODUCTS = graphql(`
query GetProducts($category: String!, $limit: Int, $offset: Int) {
products(category: $category, limit: $limit, offset: $offset) {
id
name
price
imageUrl
}
}
`);
export function ProductListScreen({ category }: { category: string }) {
const { data, loading, error, fetchMore } = useQuery(GET_PRODUCTS, {
variables: { category, limit: 20, offset: 0 },
// Zuerst aus Cache laden, dann Netzwerk
fetchPolicy: 'cache-and-network',
// Vorherige Daten während des Abrufs behalten
notifyOnNetworkStatusChange: true,
});
if (error) {
return <Text>Fehler: {error.message}</Text>;
}
const loadMore = () => {
fetchMore({
variables: { offset: data?.products.length ?? 0 },
});
};
return (
<FlatList
data={data?.products ?? []}
keyExtractor={(item) => item.id}
renderItem={({ item }) => <ProductCard product={item} />}
onEndReached={loadMore}
onEndReachedThreshold={0.5}
ListFooterComponent={loading ? <ActivityIndicator /> : null}
/>
);
}Die cache-and-network-Fetch-Policy zeigt gecachte Daten sofort an, während im Hintergrund vom Server aktualisiert wird. Dieses Muster reduziert die wahrgenommene Latenz in mobilen Netzwerken.
Bereit für deine React Native-Interviews?
Übe mit unseren interaktiven Simulatoren, Flashcards und technischen Tests.
Mutations und optimistische Updates
Mutations ändern Server-Daten und aktualisieren den lokalen Cache. Optimistische Antworten liefern sofortiges Feedback, bevor der Server die Änderung bestätigt.
import { useMutation } from '@apollo/client/react';
import { graphql } from '../gql';
const ADD_TO_CART = graphql(`
mutation AddToCart($productId: ID!, $quantity: Int!) {
addToCart(productId: $productId, quantity: $quantity) {
id
items {
id
product {
id
name
}
quantity
}
totalPrice
}
}
`);
export function useAddToCart() {
const [addToCart, { loading }] = useMutation(ADD_TO_CART, {
// Optimistische Antwort für sofortiges UI-Feedback
optimisticResponse: ({ productId, quantity }) => ({
addToCart: {
__typename: 'Cart',
id: 'current-cart',
items: [],
totalPrice: 0,
},
}),
// Cache nach Mutation aktualisieren
update(cache, { data }) {
if (!data?.addToCart) return;
cache.modify({
id: cache.identify({ __typename: 'Cart', id: 'current-cart' }),
fields: {
items: () => data.addToCart.items,
totalPrice: () => data.addToCart.totalPrice,
},
});
},
});
return { addToCart, loading };
}Die cache.modify-Methode aktualisiert gecachte Felder direkt, ohne die gesamte Query neu abzurufen. Dieser Ansatz minimiert Netzwerkanfragen bei mobilen Verbindungen.
Netzwerkfehler in mobilen Apps behandeln
Apollo Client 4.0 ersetzt den generischen ApolloError durch spezifische Fehlerklassen. Die statischen .is()-Methoden ermöglichen typsichere Fehlerbehandlung.
import { NetworkError, GraphQLErrors } from '@apollo/client/errors';
import { Text, Button, View } from 'react-native';
interface Props {
error: Error;
onRetry: () => void;
}
export function QueryErrorHandler({ error, onRetry }: Props) {
// Netzwerkfehler (offline, Timeout, DNS)
if (NetworkError.is(error)) {
return (
<View>
<Text>Verbindung fehlgeschlagen. Überprüfen Sie Ihre Internetverbindung.</Text>
<Button title="Erneut versuchen" onPress={onRetry} />
</View>
);
}
// GraphQL-Validierungs- oder Resolver-Fehler
if (GraphQLErrors.is(error)) {
const firstError = error.graphQLErrors[0];
if (firstError?.extensions?.code === 'UNAUTHENTICATED') {
return <Text>Sitzung abgelaufen. Bitte erneut anmelden.</Text>;
}
return <Text>Anfrage fehlgeschlagen: {firstError?.message}</Text>;
}
return <Text>Etwas ist schiefgelaufen</Text>;
}Die Unterscheidung zwischen Netzwerkfehlern und GraphQL-Fehlern ermöglicht unterschiedliche Wiederherstellungsstrategien: Wiederholung bei vorübergehenden Fehlern, Weiterleitung bei Authentifizierungsproblemen.
Offline-Unterstützung mit Cache-Persistenz
Mobile Apps benötigen Offline-Zugriff auf zuvor abgerufene Daten. Die apollo3-cache-persist-Bibliothek serialisiert den Cache in AsyncStorage.
import AsyncStorage from '@react-native-async-storage/async-storage';
import { persistCache } from 'apollo3-cache-persist';
import { apolloClient } from './client';
export async function initializeCache() {
await persistCache({
cache: apolloClient.cache,
storage: AsyncStorage,
maxSize: 1024 * 1024 * 5, // 5 MB Limit
debounce: 1000, // Maximal einmal pro Sekunde schreiben
});
}initializeCache sollte vor dem Rendern der App aufgerufen werden, um gecachte Daten von der Festplatte wiederherzustellen. Benutzer sehen ihre zuletzt abgerufenen Inhalte sofort, auch ohne Netzwerkzugang.
Echtzeit-Updates mit GraphQL-Subscriptions
Subscriptions übertragen Server-Events über WebSocket an den Client. Apollo Client 4.0 unterstützt das neuere graphql-ws-Protokoll.
import { split, HttpLink, ApolloClient, InMemoryCache } from '@apollo/client';
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
import { createClient } from 'graphql-ws';
import { getMainDefinition } from '@apollo/client/utilities';
const httpLink = new HttpLink({ uri: 'https://api.example.com/graphql' });
const wsLink = new GraphQLWsLink(
createClient({
url: 'wss://api.example.com/graphql',
connectionParams: async () => ({
authToken: await getStoredToken(),
}),
})
);
// Subscriptions zu WebSocket leiten, andere zu HTTP
const splitLink = split(
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === 'OperationDefinition' &&
definition.operation === 'subscription'
);
},
wsLink,
httpLink
);
export const apolloClient = new ApolloClient({
link: splitLink,
cache: new InMemoryCache(),
});Die split-Funktion leitet Operationen basierend auf dem Operationstyp an den entsprechenden Transport.
Häufige Interview-Fragen: React Native GraphQL
Technische Interviews testen oft das Verständnis der mobilspezifischen Kompromisse von GraphQL. Die folgenden Fragen erscheinen häufig in React Native-Positionen.
Warum GraphQL statt REST für mobile Apps wählen?
GraphQL reduziert Over-Fetching, indem nur angeforderte Felder zurückgegeben werden. Eine einzelne Query ersetzt mehrere REST-Endpunkte und reduziert so Round-Trips über hochlatente Mobilfunkverbindungen. Das typisierte Schema ermöglicht Compile-Time-Validierung und erkennt API-Abweichungen vor der Laufzeit.
Wie cached Apollo Client Daten?
Apollo normalisiert Antworten nach __typename und id und speichert jede Entität einmal. Queries referenzieren normalisierte Objekte über den Cache-Schlüssel. Diese Deduplizierung spart Speicher und gewährleistet Konsistenz: Das Aktualisieren eines Produkts in einer Liste aktualisiert es überall.
Welche Fetch-Policies unterstützt Apollo Client?
| Policy | Verhalten | Anwendungsfall |
|---|---|---|
cache-first | Cache zurückgeben wenn verfügbar, sonst abrufen | Standard, minimiert Anfragen |
cache-and-network | Cache sofort zurückgeben, dann vom Netzwerk aktualisieren | Aktuelle Daten mit sofortiger Anzeige |
network-only | Immer abrufen, Cache aktualisieren | Wenn veraltete Daten inakzeptabel sind |
cache-only | Nie abrufen, fehlschlagen wenn nicht gecacht | Offline-Modus |
no-cache | Abrufen ohne Caching | Sensible Daten |
Wie funktionieren optimistische Updates?
Der Client prognostiziert das Mutations-Ergebnis und aktualisiert den Cache, bevor der Server antwortet. Wenn der Server ein anderes Ergebnis zurückgibt, ersetzt Apollo die optimistischen Daten durch die tatsächliche Antwort. Wenn die Mutation fehlschlägt, setzt Apollo auf den vorherigen Zustand zurück.
Was verursacht das N+1-Problem in GraphQL?
Verschachtelte Resolver, die verwandte Daten einzeln abrufen, erzeugen N+1-Queries. Die Anforderung einer Liste von 50 Produkten mit ihren Kategorien löst 1 Produkt-Query plus 50 Kategorie-Queries aus. Serverseitiger DataLoader fasst diese zu einer einzelnen Query zusammen.
Wie werden Authentifizierungs-Tokens mit Apollo Client behandelt?
Der empfohlene Ansatz verwendet einen Apollo Link, um Tokens an jede Anfrage anzuhängen.
import { setContext } from '@apollo/client/link/context';
import { getStoredToken } from '../auth/storage';
export const authLink = setContext(async (_, { headers }) => {
const token = await getStoredToken();
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : '',
},
};
});Dieser Link wird in der Client-Konfiguration vor dem HttpLink eingebunden.
GraphQL-Debugging in React Native
Apollo bietet mehrere Debugging-Optionen für die React Native-Entwicklung. Die VS Code Apollo-Erweiterung enthält integrierte Client DevTools, die Cache-Inhalte und Query-Verlauf anzeigen.
Für eigenständiges Debugging integriert sich Flipper mit dem Community-Plugin react-native-apollo-devtools. Dieses Plugin inspiziert den Cache-Zustand, überwacht laufende Queries und wiederholt Mutations.
Die Netzwerkinspektion über React Native Debugger erfordert die Aktivierung von "Debug JS Remotely". Der Network-Tab zeigt dann GraphQL-Payloads mit Request- und Response-Bodies.
Wichtige Erkenntnisse für mobile GraphQL-Entwicklung
- Apollo Client 4.0 reduziert die Bundle-Größe um 20-30% durch ESM-first-Packaging und entkoppelte React-Exports.
- Die
cache-and-network-Fetch-Policy balanciert sofortige Anzeige mit Datenaktualität bei langsamen Verbindungen. - Optimistische Updates bieten sofortiges Feedback;
cache.modifyvermeidet unnötige Neuabrufe. - Typisierte Fehlerklassen in Apollo Client 4.0 ermöglichen spezifische Behandlung von Netzwerkfehlern versus GraphQL-Fehlern.
- Cache-Persistenz mit
apollo3-cache-persistermöglicht Offline-Zugriff auf zuvor abgerufene Daten. - GraphQL-Subscriptions erfordern das
graphql-ws-Protokoll und eine Split-Link-Konfiguration. - Interview-Fragen konzentrieren sich auf Caching-Strategien, Fetch-Policies und mobilspezifische Kompromisse wie N+1-Prävention.
Fang an zu üben!
Teste dein Wissen mit unseren Interview-Simulatoren und technischen Tests.
Findest du den Bug in React Native?
Ein echter Codeausschnitt, ein versteckter Bug, ein Versuch pro Tag. Zum Ausprobieren ohne Konto.

Geschrieben von
Anthony Fillion-MailletGründer von SharpSkill
Seit über 10 Jahren Fullstack-Entwickler. Er leitet SharpSkill und verantwortet alles, was hier erscheint.
Aktualisiert am 20. August 2026
Tags
Teilen
Verwandte Artikel

Flutter vs React Native Performance Vergleich: Benchmarks und Interview-Fragen 2026
Vergleich der Performance von Flutter und React Native im Jahr 2026 mit echten Benchmarks. Impeller, New Architecture, Frame-Raten, Speicherverbrauch und häufige Interview-Fragen.

React Native 0.85 im Jahr 2026: Neues Animation Backend, Strikte TypeScript-API und Interviewfragen
Analyse der wichtigsten Neuerungen in React Native 0.85: Shared Animation Backend mit Layout-Animationen, Post-Bridge-Architektur mit JSI und TurboModules, Metro TLS und Interviewfragen zur neuen Architektur.

React Native 0.87 und SwiftPM 2026: Modernes iOS-Build-System und Interviewfragen
React Native 0.87 bringt experimentelle Swift Package Manager-Unterstützung für iOS-Builds. Dieser Leitfaden behandelt SwiftPM-Einrichtung, die Strict TypeScript API, Metro 0.87-Optimierungen und Interviewfragen für Senior Mobile-Entwickler.