0Pricing
React Academy · Lezione

Cache di Apollo: normalizzazione e aggiornamenti

Comprendere la InMemoryCache normalizzata di Apollo e aggiornare i dati in cache dopo le mutation senza ripetere il fetch

Cache di Apollo: normalizzazione e aggiornamenti è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Come InMemoryCache normalizza i dati

InMemoryCache memorizza ogni oggetto usando una chiave di cache composta da __typename e id: User:1, Post:42. Quando una query restituisce un User con id "1", l'oggetto viene memorizzato una sola volta con questa chiave, indipendentemente dal numero di query diverse che lo includono.

Qualsiasi query successiva che recupera lo stesso User:1 legge dalla singola voce della cache, garantendo che tutti i componenti visualizzino gli stessi dati.

Aggiornamenti automatici tra query

Quando una mutation restituisce un oggetto User:1 aggiornato, Apollo lo scrive nella voce della cache User:1. Ogni query attiva che include User:1 riflette automaticamente i campi aggiornati nell'interfaccia, senza codice aggiuntivo.

Questo aggiornamento automatico è il principale vantaggio di una cache normalizzata rispetto a una cache basata su documenti (con chiavi di query).

cache.readQuery

Legge il risultato corrente memorizzato nella cache di una query: cache.readQuery({ query: GET_USERS }) restituisce l'oggetto dati come se fosse stato restituito da useQuery. Restituisce null se la query non è presente nella cache.

Utilizzi readQuery all'interno delle funzioni di aggiornamento delle mutation per leggere l'elenco corrente prima di modificarlo.

cache.writeQuery

cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) scrive direttamente nella cache, attivando il re-render di tutti i componenti che leggono GET_USERS. Non viene effettuata alcuna richiesta di rete.

Combini readQuery e writeQuery per implementare aggiornamenti immutabili della cache: legga, crei un nuovo array e lo riscriva.

cache.modify per aggiornare direttamente le entità

cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) modifica direttamente i campi di una specifica entità nella cache. Non è necessario leggere prima una query quando si conosce l'ID della cache dell'entità.

L'oggetto fields associa i nomi dei campi a funzioni di modifica che ricevono il valore corrente e restituiscono il nuovo valore.

Aggiornare la cache dopo una mutation

Passi una funzione update a useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).

Questa operazione aggiunge il nuovo post all'array dei post memorizzato nella cache dell'utente, aggiornando tutti i componenti che mostrano l'elenco dei post dell'utente.

cache.evict: rimozione delle voci della cache

cache.evict({ id: 'User:1' }) rimuove la voce User:1 dalla cache. Qualsiasi query attiva che include User:1 viene nuovamente renderizzata senza quell'entità nel risultato.

Dopo aver rimosso le voci, chiami cache.gc() per eliminare gli oggetti che non sono più raggiungibili dalle query radice. In questo modo si evitano perdite di memoria nelle applicazioni a esecuzione prolungata.

Garbage collection

cache.gc() percorre il grafo della cache partendo da tutte le query attive e rimuove le entità non più raggiungibili. È sicuro chiamarla periodicamente o dopo mutation in batch che eliminano molte entità.

Le entità a cui fanno riferimento hook useQuery attivi non vengono mai sottoposte a garbage collection: vengono eliminate solo le entità orfane che non fanno più parte di alcun risultato di query.

Reindirizzamenti della cache con le field policy

Se esegue una query per una singola entità (GET_USER per id) già memorizzata nella cache come parte di una query di elenco, Apollo può leggerla dalla cache senza un round trip di rete, utilizzando le field policy: keyArgs e le funzioni read nella type policy.

La funzione read restituisce un riferimento alla cache: return toReference({ __typename: 'User', id: args.id }), indicando ad Apollo di leggere dalla voce esistente della cache User:id.

keyFields personalizzati per ID non standard

Se le entità usano un campo diverso da id come chiave univoca (ad esempio slug o uuid), lo configuri nella type policy: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } }).

Apollo usa quindi Post:my-post-slug come chiave della cache invece di richiedere un campo id, mantenendo la normalizzazione per gli schemi non standard.

refetchQueries vs funzione update

refetchQueries: [{ query: GET_USERS }] nelle opzioni di useMutation attiva un nuovo recupero dalla rete al termine della mutation. È più semplice, ma comporta sempre una richiesta di rete.

La funzione update modifica la cache localmente ed evita il round trip di rete. Utilizzi refetchQueries quando la logica di aggiornamento della cache è troppo complessa da scrivere o quando i campi calcolati dal server rendono inaffidabili gli aggiornamenti locali.

Chiave di normalizzazione di InMemoryCache

Qual è il formato predefinito della chiave della cache utilizzato da InMemoryCache per memorizzare le entità?

Riepilogo della lezione

InMemoryCache normalizza le entità usando __typename+id, consentendo aggiornamenti automatici tra query. Legga e scriva nella cache con cache.readQuery, cache.writeQuery e cache.modify. Rimuova le entità con cache.evict seguito da cache.gc. Configuri campi chiave personalizzati tramite typePolicies per chiavi primarie diverse da id.

Utilizzi le funzioni di aggiornamento delle mutation per una gestione efficiente della cache locale; utilizzi refetchQueries quando i campi calcolati dal server rendono inaffidabili gli aggiornamenti locali.

Domande Frequenti

La lezione «Cache di Apollo: normalizzazione e aggiornamenti» è gratuita?

Sì — il testo completo di «Cache di Apollo: normalizzazione e aggiornamenti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Cache di Apollo: normalizzazione e aggiornamenti»?

Comprendere la InMemoryCache normalizzata di Apollo e aggiornare i dati in cache dopo le mutation senza ripetere il fetch Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Cache di Apollo: normalizzazione e aggiornamenti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Fondamenti di GraphQL per sviluppatori React
  2. Configurare Apollo Client in React
  3. Hook useQuery e useMutation
  4. Cache di Apollo: normalizzazione e aggiornamenti
← Torna a React Academy