# Server Actions de Next.js 16 en 2026: mutaciones, revalidación y preguntas de entrevista > Cómo las Server Actions de Next.js 16 manejan mutaciones, revalidación, estado pendiente, UI optimista y seguridad, con las preguntas de entrevista que evalúan cada concepto. - Published: 2026-06-24 - Updated: 2026-07-06 - Author: SharpSkill - Tags: next.js, server-actions, react, mutations, revalidation, interview - Reading time: 11 min --- Las Server Actions de Next.js convierten una simple función asíncrona en un endpoint de mutación del lado del servidor que un formulario puede invocar directamente, sin ruta de API, sin `fetch` del cliente y sin serialización manual de JSON. En Next.js 16 son la forma predeterminada de escribir mutaciones de datos y aparecen en casi toda entrevista senior de React en 2026. Este análisis a fondo desglosa cómo se ejecutan, cómo la revalidación propaga datos frescos a la interfaz, cómo modelar los estados pendiente y de error, y las reglas de seguridad que hacen tropezar a la mayoría de los desarrolladores. > **Definición en una frase** > > Una Server Action es una función asíncrona marcada con `"use server"` que se ejecuta solo en el servidor y puede invocarse desde un componente de cliente o un formulario como si fuera local, mientras Next.js gestiona automáticamente la petición de red, la serialización de argumentos y la protección CSRF. ## Cómo se ejecutan las Server Actions internamente Una Server Action es una función exclusiva del servidor que se invoca por la red a través de un endpoint generado por el compilador. Cuando una función lleva la directiva `"use server"`, el compilador de Next.js nunca envía su cuerpo al navegador. En su lugar, reemplaza la función por una referencia ligera: un ID de acción con hash asociado a una ruta POST generada. Al invocar la acción desde el cliente se envía una petición a esa ruta, la función real se ejecuta en el servidor y el resultado serializado regresa en streaming a quien la llamó. Este diseño tiene tres consecuencias que conviene recordar tanto para el código de producción como para las entrevistas. Primero, los argumentos y los valores de retorno deben ser serializables, porque cruzan la red como cargas útiles codificadas. Segundo, los secretos permanecen en el servidor, ya que el cuerpo de la función nunca se empaqueta para el cliente. Tercero, las acciones asociadas a un `
` funcionan incluso antes de la hidratación, razón por la cual la mejora progresiva es uno de sus principales atractivos. La [guía oficial de Next.js sobre actualización de datos](https://nextjs.org/docs/app/getting-started/updating-data) documenta el modelo de ejecución completo. Toda Server Action reside en un archivo o bloque marcado con `"use server"`. Una mutación simple luce así: ```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 función lee el `FormData` enviado, persiste a través de un servicio, invalida el listado cacheado y redirige. No se requiere nada de JavaScript en el cliente para lograrlo. ## Conectar una Server Action a un formulario sin JavaScript en el cliente Pasar la acción a la prop `action` de un formulario es la integración más simple. Next.js serializa el envío en `FormData` e invoca la función en el servidor. Como esto usa el mecanismo nativo de envío de formularios, funciona con JavaScript deshabilitado y mejora sin interrupciones una vez que la página se hidrata. ```tsx // app/posts/new-post-form.tsx import { createPost } from "./actions" export default function NewPostForm() { return (