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:

  1. Captura mĆŗltiple: Acepta una o varias partes de la ruta.

    • Ejemplo: /products/shoes o /products/shoes/nike

  2. ParƔmetro como array: El valor capturado estarƔ disponible como un array.

    • Ejemplo: Si la URL es /products/shoes/nike, entonces categories serĆ” ['shoes', 'nike'].

  3. Ruta opcional: La ruta puede ser sin parƔmetros adicionales.

    • Ejemplo: /productsEn 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]:

  • 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?

  1. 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.

  2. 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.

  3. 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.

  1. 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
  2. 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.

  3. 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.

  4. Combinación con pÔginas:

    • Los layouts funcionan en conjunto con archivos page.js. Cada layout renderiza su contenido en un componente children, 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

  1. Reutilización: Reduce la duplicación de código al centralizar la estructura común.

  2. Escalabilidad: Facilita la organización en aplicaciones grandes con muchas secciones.

  3. 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

  1. 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.

  2. 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.

  3. 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.

  4. Cómo declararlos:

    • Son el comportamiento por defecto en la carpeta /app.

    • No necesitan la directiva "use client".


Client Components

  1. QuƩ son:

    • Se renderizan en el cliente y necesitan JavaScript para funcionar.

    • Permiten manejar estados e interactividad.

  2. CaracterĆ­sticas:

    • Pueden usar hooks de React como useState y useEffect.

    • Adecuados para componentes que dependen de eventos del usuario.

  3. 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.

  4. 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:

  1. No afectan la URL:

    • Los directorios con parĆ©ntesis no se reflejan en la ruta final.

  2. Organización del código:

    • Facilitan estructurar archivos y componentes de forma lógica, especialmente en aplicaciones grandes.

  3. 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:

  1. Organización modular:

    • Divide funcionalidades como Ć”reas administrativas, secciones pĆŗblicas, o dominios especĆ­ficos.

  2. 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.

  3. Facilita la reutilización:

    • Puedes agrupar componentes o layouts que comparten lógica o estilo.


Casos comunes de uso

  1. Áreas específicas de la aplicación:

    • Agrupar rutas de administrador, usuario, o clientes sin exponer esa estructura en las URLs.

  2. 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

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

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

  1. 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.

  2. 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.

  3. Estructura de Archivos: La carpeta app utiliza una estructura de archivos mƔs flexible y modular. Por ejemplo, puedes tener archivos layout.js y page.js en cada carpeta para definir layouts y pƔginas especƭficas.

  4. 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:

  1. 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.

  2. Mejor Seguridad: Los componentes del servidor no exponen lógica sensible al cliente, lo que puede mejorar la seguridad de la aplicación.

  3. 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.

  1. Mejor Rendimiento: Las pƔginas estƔticas se generan una vez y se sirven rƔpidamente desde un CDN.

  2. 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.

  3. 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:

  1. 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.

  2. 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.

  3. 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

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

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

  1. 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 objetos params que contienen los IDs.

  2. getStaticProps: Esta función se utiliza para obtener los datos específicos de un post de blog en función del ID proporcionado por getStaticPaths. Fetcha los datos del post desde una API o base de datos y devuelve los datos como props para la pÔgina.

  3. React Server Component: En este ejemplo, BlogPost es un componente que recibe el contenido del post como prop y lo renderiza. Aunque en este ejemplo BlogPost 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

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 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

En 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

  1. 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.

  2. 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?

  1. 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;
  2. 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>
      );
    }
  3. 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

  1. 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.

  2. Mantienen la seguridad:

    • El código de las Server Actions solo se ejecuta en el servidor. No se incluye en el bundle del cliente.

  3. Simplifican el desarrollo:

    • Menos pasos para interactuar con el servidor.

    • Mejor integración con formularios y lógica del lado del servidor.

  4. Mejor rendimiento:

    • Reducen la sobrecarga al evitar crear rutas adicionales o manejar respuestas HTTP manualmente.


Limitaciones

  1. Soporte en /app: Las Server Actions funcionan exclusivamente en la carpeta /app.

  2. Compatibilidad con estado del cliente: Las Server Actions no pueden interactuar directamente con librerĆ­as que gestionan estado del cliente (como Redux).

  3. 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