0Pricing
React Academy · Lektion

Apollo-Cache: Normalisierung und Aktualisierungen

Apollos normalisierten InMemoryCache verstehen und gecachte Daten nach Mutationen ohne erneutes Abrufen aktualisieren

Apollo-Cache: Normalisierung und Aktualisierungen ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Daten-Normalisierung mit InMemoryCache

InMemoryCache speichert jedes Objekt unter einem Cache-Schlüssel, der sich aus __typename und id zusammensetzt: User:1, Post:42. Wenn eine Abfrage einen User mit der id "1" zurückgibt, wird er unabhängig davon, wie viele verschiedene Abfragen ihn enthalten, nur einmal unter diesem Schlüssel gespeichert.

Jede nachfolgende Abfrage, die denselben User:1 abruft, liest aus diesem einzigen Cache-Eintrag. Dadurch sehen alle Komponenten dieselben Daten.

Automatische Aktualisierungen über Abfragen hinweg

Wenn eine Mutation ein aktualisiertes User:1-Objekt zurückgibt, schreibt Apollo es in den Cache-Eintrag User:1. Jede aktive Abfrage, die User:1 enthält, übernimmt die aktualisierten Felder automatisch in der Benutzeroberfläche, ohne dass zusätzlicher Code erforderlich ist.

Diese automatische Weitergabe ist der wichtigste Vorteil eines normalisierten Caches gegenüber einem Dokument-Cache (nach Abfrageschlüssel).

cache.readQuery

Liest das aktuelle Cache-Ergebnis einer Abfrage: cache.readQuery({ query: GET_USERS }) gibt das Datenobjekt zurück, als hätte useQuery es zurückgegeben. Gibt null zurück, wenn sich die Abfrage nicht im Cache befindet.

Verwenden Sie readQuery innerhalb von Mutation-Update-Funktionen, um die aktuelle Liste vor ihrer Änderung zu lesen.

cache.writeQuery

cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) schreibt direkt in den Cache und löst dadurch in allen Komponenten, die GET_USERS lesen, erneute Render-Vorgänge aus. Es wird keine Netzwerkanfrage gestellt.

Kombinieren Sie readQuery und writeQuery, um unveränderliche Cache-Aktualisierungen zu implementieren: lesen, ein neues Array erzeugen und zurückschreiben.

cache.modify für direkte Entitätsaktualisierungen

cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) ändert direkt die Felder einer bestimmten im Cache gespeicherten Entität. Wenn Sie die Cache-ID der Entität kennen, müssen Sie nicht zuerst eine Abfrage lesen.

Das fields-Objekt ordnet Feldnamen Modifizierungsfunktionen zu, die den aktuellen Wert erhalten und den neuen Wert zurückgeben.

Cache nach einer Mutation aktualisieren

Übergeben Sie useMutation eine update-Funktion: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).

Dadurch wird der neue Beitrag an das im Cache gespeicherte posts-Array des Benutzers angehängt. Alle Komponenten, die die Beitragsliste des Benutzers anzeigen, werden aktualisiert.

cache.evict: Cache-Einträge entfernen

cache.evict({ id: 'User:1' }) entfernt den Eintrag User:1 aus dem Cache. Jede aktive Abfrage, die User:1 enthielt, wird mit einer Ergebnisliste, in der diese Entität fehlt, erneut gerendert.

Rufen Sie nach dem Entfernen von Einträgen cache.gc() auf, um alle Objekte zu entfernen, die von Root-Abfragen aus nicht mehr erreichbar sind. Dadurch werden Speicherlecks in langlebigen Anwendungen vermieden.

Garbage Collection

cache.gc() durchläuft den Cache-Graphen, beginnend bei allen aktiven Abfragen, und entfernt alle Entitäten, die nicht mehr erreichbar sind. Der Aufruf kann regelmäßig oder nach Batch-Mutationen, die viele Entitäten löschen, sicher ausgeführt werden.

Entitäten, auf die aktive useQuery-Hooks verweisen, werden niemals durch die Garbage Collection entfernt. Entfernt werden nur verwaiste Entitäten, die nicht mehr Teil eines Abfrageergebnisses sind.

Cache-Weiterleitungen mit Feldrichtlinien

Wenn Sie eine einzelne Entität (GET_USER nach id) abfragen, die bereits als Teil einer Listenabfrage im Cache gespeichert ist, kann Apollo sie mithilfe von Feldrichtlinien ohne erneuten Netzwerkaufruf aus dem Cache lesen: keyArgs und read-Funktionen in der Typ-Richtlinie.

Die read-Funktion gibt eine Cache-Referenz zurück: return toReference({ __typename: 'User', id: args.id }), und weist Apollo damit an, aus dem vorhandenen Cache-Eintrag User:id zu lesen.

Benutzerdefinierte keyFields für nicht standardmäßige IDs

Wenn Ihre Entitäten ein anderes Feld als id als eindeutigen Schlüssel verwenden, etwa slug oder uuid, konfigurieren Sie es in der Typ-Richtlinie: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).

Apollo verwendet dann Post:my-post-slug als Cache-Schlüssel, statt ein id-Feld vorauszusetzen. So bleibt die Normalisierung auch bei nicht standardmäßigen Schemas erhalten.

refetchQueries im Vergleich zur update-Funktion

refetchQueries: [{ query: GET_USERS }] in den Optionen von useMutation löst nach Abschluss der Mutation eine erneute Netzwerkanfrage aus. Das ist einfacher, stellt aber immer eine Netzwerkanfrage.

Die update-Funktion ändert den Cache lokal und vermeidet den Netzwerkaufruf. Verwenden Sie refetchQueries, wenn die Cache-Aktualisierungslogik zu komplex zum Schreiben ist oder serverseitig berechnete Felder lokale Cache-Aktualisierungen unzuverlässig machen.

Normalisierungsschlüssel von InMemoryCache

Welches Standardformat verwendet InMemoryCache zum Speichern von Entitäten als Cache-Schlüssel?

Zusammenfassung der Lektion

InMemoryCache normalisiert Entitäten anhand von __typename+id und ermöglicht dadurch automatische Aktualisierungen über Abfragen hinweg. Lesen und schreiben Sie im Cache mit cache.readQuery, cache.writeQuery und cache.modify. Entfernen Sie Entitäten mit cache.evict und anschließendem cache.gc. Konfigurieren Sie benutzerdefinierte Schlüsselfelder über typePolicies, wenn der Primärschlüssel nicht id ist.

Verwenden Sie Mutation-Update-Funktionen für effiziente lokale Cache-Aktualisierungen und refetchQueries, wenn serverseitig berechnete Felder lokale Aktualisierungen unzuverlässig machen.

Häufig gestellte Fragen

Ist die Lektion „Apollo-Cache: Normalisierung und Aktualisierungen“ kostenlos?

Ja — der vollständige Text von „Apollo-Cache: Normalisierung und Aktualisierungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Apollo-Cache: Normalisierung und Aktualisierungen“?

Apollos normalisierten InMemoryCache verstehen und gecachte Daten nach Mutationen ohne erneutes Abrufen aktualisieren Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Apollo-Cache: Normalisierung und Aktualisierungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. GraphQL-Grundlagen für React-Entwickler
  2. Apollo Client in React einrichten
  3. useQuery- und useMutation-Hooks
  4. Apollo-Cache: Normalisierung und Aktualisierungen
← Zurück zu React Academy