Obtener datos en React y Next.js, comparado en una sola app

Obtener datos en React: servidor, TanStack Query, SWR | We.Inc

Elige cómo obtener datos en React con un test breve y luego compara server components, TanStack Query y SWR en caché, mutaciones y valores por defecto, sobre una misma app de ejemplo.

Obtén los datos en el servidor cuando puedas: en el App Router de Next.js, un server component asíncrono espera los datos antes de enviar cualquier HTML, sin código de spinner de carga. Para datos que cambian mientras la página está abierta, usa una caché de cliente como TanStack Query o SWR, que gestionan la caché, los reintentos y las mutaciones. Un fetch simple en useEffect sirve para peticiones puntuales.

Qué enfoque encaja

Todos los ejemplos de esta página cargan y editan la misma lista pequeña de notas, así que las diferencias vienen del enfoque y no de la demo. Responde las tres preguntas de abajo para obtener una recomendación inicial y el fragmento que le corresponde.

Preguntas frecuentes

¿Se guardan en caché las peticiones fetch en el App Router de Next.js?

Según la documentación actual de Next.js, las peticiones fetch no se guardan en caché por defecto y bloquean el renderizado hasta que terminan. Las peticiones idénticas dentro de un mismo render se memoizan, y activas la caché con la directiva use cache o transmites datos frescos dentro de Suspense.

¿Cuáles son los valores por defecto importantes de TanStack Query?

Los datos quedan obsoletos de inmediato (staleTime 0), así que se vuelven a pedir al montar, al enfocar la ventana y al reconectar. Las consultas sin uso permanecen en memoria 5 minutos (gcTime), y las consultas fallidas se reintentan 3 veces con backoff exponencial. Sube staleTime si esos reintentos son más de lo que necesitas.

¿TanStack Query o SWR?

Ambos cachean por clave y revalidan al enfocar y al reconectar. TanStack Query incluye más funciones integradas para mutaciones, invalidación y devtools; SWR tiene una API más pequeña construida alrededor de useSWR(key, fetcher). Elige uno por app; usar los dos duplica la caché.

¿Sigo necesitando una librería de cliente con server components?

A menudo no para cargar páginas. La necesitas cuando los datos deben refrescarse sin navegar, cuando los usuarios editan y esperan respuesta inmediata, o para listas infinitas. Muchas apps cargan en el servidor y usan una caché de cliente solo en las pantallas interactivas.

¿Cómo compruebo en el servidor quién ha iniciado sesión con Supabase?

La guía de servidor de Supabase dice que nunca confíes en getSession() dentro del código de servidor. Usa supabase.auth.getClaims(), que verifica la firma del token, y luego consulta tus tablas; la seguridad a nivel de fila sigue aplicándose a cada consulta.

Primero el servidor, y luego una caché de cliente donde haga falta

Streaming en lugar de esperar

Por qué el patrón simple con useEffect se queda corto

Valores por defecto que sorprenden

Comportamiento de serie

Evitar cascadas en el servidor

Lanza ambas peticiones y espéralas juntas

Llamar a ambas funciones antes del await hace que ninguna espere a la otra.

Transmite una parte lenta con Suspense

El encabezado se envía de inmediato; la lista de notas llega por streaming cuando sus datos están listos.

Supabase en un server component

Esto usa el helper createClient de la guía de servidor de Supabase para Next.js (lib/supabase/server.ts, construido sobre @supabase/ssr). getClaims() verifica el token del usuario con sesión iniciada antes de ejecutar la consulta.

Notas del usuario con sesión iniciada, cargadas en el servidor

La seguridad a nivel de fila de la tabla notes decide qué filas se devuelven.

Elige un enfoque

¿Usas server components (por ejemplo, el App Router de Next.js)?

¿Deben refrescarse los datos mientras la página sigue abierta?

¿Los usuarios editan estos datos en la pantalla?

Sí

No

Fragmento inicial

Copiar fragmento

Cárgalo en un server component asíncrono. Añade una caché de cliente más adelante solo para las partes que se vuelvan interactivas.

Usa TanStack Query: useQuery para leer, useMutation para escribir e invalidateQueries para refrescar tras un cambio.

Usa SWR: useSWR mantiene la vista actualizada al enfocar y al reconectar con muy poco código.

Aquí basta con un único fetch en useEffect. Haz la limpieza con un flag ignore para que una respuesta tardía no sobrescriba un estado más reciente.

Recomendación: {v}

Server component

TanStack Query

SWR

useEffect y fetch

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio