Aller au contenu
Toutes les notes
  • Next.js
  • React
  • TypeScript
  • Performance
  • Architecture Web

Next.js App Router & Server Actions : concevoir des applications web résilientes et sobres

Pourquoi l'alliance des Server Components et Server Actions redéfinit la gestion d'état, réduit drastiquement le bundle client et améliore l'expérience utilisateur sur réseaux instables.

Bendy SERVILUS3 min de lecture

Le web applicatif contemporain souffre régulièrement d'une dérive d'embonpoint : des centaines de kilo-octets de bibliothèques JavaScript expédiés au navigateur pour des fonctionnalités qui relèvent essentiellement du rendu d'information et de la mise à jour de données.

Dans un contexte où les conditions réseau peuvent être dégradées (connexions 3G/4G intermittentes, latence élevée), chaque mégaoctet de JavaScript client pénalise directement le First Input Delay et le temps de rendu interactif. L'écosystème Next.js (App Router) couplé aux Server Actions apporte une réponse architecturale salutaire.

1. Le paradigme des React Server Components (RSC)

Contrairement au modèle SPA traditionnel où les composants sont hydratés intégralement dans le navigateur, les Server Components s'exécutent exclusivement sur le serveur d'application :

  • Zéro JavaScript client expédié : Si votre composant ne manipule ni état local d'interaction (useState) ni écouteurs d'événements, son code source ne quitte jamais le serveur. Seul le flux HTML / RSC Payload est transmis.

  • Accès direct aux ressources de données : Vous pouvez interroger votre base PostgreSQL (via Prisma ou Drizzle) directement dans la fonction du composant asynchrone, éliminant les allers-retours HTTP superflus.

  • Sécurité hermétique : Les clés d'API secrètes, tokens d'authentification et modules de chiffrement ne risquent jamais d'apparaître dans le bundle du client.

2. Les Server Actions comme couche de mutation unifiée

Pendant des années, chaque mutation nécessitait de créer une route d'API dédiée (/api/projects), de la consommer avec fetch() côté client, de gérer les en-têtes d'authentification, puis de synchroniser manuellement le cache local (Redux, React Query, Zustand).

Avec les Server Actions, la mutation devient une simple fonction asynchrone annotée par 'use server'. La sérialisation RPC, le transport et la sécurité CSRF sont pris en charge nativement par le framework.

'use server';

import { z } from 'zod';
import { revalidatePath } from 'next/cache';
import { prisma } from '@/lib/prisma';
import { requireAuth } from '@/lib/auth';

const PostUpdateSchema = z.object({
  id: z.string().cuid(),
  title: z.string().min(3).max(180),
  published: z.boolean(),
});

export async function updatePostStatusAction(input: unknown) {
  // 1. Contrôle d'accès strict côté serveur
  await requireAuth();

  // 2. Validation de type et de forme avec Zod
  const parsed = PostUpdateSchema.safeParse(input);
  if (!parsed.success) {
    return { error: 'Paramètres invalides.' };
  }

  // 3. Écriture directe en base de données
  const updated = await prisma.post.update({
    where: { id: parsed.data.id },
    data: {
      titleFr: parsed.data.title,
      status: parsed.data.published ? 'PUBLISHED' : 'DRAFT',
    },
  });

  // 4. Invalidation ciblée du cache Next.js
  revalidatePath('/blog');
  revalidatePath('/dashboard/blog');

  return { success: true, post: updated };
}

3. Amélioration progressive et résilience réseau

L'un des avantages majeurs réside dans la compatibilité naturelle avec les formulaires HTML standards. Si vous associez une Server Action à la prop action d'un formulaire :

Le formulaire peut soumettre ses données même si le JavaScript client n'a pas encore fini de charger ou a échoué à cause d'une coupure réseau temporaire.

Lorsque le script s'exécute, React intercepte la soumission pour offrir une navigation instantanée avec mise à jour optimiste via le hook useOptimistic.

4. Trois règles d'or pour la production

  • Ne jamais faire confiance aux entrées : Même si l'action ressemble à un appel de fonction TypeScript ordinaire, elle est exposée via un point de terminaison HTTP public. Validez toujours la totalité des arguments avec Zod ou Valibot.

  • Gérer la concurrence avec Suspense : Découpez vos interfaces lourdes en sous-arbres enveloppés de balises <Suspense> pour streamer le contenu au fil de sa disponibilité.

  • Mesurer l'empreinte client : Surveillez le bundle final généré lors de la phase de build pour vous assurer que les bibliothèques lourdes restent strictement côté serveur.

Conclusion

En combinant un modèle de rendu centré sur le serveur et des mutations intégrées, Next.js permet de construire des applications à la fois riches visuellement, extrêmement véloces au chargement et sobres en ressources réseau.

Mis à jour le 15 oct. 2026

Partager cette note