Fundamentos
Rutas
En Next.js, las rutas estÔticas y dinÔmicas son formas de definir cómo se accede a diferentes pÔginas en tu aplicación. Aquà tienes una explicación breve y ejemplos de cada tipo:
Rutas EstƔticas
Las rutas estƔticas son aquellas que tienen una URL fija y predefinida. Estas rutas se definen mediante archivos en la carpeta pages
de tu proyecto Next.js.
Ejemplo:
Archivo:
pages/about.js
URL:
/about
// pages/about.js
export default function About() {
return <div>About Page</div>;
}
Rutas DinƔmicas
Las rutas dinÔmicas permiten crear pÔginas cuyas URLs pueden variar según parÔmetros. Estas rutas se definen utilizando corchetes []
en el nombre del archivo.
Ejemplo:
Archivo:
pages/posts/[id].js
URL:
/posts/1
,/posts/2
, etc.
// pages/posts/[id].js
import { useRouter } from 'next/router';
export default function Post() {
const router = useRouter();
const { id } = router.query;
return <div>Post ID: {id}</div>;
}
Rutas DinƔmicas Anidadas
También puedes tener rutas dinÔmicas anidadas, donde múltiples segmentos de la URL pueden ser dinÔmicos.
Ejemplo:
Archivo:
pages/posts/[category]/[id].js
URL:
/posts/tech/1
,/posts/sports/2
, etc.
// pages/posts/[category]/[id].js
import { useRouter } from 'next/router';
export default function Post() {
const router = useRouter();
const { category, id } = router.query;
return <div>Category: {category}, Post ID: {id}</div>;
}
Nota: TambiƩn se puede obtener el nombre del segmento de ruta dinamica via props
En Next.js, los corchetes con tres puntos ([...categories]
) en una ruta dinÔmica definen un segmento de captura o una ruta dinÔmica opcional que puede abarcar múltiples partes de la URL.
CaracterĆsticas:
Captura mĆŗltiple: Acepta una o varias partes de la ruta.
Ejemplo:
/products/shoes
o/products/shoes/nike
ParƔmetro como array: El valor capturado estarƔ disponible como un array.
Ejemplo: Si la URL es
/products/shoes/nike
, entoncescategories
serĆ”['shoes', 'nike']
.
Ruta opcional: La ruta puede ser sin parƔmetros adicionales.
Ejemplo:
/products
En este caso serĆ” resuelta si hay un page.tsx en la pruta products de lo contrario si solo hay el page.tsx en /products/[...categories]/page.tsx , no serĆ” resuelta la ruta/products
para lograr eso se necesitan los dobles corchetes.
Ejemplo:
/app/products/[...categories]/page.js
/products/shoes
ācategories = ['shoes']
/products/shoes/nike
ācategories = ['shoes', 'nike']
/products
ācategories = undefined
(o un array vacĆo dependiendo de la configuración).
Se utiliza para manejar rutas flexibles o jerƔrquicas con facilidad.
TambiƩn se pueden usar los dobles corchetes. En Next.js, [[...categories]]
define una ruta dinÔmica opcional con captura múltiple, lo que significa que el segmento puede estar presente o no.
Diferencias con [...categories]
:
[...categories]
:Opcionalidad: Si no hay segmentos en la URL, la ruta sigue siendo vƔlida.
Si la ruta es
/products
,categories
serƔundefined
(en lugar de requerir al menos un segmento).
Ejemplo:
/app/products/[[...categories]]/page.js
/products
ācategories = undefined
/products/shoes
ācategories = ['shoes']
/products/shoes/nike
ācategories = ['shoes', 'nike']
Esto se usa para manejar rutas donde los segmentos adicionales son opcionales.
Layouts
En Next.js 14, los layouts son una caracterĆstica fundamental que permite estructurar la interfaz de manera mĆ”s modular y reutilizable. En este contexto, los layouts definen la estructura o el "esqueleto" comĆŗn de la pĆ”gina, como encabezados, barras laterales o pies de pĆ”gina, y se integran perfectamente con el sistema de enrutamiento de Next.js.
¿Qué son los layouts en Next.js 14?
Layouts anidados: Next.js 14 permite que los layouts sean anidados y especĆficos para ciertas partes de la aplicación. Por ejemplo, puedes tener un layout general para toda la aplicación y otro layout especĆfico para un Ć”rea administrativa.
Persistencia entre rutas: Los layouts permanecen montados mientras se navega entre rutas que comparten el mismo layout. Esto mejora el rendimiento y evita la pérdida de estado en componentes como menús abiertos o pestañas seleccionadas.
Server Components: Con el soporte para Server Components, los layouts pueden usarse para renderizar contenido en el servidor y enviar al cliente Ćŗnicamente lo necesario, optimizando el rendimiento.
Cómo afectan los layouts a las rutas en Next.js 14
En Next.js 14, los layouts se definen en el sistema de directorios bajo la carpeta /app
. El lugar donde colocas el archivo layout.js
afecta directamente a las rutas que lo utilizan.
Layouts globales:
Si colocas un archivo
layout.js
directamente dentro de la carpeta/app
, este se aplicarÔ a todas las rutas de la aplicación.Por ejemplo:
/app/layout.js
Se aplica a:
/home /about /dashboard
Layouts especĆficos por secciones:
Si colocas un archivo
layout.js
dentro de una subcarpeta, este solo se aplicarƔ a las rutas que estƩn bajo esa carpeta.Por ejemplo:
/app/dashboard/layout.js
Se aplica a:
/dashboard /dashboard/settings /dashboard/profile
Pero no se aplica a rutas como
/about
o/home
.
Layouts anidados:
Puedes combinar layouts globales con layouts especĆficos.
Por ejemplo:
/app/layout.js -> Layout general /app/dashboard/layout.js -> Layout para dashboard
AquĆ, una ruta como
/dashboard/settings
usarĆa tanto el layout global como el layout especĆfico del dashboard.
Combinación con pÔginas:
Los layouts funcionan en conjunto con archivos
page.js
. Cada layout renderiza su contenido en un componentechildren
, que incluye la pƔgina correspondiente.
Ejemplo prƔctico
Estructura de carpetas:
/app
layout.js // Layout global
/dashboard
layout.js // Layout para el dashboard
page.js // PƔgina principal del dashboard
/settings
page.js // PÔgina de configuración dentro del dashboard
Cómo funciona:
La pƔgina
/dashboard/settings
:UsarĆ” primero
layout.js
de/app
como layout global.Luego, aplicarĆ”
layout.js
de/dashboard
como layout especĆfico.
Ventajas de los layouts en Next.js 14
Reutilización: Reduce la duplicación de código al centralizar la estructura común.
Escalabilidad: Facilita la organización en aplicaciones grandes con muchas secciones.
Optimización de rendimiento: Los layouts montados no se descargan innecesariamente al cambiar de ruta, mejorando la experiencia del usuario.
Con estas capacidades, los layouts en Next.js 14 son una herramienta poderosa para construir aplicaciones estructuradas y eficientes.
Componentes
En Next.js 14, los Server Components (componentes del servidor) y los Client Components (componentes del cliente) tienen roles y comportamientos diferentes, optimizados para sus respectivos contextos.
Server Components
QuƩ son:
Se renderizan en el servidor y envĆan HTML estĆ”tico al cliente.
No incluyen JavaScript en el cliente, por lo que son mƔs livianos y rƔpidos.
CaracterĆsticas:
Acceso directo a datos del servidor (bases de datos, APIs, etc.) sin exponer credenciales al cliente.
Ideal para contenido que no necesita interactividad.
Mejor rendimiento inicial y SEO.
CuƔndo usarlos:
Para renderizar datos estÔticos o dinÔmicos que no requieren interacción del usuario.
Ejemplo: encabezados, pies de pƔgina, o listas estƔticas de productos.
Cómo declararlos:
Son el comportamiento por defecto en la carpeta
/app
.No necesitan la directiva
"use client"
.
Client Components
QuƩ son:
Se renderizan en el cliente y necesitan JavaScript para funcionar.
Permiten manejar estados e interactividad.
CaracterĆsticas:
Pueden usar hooks de React como
useState
yuseEffect
.Adecuados para componentes que dependen de eventos del usuario.
CuƔndo usarlos:
Para elementos interactivos como formularios, botones o sliders.
Ejemplo: un carrito de compras, un botón "me gusta", o un modal dinÔmico.
Cómo declararlos:
Necesitan la directiva
"use client"
al inicio del archivo.
Comparación: CuÔndo usar cada uno
Aspecto
Server Components
Client Components
Renderización
En el servidor, entrega HTML estƔtico.
En el cliente, requiere JavaScript.
Interactividad
No interactivo.
Interactivo (usa eventos, hooks).
Rendimiento
MƔs rƔpido para carga inicial.
MƔs lento debido a JavaScript.
Estado/Side Effects
No maneja estado ni efectos secundarios.
Maneja estado y efectos secundarios.
SEO
Excelente para SEO.
Menos óptimo por depender de JS.
Ejemplo mixto
// Server Component (por defecto en /app)
export default function ProductList({ products }) {
return (
<ul>
{products.map((product) => (
<li key={product.id}>{product.name}</li>
))}
</ul>
);
}
// Client Component
"use client";
import { useState } from "react";
export default function LikeButton() {
const [liked, setLiked] = useState(false);
return (
<button onClick={() => setLiked(!liked)}>
{liked ? "Unlike" : "Like"}
</button>
);
}
AquĆ, ProductList
usa datos estƔticos, mientras que LikeButton
maneja interactividad en el cliente. Combinar ambos tipos mejora la eficiencia y la experiencia del usuario.
Una buena practica es agregar use client
solo a los elementos que lo requieran, recordar que puden combinarse como el ejemplo anterior y si el componente client es cliente todos sus hijos lo serƔn.
Route Grouping
En Next.js, el grouping (agrupación) es una funcionalidad que permite organizar rutas y estructuras de carpetas sin que estas afecten la URL final de la aplicación. Esto se logra mediante el uso de directorios de grupo de rutas, que se indican colocando el nombre de la carpeta entre paréntesis.
¿Qué es un directorio de grupo de rutas?
Es un directorio que se utiliza únicamente para organizar el código y que no forma parte de la URL. Los directorios de grupo estÔn delimitados por paréntesis ( )
.
CaracterĆsticas clave:
No afectan la URL:
Los directorios con parƩntesis no se reflejan en la ruta final.
Organización del código:
Facilitan estructurar archivos y componentes de forma lógica, especialmente en aplicaciones grandes.
Compatibilidad:
Se pueden combinar con otras caracterĆsticas como layouts, pĆ”ginas y componentes.
Ejemplo: Cómo funciona
Estructura de carpetas:
/app
/(admin)
dashboard
page.js
/shop
product
page.js
URLs resultantes:
/dashboard
ā Renderiza/(admin)/dashboard/page.js
./shop/product
ā Renderiza/shop/product/page.js
.
AquĆ, el directorio (admin)
es solo organizativo y no aparece en la URL.
Ventajas del grouping:
Organización modular:
Divide funcionalidades como Ć”reas administrativas, secciones pĆŗblicas, o dominios especĆficos.
Estructuración mÔs clara:
Hace que el código sea mÔs mantenible y fÔcil de navegar sin afectar la experiencia del usuario.
Facilita la reutilización:
Puedes agrupar componentes o layouts que comparten lógica o estilo.
Casos comunes de uso
Ćreas especĆficas de la aplicación:
Agrupar rutas de administrador, usuario, o clientes sin exponer esa estructura en las URLs.
Reutilización de layouts o middleware:
Aplicar un layout especĆfico a todas las rutas dentro de un grupo sin afectar el diseƱo general de la aplicación.
Esta técnica es muy útil para mantener un balance entre estructura del proyecto y simplicidad en las URLs.
Pages vs App
En Next.js, la introducción de la carpeta app
representa un cambio significativo en la forma de estructurar y manejar las aplicaciones. Tradicionalmente, Next.js utilizaba la carpeta pages
para definir las rutas y componentes de la aplicación. Sin embargo, con la introducción de la carpeta app
, Next.js ofrece una nueva forma de estructurar aplicaciones que proporciona mĆ”s flexibilidad y caracterĆsticas avanzadas.
Carpeta pages
pages
La carpeta pages
es la forma tradicional de definir rutas y componentes en Next.js. Cada archivo en la carpeta pages
se convierte automÔticamente en una ruta accesible en la aplicación.
Ejemplo de Estructura con pages
:
/pages
index.js
about.js
/blog
index.js
[id].js
Rutas Generadas:
/
/about
/blog
/blog/[id]
Carpeta app
app
La carpeta app
es una nueva forma de estructurar aplicaciones en Next.js que ofrece mĆ”s flexibilidad y caracterĆsticas avanzadas, como el uso de React Server Components, layouts anidados, y mĆ”s.
Ejemplo de Estructura con app
:
/app
layout.js
page.js
/about
page.js
/blog
page.js
/[id]
page.js
Rutas Generadas:
/
/about
/blog
/blog/[id]
Diferencias Clave entre pages
y app
pages
y app
React Server Components: La carpeta
app
permite el uso de React Server Components, lo que puede mejorar el rendimiento y la experiencia del usuario al permitir que partes de la aplicación se rendericen en el servidor.Layouts Anidados: La carpeta
app
permite definir layouts anidados de manera mĆ”s intuitiva. Puedes tener un layout principal y layouts especĆficos para diferentes secciones de la aplicación.Estructura de Archivos: La carpeta
app
utiliza una estructura de archivos mƔs flexible y modular. Por ejemplo, puedes tener archivoslayout.js
ypage.js
en cada carpeta para definir layouts y pĆ”ginas especĆficas.Configuración y Personalización: La carpeta
app
ofrece mÔs opciones de configuración y personalización, lo que permite una mayor flexibilidad en la forma de estructurar y manejar la aplicación.
Conclusión
La introducción de la carpeta app
en Next.js ofrece una nueva forma de estructurar aplicaciones que proporciona mĆ”s flexibilidad y caracterĆsticas avanzadas. Mientras que la carpeta pages
sigue siendo una opción vÔlida y compatible, la carpeta app
permite aprovechar nuevas tecnologĆas y mejoras en el rendimiento y la experiencia del usuario. La elección entre usar pages
o app
dependerĆ” de las necesidades especĆficas de tu proyecto y de las caracterĆsticas que desees utilizar.
React Server Components (RSC) y Static Generation (SG)
React Server Components (RSC) y Static Generation (SG) son dos conceptos diferentes en el ecosistema de Next.js y React, y no se sustituyen mutuamente. En cambio, pueden complementarse para ofrecer una experiencia de desarrollo y rendimiento mejorada. Aquà te explico cada uno y cómo pueden trabajar juntos:
React Server Components (RSC)
React Server Components es una nueva caracterĆstica de React que permite que los componentes se ejecuten en el servidor en lugar de en el cliente. Esto tiene varias ventajas:
Menor TamaƱo del Bundle: Al ejecutar componentes en el servidor, se reduce el tamaƱo del bundle de JavaScript que se envĆa al cliente, lo que puede mejorar el tiempo de carga inicial.
Mejor Seguridad: Los componentes del servidor no exponen lógica sensible al cliente, lo que puede mejorar la seguridad de la aplicación.
Mejor Rendimiento: Al ejecutar componentes en el servidor, se puede aprovechar la potencia de procesamiento del servidor y reducir la carga en el cliente.
Static Generation (SG)
Static Generation es una caracterĆstica de Next.js que permite generar pĆ”ginas HTML estĆ”ticas en el momento de la compilación. Estas pĆ”ginas estĆ”ticas pueden ser servidas directamente desde un CDN, lo que puede mejorar significativamente el rendimiento y la escalabilidad de la aplicación.
Mejor Rendimiento: Las pƔginas estƔticas se generan una vez y se sirven rƔpidamente desde un CDN.
Escalabilidad: Las pÔginas estÔticas no requieren procesamiento en el servidor en cada solicitud, lo que puede manejar un mayor número de usuarios simultÔneos.
SEO: Las pÔginas estÔticas son fÔciles de rastrear para los motores de búsqueda, lo que puede mejorar el SEO.
Cómo Pueden Complementarse
React Server Components y Static Generation pueden complementarse para ofrecer una experiencia de desarrollo y rendimiento mejorada. AquĆ hay algunas formas en que pueden trabajar juntos:
Generación de PÔginas EstÔticas con RSC: Puedes usar React Server Components para generar pÔginas estÔticas en el momento de la compilación. Esto permite aprovechar las ventajas de RSC (menor tamaño del bundle, mejor seguridad) mientras aún se beneficia del rendimiento y la escalabilidad de las pÔginas estÔticas.
Hibridación: Puedes usar una combinación de React Server Components y Static Generation en diferentes partes de tu aplicación. Por ejemplo, puedes usar RSC para componentes que requieren lógica del servidor y SG para pÔginas que pueden ser completamente estÔticas.
Incremental Static Regeneration (ISR): Next.js también ofrece Incremental Static Regeneration, que permite actualizar pÔginas estÔticas después de la compilación. Esto puede complementar RSC al permitir que las pÔginas estÔticas se actualicen con nuevos datos sin necesidad de una recompilación completa.
Ejemplo de Uso Combinado
// pages/index.js
import { getStaticProps } from 'next';
import ServerComponent from '../components/ServerComponent';
const HomePage = ({ data }) => {
return (
<div>
<h1>Home Page</h1>
<ServerComponent data={data} />
</div>
);
};
export const getStaticProps = async () => {
const data = await fetchData(); // Fetch data from an API or database
return {
props: {
data,
},
};
};
export default HomePage;
En este ejemplo, getStaticProps
se utiliza para generar una pÔgina estÔtica en el momento de la compilación, mientras que ServerComponent
puede ser un React Server Component que se ejecuta en el servidor.
Un ejemplo mas completo
Claro, aquà tienes un ejemplo de cómo usar getStaticPaths
, getStaticProps
y React Server Components en una pƔgina de blog dinƔmica en Next.js. Este ejemplo asume que tienes una API o una base de datos que proporciona los datos del blog.
Estructura de Archivos
/pages
/blog
/[id]
page.tsx
/components
BlogPost.tsx
pages/blog/[id]/page.tsx
pages/blog/[id]/page.tsx
import { GetStaticPaths, GetStaticProps } from 'next';
import BlogPost from '../../../components/BlogPost';
interface BlogPostProps {
post: {
id: string;
title: string;
content: string;
};
}
const BlogPostPage: React.FC<BlogPostProps> = ({ post }) => {
return (
<div>
<h1>{post.title}</h1>
<BlogPost content={post.content} />
</div>
);
};
export const getStaticPaths: GetStaticPaths = async () => {
// Fetch all blog post IDs from an API or database
const response = await fetch('https://api.example.com/blog-posts');
const posts = await response.json();
const paths = posts.map((post: { id: string }) => ({
params: { id: post.id },
}));
return { paths, fallback: false };
};
export const getStaticProps: GetStaticProps = async ({ params }) => {
const { id } = params!;
// Fetch the blog post data from an API or database
const response = await fetch(`https://api.example.com/blog-posts/${id}`);
const post = await response.json();
return {
props: {
post,
},
};
};
export default BlogPostPage;
components/BlogPost.tsx
components/BlogPost.tsx
import React from 'react';
interface BlogPostProps {
content: string;
}
const BlogPost: React.FC<BlogPostProps> = ({ content }) => {
return (
<div>
<p>{content}</p>
</div>
);
};
export default BlogPost;
Explicación
getStaticPaths
: Esta función se utiliza para generar todas las rutas posibles para las pÔginas de blog. Fetcha todos los IDs de los posts del blog desde una API o base de datos y devuelve un array de objetosparams
que contienen los IDs.getStaticProps
: Esta función se utiliza para obtener los datos especĆficos de un post de blog en función del ID proporcionado porgetStaticPaths
. Fetcha los datos del post desde una API o base de datos y devuelve los datos como props para la pƔgina.React Server Component: En este ejemplo,
BlogPost
es un componente que recibe el contenido del post como prop y lo renderiza. Aunque en este ejemploBlogPost
es un componente de cliente, podrĆas convertirlo en un React Server Component si necesitas ejecutar lógica en el servidor.
Conclusión
Este ejemplo muestra cómo combinar getStaticPaths
, getStaticProps
y React Server Components para crear una pƔgina de blog dinƔmica en Next.js. Al usar getStaticPaths
y getStaticProps
, puedes generar pÔginas estÔticas en el momento de la compilación, lo que mejora el rendimiento y la escalabilidad de tu aplicación. Los React Server Components pueden ser utilizados para ejecutar lógica en el servidor y reducir el tamaño del bundle de JavaScript enviado al cliente.
getServerSideProps
getServerSideProps
En las nuevas versiones de Next.js, especialmente con la introducción de la carpeta /app
y React Server Components, el uso de getServerSideProps
ha cambiado. Aunque getServerSideProps
sigue siendo compatible y Ćŗtil en la carpeta /pages
, su relevancia y uso pueden variar dependiendo de la estructura de tu proyecto y las necesidades especĆficas de tu aplicación.
getServerSideProps
en /pages
getServerSideProps
en /pages
getServerSideProps
sigue siendo una opción vÔlida y útil en la carpeta /pages
. Se utiliza para obtener datos en el servidor en cada solicitud, lo que es útil para pÔginas que necesitan datos frescos y no pueden ser generadas estÔticamente.
Ejemplo en /pages
:
// pages/blog/[id].tsx
import { GetServerSideProps } from 'next';
import BlogPost from '../../components/BlogPost';
interface BlogPostProps {
post: {
id: string;
title: string;
content: string;
};
}
const BlogPostPage: React.FC<BlogPostProps> = ({ post }) => {
return (
<div>
<h1>{post.title}</h1>
<BlogPost content={post.content} />
</div>
);
};
export const getServerSideProps: GetServerSideProps = async ({ params }) => {
const { id } = params!;
// Fetch the blog post data from an API or database
const response = await fetch(`https://api.example.com/blog-posts/${id}`);
const post = await response.json();
return {
props: {
post,
},
};
};
export default BlogPostPage;
/app
y React Server Components
/app
y React Server ComponentsEn la carpeta /app
, Next.js introduce una nueva forma de manejar el renderizado del lado del servidor utilizando React Server Components. Esto permite una mayor flexibilidad y mejores capacidades de renderizado del lado del servidor sin necesidad de getServerSideProps
.
Ejemplo en /app
:
// app/blog/[id]/page.tsx
import BlogPost from '../../../components/BlogPost';
interface BlogPostProps {
params: {
id: string;
};
}
const BlogPostPage: React.FC<BlogPostProps> = async ({ params }) => {
const { id } = params;
// Fetch the blog post data from an API or database
const response = await fetch(`https://api.example.com/blog-posts/${id}`);
const post = await response.json();
return (
<div>
<h1>{post.title}</h1>
<BlogPost content={post.content} />
</div>
);
};
export default BlogPostPage;
Comparación y Uso
getServerSideProps
en/pages
:Ventajas: Familiaridad y compatibilidad con versiones anteriores.
Desventajas: Menos flexible y puede ser mĆ”s difĆcil de manejar en aplicaciones grandes.
React Server Components en
/app
:Ventajas: Mayor flexibilidad, mejor rendimiento y capacidades avanzadas de renderizado del lado del servidor.
Desventajas: Nuevo paradigma que puede requerir un tiempo de aprendizaje.
Conclusión
getServerSideProps
sigue siendo Ćŗtil y relevante en la carpeta /pages
, especialmente para proyectos que ya estÔn utilizando esta estructura o que necesitan una solución rÔpida y compatible. Sin embargo, para nuevos proyectos o para aprovechar las nuevas capacidades de Next.js, la carpeta /app
y React Server Components ofrecen una solución mÔs moderna y flexible.
La elección entre usar getServerSideProps
en /pages
o React Server Components en /app
dependerĆ” de las necesidades especĆficas de tu proyecto y de tu familiaridad con las nuevas caracterĆsticas de Next.js.
Server Actions
En Next.js 13+ (incluyendo la versión 14), las Server Actions son una caracterĆstica que permite manejar lógica del lado del servidor directamente desde componentes React. Esto simplifica la interacción entre el cliente y el servidor al eliminar la necesidad de crear rutas API separadas para realizar acciones del lado del servidor.
¿Qué son las Server Actions?
Las Server Actions son funciones que se ejecutan exclusivamente en el servidor y se pueden invocar directamente desde componentes React. EstƔn diseƱadas para manejar tareas como:
Enviar formularios.
Interactuar con bases de datos.
Ejecutar lógica de negocio en el servidor.
Con Server Actions, puedes escribir código del servidor en un entorno controlado sin preocuparte por exponerlo al cliente.
¿Cómo funcionan?
Declaración de una Server Action:
Se utiliza la función especial
server
proporcionada por Next.js para definir una Server Action.Deben ser declaradas como funciones asĆncronas.
Ejemplo de una Server Action:
"use server"; async function saveData(formData) { // AquĆ puedes interactuar con la base de datos o APIs del servidor. await db.save(formData); console.log("Datos guardados:", formData); } export default saveData;
Uso en Componentes React:
Las Server Actions se pueden invocar directamente desde componentes React.
Por ejemplo, se usan comĆŗnmente con formularios.
Ejemplo con un Formulario:
import saveData from "./actions/saveData"; export default function MyComponent() { async function handleSubmit(formData) { await saveData(formData); } return ( <form action={handleSubmit}> <input type="text" name="name" placeholder="Name" required /> <button type="submit">Save</button> </form> ); }
Flujo de Ejecución:
Cuando el usuario envĆa el formulario, el navegador realiza una solicitud POST.
Next.js procesa la acción en el servidor usando la función definida en
saveData
.
Ventajas de las Server Actions
Eliminan la necesidad de rutas API personalizadas:
Antes, para guardar datos, necesitabas una ruta en
/api
.Ahora, puedes manejar esta lógica directamente desde componentes React.
Mantienen la seguridad:
El código de las Server Actions solo se ejecuta en el servidor. No se incluye en el bundle del cliente.
Simplifican el desarrollo:
Menos pasos para interactuar con el servidor.
Mejor integración con formularios y lógica del lado del servidor.
Mejor rendimiento:
Reducen la sobrecarga al evitar crear rutas adicionales o manejar respuestas HTTP manualmente.
Limitaciones
Soporte en
/app
: Las Server Actions funcionan exclusivamente en la carpeta/app
.Compatibilidad con estado del cliente: Las Server Actions no pueden interactuar directamente con librerĆas que gestionan estado del cliente (como Redux).
No se puede usar con
useEffect
: No estƔn diseƱadas para ser invocadas desde efectos React.
Casos de Uso ComĆŗn
Guardar datos en un formulario.
Realizar operaciones CRUD directamente en el servidor.
Validar entradas del usuario antes de almacenarlas.
Last updated