Communitygithub.com

sakilanwar12/nextjs-typescript-skills

À utiliser pour récupérer des données dans Next.js App Router — fetch RSC, mise en cache, revalidation, streaming Suspense, récupération parallèle ou Route Handlers. Garantit un comportement correct du cache et des cascades.

Qu'est-ce que nextjs-typescript-skills ?

Ce skill automatise les bonnes pratiques de récupération de données dans Next.js App Router, en se concentrant sur le rendu côté serveur (RSC). Il guide les développeurs pour utiliser `fetch` de manière appropriée dans les composants serveur, gérer la mise en cache (par défaut, `'no-store'` ou `next: { revalidate }`), paralléliser les requêtes indépendantes et intégrer le streaming via `<Suspense>` et `loading.tsx`. Il couvre les schémas critiques comme la revalidation à la demande avec `revalidateTag` et les route handlers. Le skill est destiné aux projets Next.js 13+ et est compatible avec tout agent utilisant le système de skills basé sur markdown. Il fonctionne en fournissant des règles claires, des exemples de code en TypeScript et une checklist de conformité pour éviter les comportements de waterfall et les erreurs de cache.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Récupération de données Next.js

Règles

  1. Effectuez les fetchs dans les composants serveur avec async/await. N'utilisez pas useEffect pour les données initiales.
  2. fetch() est mis en cache par défaut dans App Router, sauf si { cache: 'no-store' } ou next: { revalidate } précise le contraire. Sachez ce que vous voulez.
  3. Parallélisez les requêtes indépendantes avec Promise.all. Séquencez uniquement lorsqu'elles sont dépendantes.
  4. Enveloppez les sections lentes dans <Suspense fallback> + loading.tsx pour le streaming.
  5. Utilisez next: { tags: ['posts'] } + revalidateTag('posts') pour l'invalidation à la demande.
  6. Utilisez la récupération côté client (SWR/React Query) uniquement pour les interfaces interactives/filtrées — pas pour le premier affichage.

Schémas

// Statique avec revalidation (ISR)
async function getPosts() {
  const res = await fetch('https://api.example.com/posts', {
    next: { revalidate: 60 },
  });
  if (!res.ok) throw new Error('Échec de la récupération des posts');
  return res.json();
}

// Dynamique, jamais mis en cache
async function getInbox(userId: string) {
  const res = await fetch(`https://api.example.com/inbox/${userId}`, {
    cache: 'no-store',
  });
  return res.json();
}

// Parallèle dans un composant serveur
export default async function Dashboard() {
  const [user, posts] = await Promise.all([getUser(), getPosts()]);
  return <View user={user} posts={posts} />;
}

// Streaming d'une section lente
import { Suspense } from 'react';
export default function Page() {
  return (
    <div>
      <FastHeader />
      <Suspense fallback={<CommentsSkeleton />}>
        <SlowComments />
      </Suspense>
    </div>
  );
}
// app/api/revalidate/route.ts — revalidation à la demande
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 });
}

Checklist

  • Les fetchs sont dans des composants serveur, pas dans useEffect ?
  • Le mode de cache est explicite (revalidate, no-store, ou tags) ?
  • Les requêtes indépendantes sont parallélisées ?
  • Une limite Suspense est-elle présente pour les parties lentes ?
  • Les erreurs sont-elles gérées (throw → error.tsx, ou repli gracieux) ?

Individual skills in this repo

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

Skills associés