# Server Actions di Next.js 16 nel 2026: mutazioni, revalidation e domande da colloquio > Come le Server Actions di Next.js 16 gestiscono mutazioni, revalidation, stato di attesa, UI ottimistica e sicurezza, con le domande da colloquio che verificano ogni concetto. - Published: 2026-06-24 - Updated: 2026-07-06 - Author: SharpSkill - Tags: next.js, server-actions, react, mutations, revalidation, interview - Reading time: 11 min --- Le Server Actions di Next.js trasformano una semplice funzione async in un endpoint di mutazione lato server che un form può chiamare direttamente, senza route API, senza `fetch` lato client e senza serializzazione JSON manuale. In Next.js 16 sono il modo predefinito per scrivere le mutazioni dei dati e compaiono in quasi ogni colloquio React senior del 2026. Questa analisi approfondita spiega come vengono eseguite, come la revalidation propaga dati aggiornati all'interfaccia, come modellare gli stati di attesa ed errore e le regole di sicurezza che mettono in difficoltà la maggior parte degli sviluppatori. > **Definizione in una frase** > > Una Server Action è una funzione async contrassegnata con `"use server"` che viene eseguita solo sul server e può essere chiamata da un componente client o da un form come se fosse locale, mentre Next.js gestisce automaticamente la richiesta di rete, la serializzazione degli argomenti e la protezione CSRF. ## Come vengono eseguite le Server Actions dietro le quinte Una Server Action è una funzione eseguita solo sul server e invocata attraverso la rete tramite un endpoint generato dal compilatore. Quando una funzione riporta la direttiva `"use server"`, il compilatore di Next.js non invia mai il suo corpo al browser. Al suo posto sostituisce la funzione con un riferimento leggero: un ID di azione con hash mappato su una route POST generata. Chiamare l'azione dal client invia una richiesta a quella route, la funzione reale viene eseguita sul server e il risultato serializzato viene trasmesso in streaming al chiamante. Questo design ha tre conseguenze da ricordare sia per il codice di produzione sia per i colloqui. Primo, gli argomenti e i valori di ritorno devono essere serializzabili, perché attraversano la rete come payload codificati. Secondo, i segreti restano sul server, dato che il corpo della funzione non viene mai incluso nel bundle destinato al client. Terzo, le azioni collegate a un `
` funzionano anche prima dell'hydration, motivo per cui il progressive enhancement è un punto di forza centrale. La [guida ufficiale di Next.js sull'aggiornamento dei dati](https://nextjs.org/docs/app/getting-started/updating-data) documenta l'intero modello di esecuzione. Ogni Server Action risiede in un file o in un blocco contrassegnato con `"use server"`. Una singola mutazione ha questo aspetto: ```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 funzione legge i `FormData` inviati, li rende persistenti tramite un service, invalida l'elenco memorizzato in cache e reindirizza. Nessun JavaScript lato client è necessario per tutto questo. ## Collegare una Server Action a un form senza JavaScript lato client Passare l'azione alla prop `action` di un form è l'integrazione più semplice. Next.js serializza l'invio in `FormData` e chiama la funzione sul server. Poiché sfrutta il meccanismo nativo di invio dei form, funziona anche con JavaScript disabilitato e si aggiorna senza interruzioni una volta che la pagina completa l'hydration. ```tsx // app/posts/new-post-form.tsx import { createPost } from "./actions" export default function NewPostForm() { return (