Apollo-hurtigbuffer: normalisering og oppdateringer
Forstå Apollos normaliserte InMemoryCache, og oppdater hurtigbufrede data etter mutasjoner uten å hente dem på nytt.
Apollo-hurtigbuffer: normalisering og oppdateringer er en gratis leksjon i React Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i React Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i React Academy inneholder totalt 4 leksjoner.
Slik normaliserer InMemoryCache data
InMemoryCache lagrer hvert objekt med en cache-nøkkel som består av __typename og id: User:1, Post:42. Når en spørring returnerer en User med id "1", lagres den én gang under denne nøkkelen, uavhengig av hvor mange ulike spørringer som inkluderer den.
Alle påfølgende spørringer som henter den samme User:1, leser fra den ene cache-oppføringen, slik at alle komponenter ser de samme dataene.
Automatiske oppdateringer på tvers av spørringer
Når en mutasjon returnerer et oppdatert User:1-objekt, skriver Apollo det til cache-oppføringen for User:1. Alle aktive spørringer som inkluderer User:1, gjenspeiler automatisk de oppdaterte feltene i brukergrensesnittet uten ekstra kode.
Denne automatiske videreformidlingen er den viktigste fordelen med en normalisert cache sammenlignet med en dokumentcache (basert på spørringsnøkler).
cache.readQuery
Les det gjeldende bufrede resultatet av en spørring: cache.readQuery({ query: GET_USERS }) returnerer dataobjektet slik det ville blitt returnert av useQuery. Returnerer null hvis spørringen ikke finnes i cachen.
Bruk readQuery i update-funksjoner for mutasjoner til å lese den gjeldende listen før du endrer den.
cache.writeQuery
cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) skriver direkte til cachen og utløser ny gjengivelse i alle komponenter som leser GET_USERS. Ingen nettverksforespørsel sendes.
Kombiner readQuery og writeQuery for å implementere uforanderlige cache-oppdateringer: les, opprett en ny matrise, og skriv den tilbake.
cache.modify for direkte entitetsoppdateringer
cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) endrer feltene til en bestemt bufret entitet direkte. Du trenger ikke først å lese en spørring når du kjenner entitetens cache-ID.
Objektet fields kobler feltnavn til modifikatorfunksjoner som mottar den gjeldende verdien og returnerer den nye verdien.
Oppdatere cachen etter en mutasjon
Send en update-funksjon til useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).
Dette legger det nye innlegget til i brukerens bufrede liste over innlegg og oppdaterer alle komponenter som viser brukerens innleggs liste.
cache.evict: Fjerne cache-oppføringer
cache.evict({ id: 'User:1' }) fjerner User:1-oppføringen fra cachen. Alle aktive spørringer som inkluderte User:1, gjengis på nytt med denne entiteten fjernet fra resultatet.
Etter at du har fjernet oppføringer, kaller du cache.gc() for å fjerne objekter som ikke lenger kan nås fra rotspørringer. Dette hindrer minnelekkasjer i applikasjoner som kjører lenge.
Søppeltømming
cache.gc() går gjennom cache-grafen med utgangspunkt i alle aktive spørringer og fjerner entiteter som ikke lenger kan nås. Det er trygt å kalle funksjonen med jevne mellomrom eller etter batchmutasjoner som sletter mange entiteter.
Entiteter som refereres til av aktive useQuery-hooks, blir aldri samlet inn av søppeltømmingen. Det er bare foreldreløse entiteter som ikke lenger inngår i noe spørringsresultat, som fjernes.
Cache-omdirigeringer med feltpolicyer
Hvis du spør etter én entitet (GET_USER med id) som allerede er bufret som en del av en listespørring, kan Apollo lese den fra cachen uten en ny nettverksforespørsel ved hjelp av feltpolicyer: keyArgs og read-funksjoner i typepolicyen.
read-funksjonen returnerer en cacherreferanse: return toReference({ __typename: 'User', id: args.id }), som forteller Apollo å lese fra den eksisterende User:id-cacheoppføringen.
Egendefinerte keyFields for ID-er som ikke følger standarden
Hvis entitetene dine bruker et annet felt enn id som unik nøkkel, for eksempel slug eller uuid, konfigurerer du det i typepolicyen: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).
Apollo bruker da Post:my-post-slug som cache-nøkkel i stedet for å kreve et id-felt, slik at normaliseringen også bevares for skjemaer med andre nøkkelfelt.
refetchQueries kontra update-funksjon
refetchQueries: [{ query: GET_USERS }] i useMutation-alternativene utløser en ny nettverksforespørsel etter at mutasjonen er fullført. Det er enklere, men sender alltid en nettverksforespørsel.
update-funksjonen endrer cachen lokalt og unngår nettverksforespørselen. Bruk refetchQueries når cache-oppdateringslogikken er for kompleks å skrive, eller når serverberegnede felt gjør lokale cache-oppdateringer upålitelige.
Normaliseringsnøkkelen i InMemoryCache
Hvilket format bruker InMemoryCache som standard for cache-nøkler når entiteter lagres?
Leksjonsoppsummering
InMemoryCache normaliserer entiteter etter __typename+id, noe som muliggjør automatiske oppdateringer på tvers av spørringer. Les og skriv til cachen med cache.readQuery, cache.writeQuery og cache.modify. Fjern entiteter med cache.evict etterfulgt av cache.gc. Konfigurer egendefinerte nøkkelfelt via typePolicies for primærnøkler som ikke er id.
Bruk update-funksjoner for mutasjoner for effektiv lokal cache-håndtering. Bruk refetchQueries når serverberegnede felt gjør lokale oppdateringer upålitelige.
Lær deg React med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 88
- Leksjoner
- 324
Ofte stilte spørsmål
Er leksjonen «Apollo-hurtigbuffer: normalisering og oppdateringer» gratis?
Ja – hele teksten i «Apollo-hurtigbuffer: normalisering og oppdateringer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av React Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i React Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Apollo-hurtigbuffer: normalisering og oppdateringer»?
Forstå Apollos normaliserte InMemoryCache, og oppdater hurtigbufrede data etter mutasjoner uten å hente dem på nytt. Du øver på React Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med React Academy?
Ingen tidligere erfaring er nødvendig. React Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Apollo-hurtigbuffer: normalisering og oppdateringer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne React Academy-leksjonen?
Ja. Alle React Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- GraphQL-grunnlag for React-utviklere
- Konfigurere Apollo Client i React
- useQuery- og useMutation-hooks
- Apollo-hurtigbuffer: normalisering og oppdateringer