Ingénieur senior Next.js / React / TypeScript
Next.js change rapidement et la mémoire du modèle est souvent obsolète. Avant d'utiliser une API qui dépend d'une version, vérifiez references/versions.md. Si le next installé contient une documentation groupée (node_modules/next/dist/docs/) ou un AGENTS.md généré par Next.js, préférez-les à la mémoire.
Étape 0 : détecter les versions et les conventions (toujours)
Exécutez bash scripts/detect_versions.sh (lecture seule), puis confirmez :
-
package.json+ fichier de verrouillage (pnpm/npm/yarn/bun) → next, react, typescript, tailwindcss, outils de test ; utilisez le gestionnaire de paquets du fichier de verrouillage -
next.config.*→cacheComponents,partialPrefetching,reactCompiler,experimental.* - Routeur :
app/vssrc/app/, éventuelspages/(routeurs mixtes),proxy.tsvsmiddleware.tshérité - Couche de données : ORM/SDK, modules
lib/dal.tsouserver-onlyexistants, bibliothèque d'authentification - Style et kit UI (version Tailwind, CSS Modules, shadcn/ui, jetons de design), lint/format (ESLint flat config vs Biome)
- Tests : Vitest/Jest, Testing Library, Playwright ; scripts CI existants
Respectez les conventions existantes. Si le projet est sur une version majeure plus ancienne, écrivez du code qui fonctionne sur cette version.
Valeurs par défaut (une par décision, avec échappatoire)
| Décision | Valeur par défaut | Utiliser l'alternative quand |
|---|---|---|
| Type de composant | Composant Serveur | Besoin d'état, d'effets, d'API navigateur ou de gestionnaires d'événements → "use client" à la plus petite feuille |
| Modèle de cache (16.x) | Cache Components (cacheComponents: true, 'use cache' + cacheLife/cacheTag) | Application existante sur l'ancien modèle sans migration prévue. Ne faites pas de demi-migration |
| Mutations | Server Actions + revalidateTag/updateTag/refresh | API publique consommée par d'autres clients → route handler |
| Accès aux données | Une couche d'accès aux données (DAL) server-only qui authentifie et autorise chaque lecture/écriture | — |
| Interception de requêtes | proxy.ts pour les redirections/réécritures/en-têtes uniquement | Jamais pour l'autorisation comme seul contrôle |
| Runtime | Node.js (par défaut) | Aucun dans 16.3+ : runtime = 'edge' est déprécié/non pris en charge |
| Formulaires | <form action={serverAction}> + useActionState + validation de schéma (zod ou celui du projet) côté serveur | Assistants complexes côté client uniquement → bibliothèque formulaire client déjà dans le projet |
| Style | Système du projet ; pour les nouveaux projets Tailwind CSS v4 avec configuration CSS-first | — |
| État côté client | Paramètres de recherche d'URL → état serveur → état React ; store global uniquement si nécessaire | — |
| Mémoïsation | React Compiler si activé ; sinon ne mémoïser que les hotspots mesurés | — |
| Tests | Vitest + Testing Library pour les unitaires ; Playwright pour les flux E2E critiques | Jest déjà configuré |
Workflow A : construire une route ou une fonctionnalité
- [ ] Étape 0 terminée
- [ ] Segment de route : page.tsx, layout.tsx, loading.tsx/limites Suspense, error.tsx, not-found.tsx si nécessaire
- [ ] Données via la DAL (server-only), attendues dans les Composants Serveur ; params/searchParams sont des Promesses : `const { id } = await params`
- [ ] Décidez ce qui est mis en cache ('use cache' + cacheLife/cacheTag) vs au moment de la requête (dans Suspense)
- [ ] Mutations via Server Actions : validez l'entrée, revérifiez l'autorisation dans l'action, revalidez les tags
- [ ] Composants clients minimaux ; props sérialisables ; pas de secrets dans les bundles client (seuls NEXT_PUBLIC_* atteignent le navigateur)
- [ ] Accessibilité : éléments sémantiques, libellés, gestion du focus, parcours clavier, contraste des couleurs
- [ ] Tests pour la logique + un E2E pour le chemin critique
- [ ] La boucle de validation passe
Validez → corrigez → répétez :
pnpm exec tsc --noEmit # ou équivalents npm/yarn/bun
pnpm lint # ESLint ou Biome selon le projet (next lint a été supprimé dans 16)
pnpm test -- --run # Vitest
pnpm build # détecte les erreurs de Cache Components / prérendu
pnpm exec playwright test # quand E2E existe
Les erreurs next build concernant des données non mises en cache en dehors de <Suspense> sont des signaux, pas du bruit. Corrigez en ajoutant 'use cache', en déplaçant l'accès dans une limite Suspense, ou en le marquant comme étant au moment de la requête.
Workflow B : mettre à niveau Next.js (faible liberté)
- [ ] Lisez references/versions.md "Anciens motifs" et les seuils de sécurité
- [ ] Validez un arbre propre ; créez une branche
- [ ] Exécutez l'outil officiel de mise à niveau : `npx next@canary upgrade --agent=latest`
(ou `npx @next/codemod@canary upgrade latest` si le flux agent n'est pas disponible)
- [ ] Mettez à niveau react, react-dom et @types/react en même temps que next
- [ ] Supprimez les exports `runtime = 'edge'` ; renommez middleware.ts → proxy.ts (runtime Node)
- [ ] Boucle de validation ; puis testez manuellement l'authentification, les redirections, la mise en cache et la revalidation
Sécurité d'abord : si la version installée est inférieure à un seuil corrigé dans versions.md, mettez à niveau next lui-même (corriger les paquets React seuls ne suffit pas).
Workflow C : adopter les Cache Components dans une application existante
Migrez route par route. Activez cacheComponents (+ partialPrefetching sur 16.4+) sur une branche, exécutez next build, et corrigez chaque limite signalée. Voir references/caching.md. Si installée, la compétence Next.js next-cache-components-adoption couvre les mécanismes en profondeur ; utilisez-la conjointement avec celle-ci.
Règles d'authentification et de sécurité
- Autorisez dans la DAL et dans chaque Server Action et route handler. Les vérifications proxy/middleware ne sont qu'une redirection optimiste. CVE-2025-29927 a montré que les contournements basés sur les en-têtes du middleware sont possibles.
- Les Server Actions sont des points de terminaison HTTP publics : validez l'entrée, vérifiez la session, vérifiez la propriété.
- Importez
server-onlydans les modules contenant des secrets ou un accès à la base de données ; retournez des DTOs (champs uniquement nécessaires) aux Composants Clients. - Détails :
references/data-and-auth.md.
Implémentation à partir d'un design ou d'une maquette
- Inventoriez le design : jetons (couleur, échelle de typographie, espacement, rayon), composants, états (hover, focus, disabled, loading, empty, error) et points de rupture.
- Mappez-les d'abord aux jetons et composants existants du projet ; ajoutez de nouveaux jetons au thème, pas comme des valeurs ponctuelles.
- Construisez d'abord le balisage statique du Composant Serveur, puis ajoutez l'interactivité aux feuilles.
- Vérifiez à 320px, tablette et largeurs de bureau. Vérifiez le clavier et les libellés du lecteur d'écran. Respectez
prefers-reduced-motion. - Si un outil de navigateur ou Playwright est disponible, prenez une capture d'écran et comparez-la à la maquette ; itérez jusqu'à ce que l'espacement et la typographie correspondent.
Mode revue
Utilisez references/review-checklist.md. Signalez chaque constatation comme bloquant / devrait-corriger / nit, avec fichier:ligne, le problème et une correction de code concrète. Ordonnez les constatations par gravité. Les bloqueurs incluent : authentification uniquement dans le proxy, secrets atteignant les bundles client, entrée de Server Action non validée, version vulnérable de next, et données spécifiques à un utilisateur dans une portée 'use cache' partagée.
Plan de référence
references/versions.md: versions, seuils de sécurité, anciens motifs, notes de vérificationreferences/data-and-auth.md: motif DAL, modèle de Server Action, gestion de sessionreferences/caching.md: règles des Cache Components, ensureStatic, navigation()/prefetch()references/review-checklist.md: règles classées par impact