Data fetching in React e Next.js, a confronto su un'unica app

Data fetching in React: server, TanStack Query, SWR | We.Inc

Scegli un approccio al data fetching in React con un breve quiz, poi confronta server component, TanStack Query e SWR su cache, mutation e comportamenti predefiniti, su un'unica app di esempio.

Recupera i dati sul server quando puoi: nell'App Router di Next.js un server component asincrono attende i dati prima che venga inviato qualsiasi HTML, senza codice per lo spinner di caricamento. Per i dati che cambiano mentre la pagina è aperta, usa una cache lato client come TanStack Query o SWR, che gestiscono cache, nuovi tentativi e mutation. Un semplice fetch in useEffect va bene per richieste occasionali.

Quale approccio si adatta

Ogni esempio in questa pagina carica e modifica la stessa piccola lista di note, quindi le differenze dipendono dall'approccio e non dalla demo. Rispondi alle tre domande qui sotto per avere una raccomandazione di partenza e lo snippet corrispondente.

Domande frequenti

Le richieste fetch sono in cache nell'App Router di Next.js?

Secondo l'attuale documentazione di Next.js, le richieste fetch non sono in cache per impostazione predefinita e bloccano il rendering finché non terminano. Le richieste identiche in un rendering vengono memoizzate, e attivi la cache con la direttiva use cache oppure trasmetti dati freschi in streaming dentro Suspense.

Quali sono i default importanti di TanStack Query?

I dati diventano subito obsoleti (staleTime 0), quindi vengono ricaricati al mount, al focus della finestra e alla riconnessione. Le query inutilizzate restano in memoria per 5 minuti (gcTime), e le query fallite riprovano 3 volte con backoff esponenziale. Aumenta staleTime se questi ricaricamenti sono più di quanto ti serve.

TanStack Query o SWR?

Entrambi fanno cache per chiave e rivalidano al focus e alla riconnessione. TanStack Query include più funzioni integrate per mutation, invalidazione e devtools; SWR ha un'API più piccola costruita attorno a useSWR(key, fetcher). Scegline uno per app; usarli entrambi duplica la cache.

Mi serve ancora una libreria client con i server component?

Spesso no per il caricamento delle pagine. Ti serve quando i dati devono aggiornarsi senza navigazione, quando gli utenti modificano e si aspettano un riscontro immediato, o per le liste infinite. Molte app caricano sul server e usano una cache client solo nelle schermate interattive.

Come dovrei verificare chi ha effettuato l'accesso con Supabase sul server?

La guida lato server di Supabase dice di non fidarsi mai di getSession() nel codice server. Chiama supabase.auth.getClaims(), che verifica la firma del token, poi interroga le tue tabelle; la row level security si applica comunque a ogni query.

Prima il server, poi aggiungi una cache client dove serve

Streaming invece di attendere

Perché il semplice schema con useEffect non basta

Default che sorprendono

Comportamento predefinito

Evitare le cascate sul server

Avvia entrambe le richieste, poi attendile insieme

Chiamare entrambe le funzioni prima dell'await significa che nessuna aspetta l'altra.

Trasmetti in streaming una parte lenta con Suspense

Il titolo viene inviato subito; la lista di note arriva in streaming quando arrivano i suoi dati.

Supabase in un server component

Qui si usa l'helper createClient dalla guida lato server di Supabase per Next.js (lib/supabase/server.ts, basato su @supabase/ssr). getClaims() verifica il token dell'utente connesso prima che la query venga eseguita.

Note dell'utente connesso, caricate sul server

La row level security sulla tabella notes decide quali righe vengono restituite.

Scegli un approccio

Usi i server component (per esempio l'App Router di Next.js)?

I dati devono aggiornarsi mentre la pagina resta aperta?

Gli utenti modificano questi dati sullo schermo?

Sì

No

Snippet di partenza

Copia snippet

Caricali in un server component asincrono. Aggiungi una cache client in seguito solo per le parti che diventano interattive.

Usa TanStack Query: useQuery per leggere, useMutation per scrivere e invalidateQueries per aggiornare dopo una modifica.

Usa SWR: useSWR mantiene la vista aggiornata al focus e alla riconnessione con pochissimo codice.

Qui basta un singolo fetch in useEffect. Fai pulizia con un flag ignore così una risposta tardiva non può sovrascrivere uno stato più recente.

Raccomandazione: {v}

Server component

TanStack Query

SWR

useEffect e fetch

Inizia gratis · Nessuna carta di credito richiesta

Correlati: Guide

Prodotto

Per chi è

Funzionalità

Risorse

Azienda

Mappa del sito