Communitygithub.com

sakilanwar12/nextjs-typescript-skills

Úsalo al obtener datos en Next.js App Router: fetch RSC, caché, revalidación, streaming con Suspense, obtención en paralelo o Route Handlers. Asegura un comportamiento correcto de la caché y evita cascadas.

¿Qué es nextjs-typescript-skills?

Este skill guía a los desarrolladores en la implementación correcta de la obtención de datos en aplicaciones Next.js que utilizan el App Router, con énfasis en React Server Components (RSC). Proporciona reglas claras para evitar errores comunes, como el uso de `useEffect` para datos iniciales o la creación de solicitudes en cascada innecesarias. Explica cómo controlar la caché por defecto de `fetch()` mediante las opciones `cache` y `next.revalidate`, y cómo paralelizar solicitudes independientes con `Promise.all` para mejorar el rendimiento. También cubre el streaming de contenido lento con `<Suspense>` y `loading.tsx`, la revalidación bajo demanda con `revalidateTag`, y las mejores prácticas para el fetching del lado del cliente (SWR/React Query). Incluye ejemplos de código para ISR, datos dinámicos sin caché, componentes de servidor con promesas paralelas y una ruta de API para revalidación.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sakilanwar12/nextjs-typescript-skills/tree/HEAD/skills/nextjs-data-fetching

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Obtención de Datos en Next.js

Reglas

  1. Realiza el fetch en Server Components con async/await. No uses useEffect para los datos iniciales.
  2. fetch() está cacheado por defecto en App Router a menos que se especifique { cache: 'no-store' } o next: { revalidate }. Conoce cuál quieres usar.
  3. Paraleliza solicitudes independientes con Promise.all. Secuencializa solo cuando haya dependencias.
  4. Envuelve secciones lentas en <Suspense fallback> + loading.tsx para streaming.
  5. Usa next: { tags: ['posts'] } + revalidateTag('posts') para invalidación bajo demanda.
  6. El fetching del lado del cliente (SWR/React Query) solo para UI interactiva o filtrada, no para la primera pintura.

Patrones

// Estático con revalidación (ISR)
async function getPosts() {
  const res = await fetch('https://api.example.com/posts', {
    next: { revalidate: 60 },
  });
  if (!res.ok) throw new Error('Error al obtener los posts');
  return res.json();
}

// Dinámico, nunca cacheado
async function getInbox(userId: string) {
  const res = await fetch(`https://api.example.com/inbox/${userId}`, {
    cache: 'no-store',
  });
  return res.json();
}

// Paralelo en un Server Component
export default async function Dashboard() {
  const [user, posts] = await Promise.all([getUser(), getPosts()]);
  return <View user={user} posts={posts} />;
}

// Streaming de una sección lenta
import { Suspense } from 'react';
export default function Page() {
  return (
    <div>
      <FastHeader />
      <Suspense fallback={<CommentsSkeleton />}>
        <SlowComments />
      </Suspense>
    </div>
  );
}
// app/api/revalidate/route.ts — revalidación bajo demanda
import { revalidateTag } from 'next/cache';
export async function POST(req: Request) {
  const { tag, secret } = await req.json();
  if (secret !== process.env.REVALIDATE_SECRET)
    return Response.json({ ok: false }, { status: 401 });
  revalidateTag(tag);
  return Response.json({ ok: true });
}

Lista de Verificación

  • ¿Fetch en Server Component, no useEffect?
  • ¿Modo de caché explícito (revalidate, no-store o tags)?
  • ¿Solicitudes independientes paralelizadas?
  • ¿Límite de Suspense para partes lentas?
  • ¿Errores manejados (throw → error.tsx, o fallback elegante)?

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Skills relacionados