# Next.js 16 Server Actions en 2026 : mutations, revalidation et questions d'entretien > Comment les Server Actions de Next.js 16 gèrent les mutations, la revalidation, l'état pending, l'UI optimiste et la sécurité, avec les questions d'entretien qui testent chaque concept. - Published: 2026-06-24 - Updated: 2026-07-06 - Author: SharpSkill - Tags: next.js, server-actions, react, mutations, revalidation, interview - Reading time: 11 min --- Les Server Actions de Next.js transforment une simple fonction asynchrone en un endpoint de mutation côté serveur qu'un formulaire peut appeler directement, sans route API, sans `fetch` client et sans sérialisation JSON manuelle. Dans Next.js 16, elles constituent la manière par défaut d'écrire des mutations de données, et elles reviennent dans presque chaque entretien React senior en 2026. Cette analyse détaillée décortique leur exécution, la façon dont la revalidation propage des données fraîches vers l'interface, la modélisation des états pending et d'erreur, ainsi que les règles de sécurité qui piègent la plupart des développeurs. > **Définition en une phrase** > > Une Server Action est une fonction asynchrone marquée par `"use server"` qui s'exécute uniquement sur le serveur et peut être appelée depuis un composant client ou un formulaire comme si elle était locale, tandis que Next.js gère automatiquement la requête réseau, la sérialisation des arguments et la protection CSRF. ## Comment les Server Actions s'exécutent en coulisses Une Server Action est une fonction exclusivement serveur invoquée sur le réseau via un endpoint généré par le compilateur. Lorsqu'une fonction porte la directive `"use server"`, le compilateur de Next.js n'envoie jamais son corps au navigateur. Il remplace la fonction par une référence légère : un identifiant d'action haché associé à une route POST générée. Appeler l'action depuis le client envoie une requête vers cette route, la vraie fonction s'exécute sur le serveur, et le résultat sérialisé est renvoyé en streaming à l'appelant. Cette conception entraîne trois conséquences à retenir, autant pour le code de production que pour les entretiens. D'abord, les arguments et les valeurs de retour doivent être sérialisables, car ils traversent le réseau sous forme de payloads encodés. Ensuite, les secrets restent sur le serveur, puisque le corps de la fonction n'est jamais inclus dans le bundle client. Enfin, les actions rattachées à un `
` fonctionnent même avant l'hydratation, ce qui explique pourquoi l'amélioration progressive est un argument clé. Le [guide officiel de Next.js sur la mise à jour des données](https://nextjs.org/docs/app/getting-started/updating-data) documente l'intégralité du modèle d'exécution. Chaque Server Action se trouve dans un fichier ou un bloc marqué par `"use server"`. Une mutation simple ressemble à ceci : ```typescript // app/posts/actions.ts "use server" import { revalidatePath } from "next/cache" import { redirect } from "next/navigation" import { PostService } from "@/lib/services/post-service" export async function createPost(formData: FormData) { // FormData values arrive as strings; cast explicitly const title = formData.get("title") as string const body = formData.get("body") as string // Run business logic through the service layer, never the ORM directly const post = await PostService.create({ title, body }) // Purge the cached list so the next request refetches it revalidatePath("/posts") // Send the user to the freshly created resource redirect(`/posts/${post.id}`) } ``` La fonction lit le `FormData` soumis, persiste les données via un service, invalide la liste mise en cache, puis effectue une redirection. Aucun JavaScript client n'est nécessaire pour tout cela. ## Brancher une Server Action à un formulaire sans JavaScript client Passer l'action à la prop `action` d'un formulaire constitue l'intégration la plus simple. Next.js sérialise la soumission dans un `FormData` et appelle la fonction sur le serveur. Comme ce mécanisme s'appuie sur la soumission de formulaire native, il fonctionne même avec JavaScript désactivé et s'enrichit sans accroc une fois la page hydratée. ```tsx // app/posts/new-post-form.tsx import { createPost } from "./actions" export default function NewPostForm() { return (