<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Emanuel Peire</title>
    <description>The latest articles on Forem by Emanuel Peire (@emapeire).</description>
    <link>https://forem.com/emapeire</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F679621%2F4d5d9436-ef22-4e0c-b03f-de9cd10e562a.jpeg</url>
      <title>Forem: Emanuel Peire</title>
      <link>https://forem.com/emapeire</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/emapeire"/>
    <language>en</language>
    <item>
      <title>✨ Los 7 Principios de las Aplicaciones Web Enriquecidas</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 21:29:49 +0000</pubDate>
      <link>https://forem.com/emapeire/los-7-principios-de-las-aplicaciones-web-enriquecidas-5d7</link>
      <guid>https://forem.com/emapeire/los-7-principios-de-las-aplicaciones-web-enriquecidas-5d7</guid>
      <description>&lt;h2&gt;
  
  
  Introducción:
&lt;/h2&gt;

&lt;p&gt;En el dinámico mundo del desarrollo web, los principios que guían nuestras prácticas evolucionan para mantenerse al ritmo de las nuevas tecnologías y expectativas de los usuarios. Guillermo Rauch, en 2014, delineó siete principios esenciales para las aplicaciones web enriquecidas. A medida que nos adentramos en la era digital de 2024, revisamos estos principios fundamentales, explorando cómo han evolucionado y cómo continúan formando la columna vertebral de las estrategias de desarrollo web modernas, asegurando una experiencia de usuario excepcional y una operatividad eficiente en el vasto ecosistema digital.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Páginas Pre-renderizadas: Evolución hacia un Renderizado Óptimo
&lt;/h2&gt;

&lt;p&gt;En 2014, Guillermo Rauch subrayaba la importancia de las páginas pre-renderizadas para las aplicaciones web enriquecidas. Estas páginas, generadas antes de que el usuario acceda a ellas, aseguraban una carga rápida y una experiencia de usuario (UX) fluida. Sin embargo, con el paso del tiempo, el ecosistema web ha evolucionado, y ahora contamos con tecnologías más avanzadas que van más allá del pre-renderizado tradicional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evolución del Renderizado Web:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renderizado del Lado del Servidor (SSR): El SSR ha ganado prominencia, permitiendo que las páginas se rendericen en el servidor antes de ser enviadas al navegador. Esto no solo mejora la velocidad de carga, sino que también beneficia el SEO, ya que los motores de búsqueda pueden indexar el contenido más fácilmente.&lt;/li&gt;
&lt;li&gt;Renderizado Estático del Sitio (SSG): El SSG va un paso más allá, generando todas las páginas en tiempo de construcción, lo que resulta en tiempos de carga extremadamente rápidos y una mejor UX.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frameworks Modernos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js: Este framework ha liderado la adopción de SSR y SSG, proporcionando herramientas fáciles de usar para implementar estas técnicas.&lt;/li&gt;
&lt;li&gt;Otros ejemplos de frameworks web son: Gatsby, Nuxt, Remix, Svelt kit, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Importancia Renovada del Pre-renderizado:&lt;/strong&gt;&lt;br&gt;
El pre-renderizado sigue siendo relevante, pero ahora en conjunción con SSR y SSG, ofreciendo una experiencia de usuario mejorada y una optimización del rendimiento superior. Estas técnicas modernas de renderizado permiten a las aplicaciones web enriquecidas mantenerse ágiles y eficientes, ajustándose a las expectativas de los usuarios de la era digital actual.&lt;/p&gt;

&lt;p&gt;Esta evolución destaca cómo los principios esenciales pueden adaptarse y evolucionar en respuesta a las innovaciones tecnológicas, manteniendo su relevancia y guiando a los desarrolladores hacia mejores prácticas en el desarrollo web.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Actuar Inmediatamente ante la Entrada del Usuario: La Esencia de las Microinteracciones
&lt;/h2&gt;

&lt;p&gt;La interactividad es una característica distintiva de las aplicaciones web enriquecidas. La capacidad de una aplicación para responder de manera instantánea a la entrada del usuario no solo mejora la UX, sino que también forma la base para interacciones dinámicas. Guillermo Rauch, en su articulación original del principio, subrayaba la importancia de actuar inmediatamente ante la entrada del usuario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microinteracciones: Un Paso Adelante&lt;/strong&gt;&lt;br&gt;
Las microinteracciones han emergido como una evolución natural de este principio. Son pequeñas, a menudo sutiles, respuestas o animaciones que ocurren en respuesta a la entrada del usuario. Ejemplos comunes incluyen un botón que cambia de color cuando se pasa el ratón sobre él, o una animación suave que indica que se ha enviado un formulario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frameworks y Bibliotecas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React y Vue.js: Estos frameworks modernos facilitan la creación de UIs reactivas que pueden responder instantáneamente a la entrada del usuario.&lt;/li&gt;
&lt;li&gt;Bibliotecas de Animación: Bibliotecas como GreenSock Animation Platform (GSAP) y Anime.js permiten a los desarrolladores crear microinteracciones ricas y atractivas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hacia una UX Intuitiva y Engaging:&lt;/strong&gt;&lt;br&gt;
Las microinteracciones contribuyen a una UX más engaging e intuitiva. Proporcionan retroalimentación visual inmediata, lo que ayuda a los usuarios a entender las acciones que han realizado y el estado actual del sistema.&lt;/p&gt;

&lt;p&gt;La evolución de este principio refleja un cambio hacia una UX más rica y una interactividad más profunda, subrayando la importancia de las respuestas inmediatas y las microinteracciones en la creación de aplicaciones web modernas y enriquecidas.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reaccionar a los Cambios de Datos: La Dinámica del Flujo de Datos
&lt;/h2&gt;

&lt;p&gt;El tercer principio articulado por Guillermo Rauch, “Reaccionar a los Cambios de Datos”, subraya la importancia de una actualización eficiente y reactiva de la interfaz de usuario (UI) en respuesta a los cambios en los datos. Esta reactividad no solo mejora la UX, sino que también optimiza la gestión de datos en aplicaciones web enriquecidas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frameworks Reactivos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React: Como su nombre indica, React permite una reactividad eficiente, ayudando a los desarrolladores a construir interfaces de usuario dinámicas que responden a los cambios en los datos en tiempo real.&lt;/li&gt;
&lt;li&gt;Vue.js: Similar a React, Vue también facilita la construcción de UIs reactivas, proporcionando una arquitectura flexible y potente para manejar el flujo de datos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gestión del Estado:&lt;/strong&gt;&lt;br&gt;
La gestión del estado es crucial para mantener sincronizadas las UIs con los datos. Bibliotecas como Redux y Vuex proporcionan soluciones robustas para manejar el estado de la aplicación, permitiendo una reactividad eficaz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comunicación en Tiempo Real:&lt;/strong&gt;&lt;br&gt;
Las tecnologías como WebSocket y las APIs GraphQL permiten una comunicación en tiempo real entre el cliente y el servidor, facilitando la actualización inmediata de la UI ante cambios en los datos.&lt;/p&gt;

&lt;p&gt;Este principio ha ganado más relevancia con el tiempo, ya que la reactividad se ha convertido en una expectativa estándar en el desarrollo web moderno, esencial para proporcionar una UX dinámica y atractiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Controlar el Intercambio de Datos con el Servidor: Un Pilar para la Performance y la UX
&lt;/h2&gt;

&lt;p&gt;El cuarto principio resalta la importancia de gestionar eficazmente la comunicación entre el cliente y el servidor. Esta gestión optimizada no solo mejora la performance, sino que también asegura una entrega de datos precisa y oportuna, que es crítica para una buena UX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avances Tecnológicos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GraphQL: Esta tecnología permite consultas más eficientes, donde el cliente puede especificar exactamente qué datos necesita del servidor.&lt;/li&gt;
&lt;li&gt;APIs RESTful: Aunque no son nuevas, las APIs RESTful bien diseñadas son fundamentales para un intercambio de datos eficaz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Técnicas de Optimización:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching: El almacenamiento en cache de datos reduce la carga en el servidor y mejora la velocidad de respuesta.&lt;/li&gt;
&lt;li&gt;Optimización de la Carga de Datos: Técnicas como la paginación y la carga diferida ayudan a gestionar la cantidad de datos transmitidos, mejorando la performance y la UX.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La evolución de este principio refleja la continua innovación en la gestión del intercambio de datos, subrayando la importancia de las tecnologías y técnicas modernas para mantener aplicaciones web enriquecidas eficientes y user-friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. No Romper la Historia, Mejorarla: Navegación Intuitiva y Cohesiva
&lt;/h2&gt;

&lt;p&gt;El quinto principio aborda la importancia de mantener una gestión coherente del historial de navegación mientras se enriquece la experiencia del usuario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navegación en SPA (Single Page Applications):&lt;/strong&gt;&lt;br&gt;
Las SPA modernas han mejorado la gestión del historial, permitiendo navegaciones intuitivas sin recargar la página.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Técnicas Modernas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routing del Lado del Cliente: Herramientas como React Router o Vue Router permiten una gestión eficaz del historial y la navegación.&lt;/li&gt;
&lt;li&gt;Historial Mejorado: Las APIs modernas del historial del navegador permiten una gestión más rica y personalizada del historial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este principio resalta la necesidad de una navegación intuitiva y una gestión coherente del historial para proporcionar una UX superior, alineada con las expectativas modernas de interactividad y respuesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Actualizar el Código en Tiempo Real: Evolución Continua y Mejora de la Aplicación
&lt;/h2&gt;

&lt;p&gt;El sexto principio aborda la importancia de actualizar el código en tiempo real para mantener las aplicaciones web enriquecidas optimizadas y al día con las últimas mejoras.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tecnologías Clave:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hot Module Replacement (HMR): Facilita la actualización en tiempo real de módulos en aplicaciones en ejecución sin necesidad de una recarga completa.&lt;/li&gt;
&lt;li&gt;Service Workers: Permiten actualizaciones de fondo, mejorando la experiencia del usuario al mantener la aplicación actualizada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este principio enfatiza una entrega continua y una mejora constante, asegurando que las aplicaciones web enriquecidas sigan siendo relevantes, eficientes y agradable para los usuarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Predecir el Comportamiento: Inteligencia en la Experiencia del Usuario
&lt;/h2&gt;

&lt;p&gt;El séptimo principio, “Predecir el Comportamiento”, se centra en anticipar las acciones y necesidades del usuario para proporcionar una experiencia de usuario más fluida y satisfactoria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tecnologías Emergentes:&lt;/strong&gt;&lt;br&gt;
Inteligencia Artificial (IA) y Aprendizaje Automático (ML): Permiten analizar patrones de comportamiento de los usuarios y hacer predicciones precisas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aplicaciones Prácticas:&lt;/strong&gt;&lt;br&gt;
Precarga de Datos: Basándose en las predicciones, las aplicaciones pueden precargar datos relevantes, mejorando la rapidez y la UX.&lt;br&gt;
Esta evolución del principio refleja el avance de las tecnologías de IA y ML, y cómo pueden ser utilizadas para enriquecer la experiencia del usuario en las aplicaciones web modernas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Navegando la Evolución Tecnológica con Principios Sólidos&lt;/strong&gt;&lt;br&gt;
Los 7 principios delineados por Guillermo Rauch en 2014 continúan siendo relevantes, pero han evolucionado para alinearse con las innovaciones tecnológicas de la actualidad. Desde el renderizado optimizado hasta la predicción del comportamiento del usuario mediante IA, estos principios adaptados subrayan la dinámica de la tecnología web y la necesidad de mantenerse al tanto de las tendencias emergentes. La reflexión sobre estos principios no solo proporciona una hoja de ruta para el desarrollo de aplicaciones web enriquecidas, sino que también destaca cómo la industria ha avanzado, siempre con el objetivo de mejorar la experiencia del usuario y optimizar la performance.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>✨ Next.js 14</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 21:21:05 +0000</pubDate>
      <link>https://forem.com/emapeire/nextjs-14-3je7</link>
      <guid>https://forem.com/emapeire/nextjs-14-3je7</guid>
      <description>&lt;p&gt;Como se anunció en la Next.js Conf, Next.js 14 es una versión más enfocada en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turbopack: 5,000 pruebas pasadas para App &amp;amp; Pages Router.
Inicio de servidor local un 53% más rápido.
Actualizaciones de código un 94% más rápidas con Fast Refresh.&lt;/li&gt;
&lt;li&gt;Acciones en el Servidor (Server Actions): Mutaciones mejoradas de forma progresiva.
Integrado con caché y revalidación.
Llamadas de funciones simples o funciona nativamente con formularios.&lt;/li&gt;
&lt;li&gt;Prerenderización Parcial (Experimental): Respuesta estática inicial rápida + contenido dinámico en streaming.&lt;/li&gt;
&lt;li&gt;Next.js Learn (Nuevo curso): Curso gratuito que enseña el App Router, autenticación, bases de datos y más.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actualiza hoy o comienza con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compilador de Next.js: Turbopack
&lt;/h2&gt;

&lt;p&gt;Desde Next.js 13, se ha estado trabajando arduamente para mejorar el rendimiento del desarrollo local tanto en Next.js en sus páginas como en el App Router.&lt;/p&gt;

&lt;p&gt;Anteriormente, se estaba rescribiendo next dev y otras partes de Next.js para respaldar este esfuerzo. Desde entonces, se ha cambiado la aproximación para ser más incremental. Esto significa que el compilador basado en Rust alcanzará la estabilidad pronto, ya que se han centrado en respaldar todas las características de Next.js primero.&lt;/p&gt;

&lt;p&gt;5,000 pruebas de integración para next dev están pasando ahora con Turbopack, el motor subyacente en Rust. Estas pruebas incluyen 7 años de correcciones de errores y reproducciones.&lt;/p&gt;

&lt;p&gt;Mientras se realizaban pruebas en vercel.com, una gran aplicación de Next.js, se han observado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;53.3% más rápido en cuanto al inicio del servidor local.&lt;/li&gt;
&lt;li&gt;94.7% más rápida en cuanto a la actualización de código con Fast Refresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este benchmark es un resultado práctico de las mejoras de rendimiento que deberías esperar con una aplicación grande (y un gráfico de módulos grande). Con un 90% de pruebas para next dev pasando ahora, deberías experimentar un rendimiento más rápido y confiable de manera constante al usar next dev --turbo.&lt;/p&gt;

&lt;p&gt;Una vez que alcancen el 100% de pruebas pasando, se movera Turbopack a la versión estable en una próxima versión menor. También se continuarán respaldando el uso de webpack para configuraciones personalizadas y complementos del ecosistema.&lt;/p&gt;

&lt;p&gt;Puedes seguir el porcentaje de pruebas pasando en areweturboyet.com.&lt;/p&gt;

&lt;h2&gt;
  
  
  Forms y Mutations
&lt;/h2&gt;

&lt;p&gt;Next.js 9 introdujo las Rutas de API, una forma de construir rápidamente endpoints de backend junto con tu código frontend.&lt;/p&gt;

&lt;p&gt;Por ejemplo, podrías crear un nuevo archivo en el directorio api/:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// pages/api/submit.ts

import type { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse,
) {
  const data = req.body;
  const id = await createItem(data);
  res.status(200).json({ id });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, en el lado del cliente, podrías usar React y un manejador de eventos como onSubmit para hacer una solicitud a tu Ruta de API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// pages/index.tsx

import { FormEvent } from 'react';

export default function Page() {
  async function onSubmit(event: FormEvent&amp;lt;HTMLFormElement&amp;gt;) {
    event.preventDefault();

    const formData = new FormData(event.currentTarget);
    const response = await fetch('/api/submit', {
      method: 'POST',
      body: formData,
    });

    // Handle response if necessary
    const data = await response.json();
    // ...
  }

  return (
    &amp;lt;form onSubmit={onSubmit}&amp;gt;
      &amp;lt;input type="text" name="name" /&amp;gt;
      &amp;lt;button type="submit"&amp;gt;Submit&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora, con Next.js 14, se quiere simplificar la experiencia del desarrollador al crear mutaciones de datos. Además, se quiere mejorar la experiencia del usuario cuando este tiene una conexión de red lenta o cuando envía un formulario desde un dispositivo de menor potencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server Actions
&lt;/h2&gt;

&lt;p&gt;¿Y si no necesitaras crear manualmente una Ruta de API? En su lugar, podrías definir una función que se ejecute de manera segura en el servidor, llamada directamente desde tus componentes React.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/page.tsx

export default function Page() {
  async function create(formData: FormData) {
    'use server';
    const id = await createItem(formData);
  }

  return (
    &amp;lt;form action={create}&amp;gt;
      &amp;lt;input type="text" name="name" /&amp;gt;
      &amp;lt;button type="submit"&amp;gt;Submit&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las Server Actions deberían resultar familiares para cualquier desarrollador que haya utilizado frameworks centrados en el servidor en el pasado. Está basado en fundamentos web como formularios y la API web FormData.&lt;/p&gt;

&lt;p&gt;Si bien usar Server Actions a través de un formulario es útil para la mejora progresiva, no es un requisito. También puedes llamarlas directamente como una función, sin un formulario. Al utilizar TypeScript, esto te proporciona una seguridad de tipos de extremo a extremo entre el cliente y el servidor.&lt;/p&gt;

&lt;p&gt;La mutación de datos, la actualización de la página o la redirección pueden ocurrir en una sola solicitud de red, asegurando que se muestren los datos correctos en el cliente, incluso si el proveedor upstream es lento. Además, puedes componer y reutilizar diferentes acciones, incluyendo muchas acciones diferentes en la misma ruta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caché, Revalidación, Redirección y Más
&lt;/h2&gt;

&lt;p&gt;Las Server Actions están profundamente integradas en todo el modelo del App Routers. Puedes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revalidar datos en caché con revalidatePath() o revalidateTag().&lt;/li&gt;
&lt;li&gt;Redireccionar a rutas diferentes a través de redirect().&lt;/li&gt;
&lt;li&gt;Establecer y leer cookies a través de cookies().&lt;/li&gt;
&lt;li&gt;Manejar actualizaciones optimistas de la interfaz de usuario con useOptimistic().&lt;/li&gt;
&lt;li&gt;Capturar y mostrar errores del servidor con useFormState().&lt;/li&gt;
&lt;li&gt;Mostrar estados de carga en el cliente con useFormStatus().&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obtén más información sobre Forms y Mutations con Server Actions o sobre el modelo de seguridad y las mejores prácticas para Componentes en el Servidor y Acciones en el Servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerenderización Parcial (Partial Pre-rendering)
&lt;/h2&gt;

&lt;p&gt;Se compartió una vista previa del Prerenderización Parcial, una optimización del compilador para contenido dinámico con una respuesta estática inicial rápida, en la que se está trabajando para Next.js.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/page.tsx

export default function Page() {
  return (
    &amp;lt;main&amp;gt;
      &amp;lt;header&amp;gt;
        &amp;lt;h1&amp;gt;My Store&amp;lt;/h1&amp;gt;
        &amp;lt;Suspense fallback={&amp;lt;CartSkeleton /&amp;gt;}&amp;gt;
          &amp;lt;ShoppingCart /&amp;gt;
        &amp;lt;/Suspense&amp;gt;
      &amp;lt;/header&amp;gt;
      &amp;lt;Banner /&amp;gt;
      &amp;lt;Suspense fallback={&amp;lt;ProductListSkeleton /&amp;gt;}&amp;gt;
        &amp;lt;Recommendations /&amp;gt;
      &amp;lt;/Suspense&amp;gt;
      &amp;lt;NewProducts /&amp;gt;
    &amp;lt;/main&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con la Prerenderización Parcial habilitada, esta página genera una estructura estática basada en tus límites de . El fallback de React Suspense se prerrenderiza.&lt;/p&gt;

&lt;p&gt;Los fallbacks de Suspense en la estructura estática se reemplazan luego con componentes dinámicos, como la lectura de cookies para determinar el carrito o mostrar un banner basado en el usuario.&lt;/p&gt;

&lt;p&gt;Cuando se realiza una solicitud, la estructura HTML estática se sirve de inmediato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;main&amp;gt;
  &amp;lt;header&amp;gt;
    &amp;lt;h1&amp;gt;My Store&amp;lt;/h1&amp;gt;
    &amp;lt;div class="cart-skeleton"&amp;gt;
      &amp;lt;!-- Hole --&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/header&amp;gt;
  &amp;lt;div class="banner" /&amp;gt;
  &amp;lt;div class="product-list-skeleton"&amp;gt;
    &amp;lt;!-- Hole --&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;section class="new-products" /&amp;gt;
&amp;lt;/main&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dado que  lee cookies para examinar la sesión del usuario, este componente se transmite como parte de la misma solicitud HTTP que la estructura estática. No se necesitan rondas de red adicionales.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/cart.tsx

import { cookies } from 'next/headers'

export default function ShoppingCart() {
  const cookieStore = cookies()
  const session = cookieStore.get('session')
  return ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para tener la estructura estática más granular posible, esto puede requerir agregar límites de Suspense adicionales. Sin embargo, si ya estás utilizando loading.js hoy, este es un límite de Suspense implícito, por lo que no se requerirían cambios para generar la estructura estática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Próximamente
&lt;/h2&gt;

&lt;p&gt;La prerrenderización parcial está en desarrollo activo. Compartiremos más actualizaciones en una próxima versión menor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mejoras en Metadatos&lt;/strong&gt;&lt;br&gt;
Antes de que el contenido de tu página pueda transmitirse desde el servidor, es importante enviar metadatos sobre la ventana gráfica, el esquema de colores y el tema al navegador primero.&lt;/p&gt;

&lt;p&gt;En Next.js 14, hemos separado los metadatos bloqueantes y no bloqueantes. Solo un pequeño subconjunto de opciones de metadatos son bloqueantes, y queremos asegurarnos de que los metadatos no bloqueantes no impidan que una página parcialmente prerrenderizada sirva la estructura estática.&lt;/p&gt;

&lt;p&gt;Las siguientes opciones de metadatos ahora están en desuso y se eliminarán de los metadatos en una futura versión principal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;viewport: Establece el zoom inicial y otras propiedades de la ventana gráfica.&lt;/li&gt;
&lt;li&gt;colorScheme: Establece los modos admitidos (claro/oscuro) para la ventana gráfica.&lt;/li&gt;
&lt;li&gt;themeColor: Establece el color que debería mostrar el cromo alrededor de la ventana gráfica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A partir de Next.js 14, existen nuevas opciones viewport y generateViewport para reemplazar estas opciones. Todas las demás opciones de metadatos permanecen iguales.&lt;/p&gt;

&lt;p&gt;Puedes comenzar a adoptar estas nuevas API hoy. Las opciones de metadatos existentes seguirán funcionando.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>✨ Cómo funciona Next.js</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 21:15:15 +0000</pubDate>
      <link>https://forem.com/emapeire/como-funciona-nextjs-1kba</link>
      <guid>https://forem.com/emapeire/como-funciona-nextjs-1kba</guid>
      <description>&lt;p&gt;Next.js proporciona un marco de trabajo para estructurar tu aplicación y optimizaciones que ayudan tanto en el proceso de desarrollo como en la velocidad de la aplicación final.&lt;/p&gt;

&lt;p&gt;En las próximas secciones, veremos lo que sucede con tu código de aplicación en las siguientes etapas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El entorno en el que se ejecuta tu código: Desarrollo vs. Producción.&lt;/li&gt;
&lt;li&gt;Cuándo se ejecuta tu código: Tiempo de compilación vs. Tiempo de ejecución.&lt;/li&gt;
&lt;li&gt;Dónde ocurre la representación: Cliente vs. Servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora, profundicemos en estos conceptos y discutamos algunos de los procesos que Next.js realiza en segundo plano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entornos de desarrollo y producción
&lt;/h2&gt;

&lt;p&gt;Puedes pensar en los entornos como el contexto en el que se ejecuta tu código.&lt;/p&gt;

&lt;p&gt;Durante el desarrollo, estás construyendo y ejecutando la aplicación en tu máquina local. Pasar a producción es el proceso de preparar tu aplicación para ser implementada y consumida por los usuarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se aplica esto a Next.js
&lt;/h2&gt;

&lt;p&gt;Next.js proporciona características tanto para las etapas de desarrollo como para las de producción de una aplicación. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En la etapa de desarrollo, Next.js se optimiza para el desarrollador y su experiencia al construir la aplicación. Viene con características que buscan mejorar la Experiencia del Desarrollador, como la integración incorporada de TypeScript y ESLint, Fast Refresh y más.&lt;/li&gt;
&lt;li&gt;En la etapa de producción, Next.js se optimiza para los usuarios finales y su experiencia al utilizar la aplicación. Su objetivo es transformar el código para que sea eficiente y accesible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dado que cada entorno tiene consideraciones y objetivos diferentes, hay mucho que debe hacerse para llevar una aplicación desde el desarrollo hasta la producción. Por ejemplo, el código de la aplicación debe ser compilado, empaquetado, minimizado y dividido en fragmentos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Compilador de Next.js
&lt;/h2&gt;

&lt;p&gt;Next.js se encarga en gran medida de estas transformaciones de código y de la infraestructura subyacente para facilitar que tu aplicación pase a producción.&lt;/p&gt;

&lt;p&gt;Esto es posible porque Next.js tiene un compilador escrito en Rust, un lenguaje de programación de bajo nivel, y SWC, una plataforma que se puede utilizar para la compilación, minimización, empaquetado y más.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la Compilación?
&lt;/h2&gt;

&lt;p&gt;Los desarrolladores escriben código en lenguajes más amigables para los desarrolladores, como JSX, TypeScript y versiones modernas de JavaScript. Si bien estos lenguajes mejoran la eficiencia y la confianza de los desarrolladores, deben compilarse a JavaScript antes de que los navegadores puedan entenderlos.&lt;/p&gt;

&lt;p&gt;La compilación se refiere al proceso de tomar código en un lenguaje y convertirlo en otro lenguaje o en otra versión de ese lenguaje.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gqof8i76r9t888o6sku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gqof8i76r9t888o6sku.png" alt="Compilación" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En Next.js, la compilación ocurre durante la etapa de desarrollo a medida que editas tu código y como parte del paso de compilación para preparar tu aplicación para la producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la Minificación (Minifying)?
&lt;/h2&gt;

&lt;p&gt;Los desarrolladores escriben código optimizado para que sea legible por los humanos. Este código puede contener información adicional que no es necesaria para que el código se ejecute, como comentarios, espacios, sangrías y múltiples líneas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flesv7j05sagya3seefl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flesv7j05sagya3seefl0.png" alt="Minificación" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La minificación es el proceso de eliminar el formato y los comentarios innecesarios del código sin cambiar la funcionalidad del mismo. El objetivo es mejorar el rendimiento de la aplicación al reducir el tamaño de los archivos.&lt;/p&gt;

&lt;p&gt;En Next.js, los archivos de JavaScript y CSS se minifican automáticamente para la producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la Agrupación (Bundling)?
&lt;/h2&gt;

&lt;p&gt;Los desarrolladores dividen su aplicación en módulos, componentes y funciones que se pueden utilizar para construir piezas más grandes de su aplicación. Exportar e importar estos módulos internos, así como paquetes externos de terceros, crea una compleja red de dependencias de archivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguahmxq9elbibjswrc23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguahmxq9elbibjswrc23.png" alt="Agrupación" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La agrupación (bundling) es el proceso de resolver esta red de dependencias y fusionar (o ‘empaquetar’) los archivos (o módulos) en paquetes optimizados para el navegador, con el objetivo de reducir la cantidad de solicitudes de archivos cuando un usuario visita una página web.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la División de Código (Code Splitting)?
&lt;/h2&gt;

&lt;p&gt;Por lo general, los desarrolladores dividen sus aplicaciones en varias páginas a las que se puede acceder desde diferentes URL. Cada una de estas páginas se convierte en un punto de entrada (entry point) único en la aplicación.&lt;/p&gt;

&lt;p&gt;La división de código es el proceso de dividir el paquete de la aplicación en fragmentos más pequeños requeridos por cada punto de entrada. El objetivo es mejorar el tiempo de carga inicial de la aplicación cargando solo el código necesario para ejecutar esa página.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nm4c4kjzgrtbogpknf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nm4c4kjzgrtbogpknf3.png" alt="División de código" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next.js tiene soporte incorporado para la división de código. Cada archivo dentro de su directorio de páginas (pages/) se dividirá automáticamente en su propio paquete JavaScript durante el paso de compilación.&lt;/p&gt;

&lt;p&gt;Además:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cualquier código compartido entre las páginas también se divide en otro paquete para evitar la descarga repetida del mismo código al navegar a otras páginas.&lt;/li&gt;
&lt;li&gt;Después de la carga inicial de la página, Next.js puede comenzar a precargar el código de otras páginas a las que es probable que los usuarios naveguen.&lt;/li&gt;
&lt;li&gt;Las importaciones dinámicas son otra forma de dividir manualmente qué código se carga inicialmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tiempo de Compilación (Build Time) y Tiempo de Ejecución (Run Time)
&lt;/h2&gt;

&lt;p&gt;El tiempo de compilación (o paso de compilación) es el nombre dado a una serie de pasos que preparan el código de su aplicación para la producción.&lt;/p&gt;

&lt;p&gt;Cuando construye su aplicación, Next.js transformará su código en archivos optimizados para la producción listos para ser implementados en servidores y consumidos por usuarios. Estos archivos incluyen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archivos HTML para páginas generadas estáticamente.&lt;/li&gt;
&lt;li&gt;Código JavaScript para renderizar páginas en el servidor.&lt;/li&gt;
&lt;li&gt;Código JavaScript para hacer que las páginas sean interactivas en el cliente.&lt;/li&gt;
&lt;li&gt;Archivos CSS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El tiempo de ejecución (o tiempo de solicitud) se refiere al período de tiempo en el que su aplicación se ejecuta en respuesta a la solicitud de un usuario, después de que su aplicación haya sido construida e implementada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cliente y Servidor
&lt;/h2&gt;

&lt;p&gt;En el contexto de las aplicaciones web, el cliente se refiere al navegador en el dispositivo de un usuario que envía una solicitud a un servidor para obtener el código de su aplicación. Luego, convierte la respuesta que recibe del servidor en una interfaz con la que el usuario puede interactuar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tzzfqwgguj6z5kdsmu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tzzfqwgguj6z5kdsmu0.png" alt="Cliente y Servidor" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El servidor se refiere a la computadora en un centro de datos que almacena el código de su aplicación, recibe solicitudes de un cliente, realiza algunos cálculos y envía una respuesta adecuada.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es el Renderizado?
&lt;/h2&gt;

&lt;p&gt;Hay una unidad inevitable de trabajo para convertir el código que escribes en React en la representación HTML de tu interfaz de usuario. Este proceso se llama renderizado.&lt;/p&gt;

&lt;p&gt;El renderizado puede tener lugar en el servidor o en el cliente. Puede ocurrir de antemano en el momento de la construcción (build time) o en cada solicitud en tiempo de ejecución.&lt;/p&gt;

&lt;p&gt;Con Next.js, están disponibles tres tipos de métodos de renderizado: Server-Side Rendering, Static Site Generation y Client-Side Rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-Renderizado
&lt;/h2&gt;

&lt;p&gt;El Server-Side Rendering y la Static Site Generation también se conocen como Pre-Renderizado porque la obtención de datos externos y la transformación de los componentes de React en HTML ocurren antes de que el resultado se envíe al cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Client-Side Rendering vs. Pre-Rendering
&lt;/h2&gt;

&lt;p&gt;En una aplicación React estándar, el navegador recibe una carcasa HTML vacía del servidor junto con las instrucciones de JavaScript para construir la interfaz de usuario. Esto se llama renderizado en el lado del cliente porque el trabajo de renderizado inicial ocurre en el dispositivo del usuario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9os8ltyvkve2isv3izsv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9os8ltyvkve2isv3izsv.png" alt="Client-Side Rendering" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Puedes optar por utilizar el renderizado en el lado del cliente para componentes específicos en tu aplicación Next.js eligiendo recuperar datos con useEffect() de React o un gancho de obtención de datos como useSWR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En cambio, Next.js pre-renderiza automáticamente cada página. El pre-renderizado significa que el HTML se genera de antemano, en un servidor, en lugar de hacerlo todo con JavaScript en el dispositivo del usuario.&lt;/p&gt;

&lt;p&gt;En la práctica, esto significa que para una aplicación completamente renderizada en el lado del cliente, el usuario verá una página en blanco mientras se realiza el trabajo de renderizado. En comparación con una aplicación pre-renderizada, donde el usuario verá el HTML construido:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb7dlknnwpws2rgm050g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb7dlknnwpws2rgm050g.png" alt="Pre-Rendering" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discutamos los dos tipos de pre-renderizado:&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-Side Rendering
&lt;/h2&gt;

&lt;p&gt;Con el renderizado en el lado del servidor, el HTML de la página se genera en un servidor para cada solicitud. El HTML generado, los datos JSON y las instrucciones de JavaScript para hacer que la página sea interactiva se envían al cliente.&lt;/p&gt;

&lt;p&gt;En el cliente, se utiliza el HTML para mostrar una página rápida pero no interactiva, mientras que React utiliza los datos JSON e instrucciones de JavaScript para hacer que los componentes sean interactivos (por ejemplo, adjuntar controladores de eventos a un botón). A este proceso se le llama hidratación.&lt;/p&gt;

&lt;p&gt;En Next.js, puedes optar por renderizar en el lado del servidor utilizando getServerSideProps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: React 18 y Next 12 introducen una versión alfa de React server components. Los componentes del servidor se renderizan completamente en el servidor y no requieren JavaScript en el lado del cliente para renderizar. Además, los componentes del servidor permiten a los desarrolladores mantener parte de la lógica en el servidor y solo enviar el resultado de esa lógica al cliente. Esto reduce el tamaño del paquete enviado al cliente y mejora el rendimiento del renderizado en el lado del cliente. Obtén más información sobre los componentes del servidor de React aquí.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Static Site Generation
&lt;/h2&gt;

&lt;p&gt;Con la generación de sitios estáticos, el HTML se genera en el servidor, pero a diferencia del renderizado en el lado del servidor, no hay servidor en tiempo de ejecución. En su lugar, el contenido se genera una sola vez, en el momento de la construcción (build time), cuando se despliega la aplicación, y el HTML se almacena en una CDN y se reutiliza para cada solicitud.&lt;/p&gt;

&lt;p&gt;En Next.js, puedes optar por generar páginas de forma estática utilizando getStaticProps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Puedes utilizar la “Regeneración Estática Incremental” para crear o actualizar páginas estáticas después de haber construido tu sitio. Esto significa que no tienes que reconstruir todo tu sitio si tus datos cambian.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La belleza de Next.js es que puedes elegir el método de renderizado más apropiado para tu caso de uso en particular, ya sea Generación de Sitio Estático, Renderizado en el Lado del Servidor o Renderizado en el Lado del Cliente. Para obtener más información sobre qué método de renderizado es adecuado para tu caso de uso específico, consulta la documentación sobre la obtención de datos (data fetching).&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es la Red?
&lt;/h2&gt;

&lt;p&gt;Es útil saber dónde se almacena y se ejecuta el código de tu aplicación una vez que se despliega en la red. Puedes pensar en la red como una serie de computadoras interconectadas (o servidores) capaces de compartir recursos. En el caso de una aplicación Next.js, tu código de aplicación puede distribuirse en servidores de origen, redes de distribución de contenido (CDN) y el borde (Edge). Veamos qué significa cada uno de estos términos:&lt;/p&gt;

&lt;h2&gt;
  
  
  Servidores de Origen
&lt;/h2&gt;

&lt;p&gt;Como discutimos anteriormente, el término “servidor” se refiere al ordenador principal que almacena y ejecuta la versión original de tu código de aplicación.&lt;/p&gt;

&lt;p&gt;Usamos el término “origen” para distinguir este servidor de los otros lugares donde se puede distribuir el código de la aplicación, como los servidores de CDN y los servidores de borde.&lt;/p&gt;

&lt;p&gt;Cuando un servidor de origen recibe una solicitud, realiza algunos cálculos antes de enviar una respuesta. El resultado de este trabajo de cálculo se puede mover a un CDN (Red de Distribución de Contenido).&lt;/p&gt;

&lt;h2&gt;
  
  
  Red de Distribución de Contenido (CDN)
&lt;/h2&gt;

&lt;p&gt;Las CDNs almacenan contenido estático (como archivos HTML e imágenes) en múltiples ubicaciones de todo el mundo y se colocan entre el cliente y el servidor de origen. Cuando llega una nueva solicitud, la ubicación del CDN más cercana al usuario puede responder con el resultado en caché.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq91kmtk2gt47ora4sxsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq91kmtk2gt47ora4sxsg.png" alt="Content Delivery Network" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto reduce la carga en el origen porque el cálculo no tiene que realizarse en cada solicitud. También hace que sea más rápido para el usuario porque la respuesta proviene de una ubicación geográficamente más cercana a ellos.&lt;/p&gt;

&lt;p&gt;En Next.js, dado que el pre-renderizado se puede realizar de antemano, las CDNs son adecuadas para almacenar el resultado estático del trabajo, lo que hace que la entrega de contenido sea más rápida.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Borde (Edge)
&lt;/h2&gt;

&lt;p&gt;El borde es un concepto generalizado para el límite (o borde) de la red, más cercano al usuario. Las CDNs podrían considerarse parte de “el borde” porque almacenan contenido estático en el borde de la red.&lt;/p&gt;

&lt;p&gt;Similar a las CDNs, los servidores de borde se distribuyen en múltiples ubicaciones de todo el mundo. Pero a diferencia de las CDNs, que almacenan contenido estático, algunos servidores de borde pueden ejecutar pequeños fragmentos de código.&lt;/p&gt;

&lt;p&gt;Esto significa que tanto el almacenamiento en caché como la ejecución de código se pueden realizar en el borde más cercano al usuario.&lt;/p&gt;

&lt;p&gt;Al trasladar parte del trabajo que tradicionalmente se realizaba en el lado del cliente o del servidor al borde, puedes hacer que tu aplicación sea más eficiente, ya que reduce la cantidad de código enviado al cliente y parte de la solicitud del usuario no tiene que ir todo el camino de regreso al servidor de origen, lo que reduce la latencia. Consulta ejemplos de uso del borde con Next.js aquí.&lt;/p&gt;

&lt;p&gt;En Next.js, puedes ejecutar código en el borde con Middleware y pronto con React Server Components.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>✨ Por qué todas las migraciones de aplicaciones deberían ser incrementales</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 21:00:48 +0000</pubDate>
      <link>https://forem.com/emapeire/por-que-todas-las-migraciones-de-aplicaciones-deberian-ser-incrementales-dm0</link>
      <guid>https://forem.com/emapeire/por-que-todas-las-migraciones-de-aplicaciones-deberian-ser-incrementales-dm0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Las migraciones grandes son inevitables, pero no tienen por qué ser dolorosas ni arriesgadas. Descubre por qué migrar de manera incremental es la solución.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En el año 2023, son pocos los proyectos de software que son verdaderamente nuevos desde cero. En su lugar, las migraciones de sistemas existentes son la nueva norma. Las migraciones mal ejecutadas pueden introducir riesgos sustanciales para el negocio y los plazos en cualquier proyecto de software. Una estrategia de migración incremental puede minimizar esos riesgos al tiempo que adelanta la validación del impacto empresarial.&lt;/p&gt;

&lt;p&gt;El producto de Vercel está diseñado para admitir la migración incremental desde el principio. En este artículo, obtendrás una visión general de alto nivel de las estrategias y consideraciones de migración incremental.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué migrar de manera incremental?
&lt;/h2&gt;

&lt;p&gt;Casi todos los proyectos de software que requieren migraciones deberían apuntar a migraciones incrementales con el fin de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimizar el riesgo al reducir el alcance de los pasos individuales de la migración.&lt;/li&gt;
&lt;li&gt;Minimizar el riesgo al tener un camino más natural para retroceder en caso de problemas inesperados.&lt;/li&gt;
&lt;li&gt;Permitir la validación de la implementación técnica y el valor empresarial de manera sustancialmente más temprana en el proceso.&lt;/li&gt;
&lt;li&gt;Lograr una migración sin tiempo de inactividad y sin ventanas de mantenimiento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comprender las migraciones ‘big bang’&lt;/strong&gt;&lt;br&gt;
Las migraciones ‘big bang’ son migraciones en las que se reemplaza un sistema de una sola vez en un cambio completo. Puede haber pasos intermedios, pero se realizan todos en un período muy corto. Básicamente, eliges una fecha y en esa fecha, todo el uso se traslada del sistema antiguo al nuevo sistema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft97cy16y0pfmjs5h2ksm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft97cy16y0pfmjs5h2ksm.png" alt="Big Bang" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Problemas con las migraciones ‘big bang’ pueden incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puedes pasar por todo el proceso solo para descubrir que hay problemas de producto que son muy costosos de solucionar tan tarde en el programa.&lt;/li&gt;
&lt;li&gt;Los ensayos son inherentemente difíciles de ejecutar, lo que dificulta evaluar de antemano si una migración tendrá éxito.&lt;/li&gt;
&lt;li&gt;Puedes llegar a un punto de no retorno en el que una migración debe completarse incluso si se notan problemas importantes mientras está en curso.&lt;/li&gt;
&lt;li&gt;Puede ser necesario poner fuera de línea el sistema antiguo mientras se realiza la migración, lo que lleva a la pérdida de negocio. Estas ventanas de mantenimiento a menudo se prolongan en duración a medida que se descubren problemas solo durante la ejecución de la migración.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es una migración incremental?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrjjbrje5epx8qvhkg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrjjbrje5epx8qvhkg6.png" alt="Legacy sistem" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una estrategia de migración incremental implica la transición gradual a un sistema de software nuevo o significativamente actualizado. Durante este proceso, tanto los sistemas antiguos como los nuevos se ejecutan simultáneamente, y las características o usuarios se trasladan en fases en lugar de hacerlo todo de una vez.&lt;/p&gt;

&lt;p&gt;Existen dos tipos principales de migraciones incrementales:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Vertical: Incrementos por características&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru1u75xxaiyzhs1m69n7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fru1u75xxaiyzhs1m69n7.png" alt="All features on legacy system" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta estrategia, se cambian subconjuntos de la funcionalidad del sistema al nuevo sistema. Piensa en esto como migrar una característica a la vez, donde ambos sistemas operan en paralelo y la funcionalidad se dirige al sistema nuevo o antiguo según si la característica respectiva ha sido migrada o no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Horizontal: Incrementos por usuario&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8lk22d83bry24ook8ubq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8lk22d83bry24ook8ubq.png" alt="Migration increments" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En las migraciones horizontales, aunque “los usuarios” son comúnmente la unidad principal que se traslada, se pueden usar otras entidades en su lugar. La elección ideal sería una entidad que se pueda dividir o “fragmentar” fácilmente dentro de un sistema, garantizando una interacción mínima entre estos fragmentos separados.&lt;/p&gt;

&lt;p&gt;No sería raro ver estrategias de migración incremental verticales y horizontales combinadas en migraciones complejas. En ese caso, verías una migración por usuario en una base por característica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compromisos de las migraciones incrementales
&lt;/h2&gt;

&lt;p&gt;El principal compromiso de las migraciones incrementales es la introducción de un esfuerzo adicional para implementar la interoperabilidad entre el sistema nuevo y el antiguo. Esto debe sopesarse frente a la reducción del riesgo y la mayor rapidez en la validación del valor empresarial.&lt;/p&gt;

&lt;p&gt;Esto es particularmente desafiante si los sistemas deben acceder a los datos de cada uno. En el caso de una migración incremental horizontal, la elección correcta de la unidad de incremento es la decisión más crucial para minimizar las dependencias de datos. Las entidades comunes donde esto es cierto son un “usuario” o una “organización”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migraciones de frontend
&lt;/h2&gt;

&lt;p&gt;Las migraciones de frontend son un caso especial de migración en el que se migra una capa de frontend mientras el backend permanece estable. Las migraciones de frontend suelen ser más fáciles de ejecutar porque los datos con estado siguen siendo gestionados por el mismo “sistema de registro”, y solo se actualiza la representación y el procesamiento de los datos del backend.&lt;/p&gt;

&lt;p&gt;Si bien el término “frontend” a veces evoca expectativas de interfaces de usuario y modalidades similares, el principio de la migración en capas se puede extender profundamente en sistemas más grandes: por ejemplo, incluso si se intercambian sistemas enteros, incluyendo sus bases de datos principales, puede ser útil mantener la capa de almacén de datos estable y alimentar datos desde sistemas antiguos y nuevos de manera concurrente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr11v4kv9n2l1n9idbsc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr11v4kv9n2l1n9idbsc6.png" alt="Frontend migration" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No cambiar las capas de análisis al mismo tiempo que las aplicaciones tiene el beneficio adicional de mantener un sistema confiable para juzgar el rendimiento del nuevo sistema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7s7xegevhhv7qfprcvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7s7xegevhhv7qfprcvn.png" alt="New fronted" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Migración de monolítica a arquitectura componible
&lt;/h2&gt;

&lt;p&gt;Un caso especial de migración de frontend es aquel en el que el sistema antiguo no se descompuso adecuadamente en backend y frontend. Si el objetivo es cambiar a un nuevo frontend, puede ser posible introducir una API en el sistema antiguo de manera que un nuevo frontend se pueda introducir mientras se mantiene el sistema existente como backend.&lt;/p&gt;

&lt;p&gt;Lo anterior es común cuando las empresas optan por sistemas monolíticos que acoplan el frontend y el backend en un solo sistema. A medida que estas empresas desean tener más control sobre la interfaz de usuario que presentan a sus usuarios, a menudo introducen frontends separados que tratan al monolito anterior como un servicio de API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migración de un frontend web&lt;/strong&gt;&lt;br&gt;
El elemento clave para la migración incremental de frontends web es el proxy inverso. Los proxies inversos permiten a un servidor web servir contenido desde múltiples servidores web diferentes bajo su dominio principal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67cudck6vy783wd5vs44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67cudck6vy783wd5vs44.png" alt="Incoming request" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 1: Introducir un proxy inverso sin cambios en la funcionalidad&lt;/strong&gt;&lt;br&gt;
El primer paso de cualquier migración a una nueva infraestructura de servicio es introducir un proxy inverso que redirige todas las solicitudes a la infraestructura heredada. El proxy inverso puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estar ubicado junto al nuevo frontend (recomendado).&lt;/li&gt;
&lt;li&gt;Estar en el frontend antiguo.&lt;/li&gt;
&lt;li&gt;Estar en un sistema dedicado introducido específicamente para la migración.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se recomienda colocar el proxy inverso junto al nuevo frontend porque permite exponer la nueva infraestructura al tráfico de producción sin cambios esperados en el comportamiento.&lt;/p&gt;

&lt;p&gt;Las aplicaciones de Vercel vienen con funcionalidad de proxy inverso incorporada para ayudar a implementar estas migraciones. Es importante destacar que el proxy inverso se puede programar a través de Edge Middleware, lo que facilita la implementación de los incrementos de migración y los adaptadores de solicitudes entre sistemas nuevos y heredados.&lt;/p&gt;

&lt;p&gt;Cuando se completa esta etapa, la nueva infraestructura está formalmente en producción, pero toda la lógica real la proporciona el sistema heredado. Esperamos que no haya cambios en el comportamiento después del paso 1, por lo que es fácil verificar que esta etapa de la migración fue exitosa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 2: Comienza a migrar partes del tráfico&lt;/strong&gt;&lt;br&gt;
Al comienzo del paso 2, el nuevo sistema atiende todo el tráfico, pero no ejecuta la lógica de la aplicación real. Ahora es posible configurar el nuevo sistema para tomar parte del tráfico mientras sigue enrutando todo el otro tráfico al sistema heredado.&lt;/p&gt;

&lt;p&gt;Por ejemplo, en una tienda en línea, uno podría comenzar a servir un subconjunto de las páginas de detalles de productos desde el nuevo sistema, mientras que todo lo demás se enruta. Estos incrementos en la funcionalidad se pueden validar paso a paso.&lt;/p&gt;

&lt;p&gt;Con el tiempo, un porcentaje cada vez mayor de las páginas son servidas por el nuevo sistema, hasta que eventualmente el 100% del tráfico sea gestionado directamente por el nuevo sistema. En esta etapa, el proxy inverso al sistema heredado puede ser apagado y la migración en términos de efectos visibles para el usuario está completa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migraciones de tráfico&lt;/strong&gt;&lt;br&gt;
Las migraciones de tráfico son un caso especial de migración incremental horizontal.&lt;/p&gt;

&lt;p&gt;Actualmente, Vercel se encuentra en medio de una importante migración incremental de su sistema principal de servicio. El equipo ha elegido una estrategia de migración incremental en combinación con lanzamientos oscuros (dark launches). Su objetivo para el nuevo sistema es tener compatibilidad bug-for-bug con el sistema heredado mientras mejora sustancialmente la latencia y el uso de la CPU.&lt;/p&gt;

&lt;p&gt;Un lanzamiento oscuro es la introducción de un sistema secundario mientras que un sistema existente continúa sirviendo el tráfico orientado al usuario. En nuestra fase de lanzamiento oscuro, enviamos tráfico tanto al sistema antiguo como al nuevo y comparamos los resultados para validar que se comporten exactamente de la misma manera.&lt;/p&gt;

&lt;p&gt;Naturalmente, un lanzamiento oscuro utiliza recursos adicionales (ya que tanto los sistemas antiguos como los nuevos están involucrados en el mismo tráfico, efectivamente duplicando las necesidades de procesamiento). Por lo tanto, es recomendable ejecutar solo un subconjunto del tráfico a través del camino del lanzamiento oscuro.&lt;/p&gt;

&lt;p&gt;En Vercel, nuestro plan de implementación incremental se ve así:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lanzamiento oscuro para X% del tráfico.&lt;/li&gt;
&lt;li&gt;Observar diferencias en las respuestas entre el sistema antiguo y el nuevo.&lt;/li&gt;
&lt;li&gt;Si es necesario, corregir el comportamiento del nuevo sistema.&lt;/li&gt;
&lt;li&gt;Validar que el nuevo sistema, de hecho, mejora la latencia y el uso de la CPU.&lt;/li&gt;
&lt;li&gt;Una vez que el lanzamiento oscuro se comporta de manera suficientemente similar al nuevo sistema y se alcanzan los objetivos del nuevo sistema, cambiar el mismo X% del tráfico al nuevo sistema.&lt;/li&gt;
&lt;li&gt;Repetir hasta que el 100% del tráfico esté migrado.
Hasta la fecha, hemos completado con éxito esta migración y ahora estamos sirviendo el 100% del tráfico en el nuevo sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;Las migraciones incrementales pueden parecer como un alcance adicional que uno podría desear evitar, pero las organizaciones maduras se dan cuenta de que generalmente valen el esfuerzo. Las migraciones incrementales minimizan el riesgo, mejoran el tiempo para validar el valor empresarial de un cambio y eliminan el tiempo de inactividad planificado.&lt;/p&gt;

&lt;p&gt;Las migraciones de frontend son un caso especial de migraciones en las que los sistemas de registro se mantienen iguales mientras se reemplaza el frontend. Las migraciones a Vercel a menudo son de este tipo. Nuestra plataforma proporciona herramientas especializadas para respaldar estas migraciones a través de enrutamiento inverso y una gestión detallada de solicitudes en Edge Middleware.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Cómo utilizar la Función de Llamada de Open AI con Next.js y el IA SDK de Vercel</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 20:49:53 +0000</pubDate>
      <link>https://forem.com/emapeire/como-utilizar-la-funcion-de-llamada-de-open-ai-con-nextjs-y-el-ia-sdk-de-vercel-d4g</link>
      <guid>https://forem.com/emapeire/como-utilizar-la-funcion-de-llamada-de-open-ai-con-nextjs-y-el-ia-sdk-de-vercel-d4g</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es la función de llamada de OpenAI?
&lt;/h2&gt;

&lt;p&gt;Para contextualizar, GPT-4 y GPT-3.5 Turbo son Modelos Grandes de Lenguaje (LLM) que han sido entrenados por OpenAI en un vasto corpus de datos de texto. Sobresalen en una amplia gama de tareas de lenguaje, incluyendo la completación de texto, la sumarización e incluso la escritura creativa.&lt;/p&gt;

&lt;p&gt;Con la función de llamada, los LLMs ahora pueden recibir definiciones de funciones y generar un objeto JSON con los argumentos necesarios para invocar esas funciones. Esto facilita la integración de las características de GPT con herramientas y APIs externas, permitiendo a los desarrolladores construir experiencias intuitivas impulsadas por la IA aprovechando el poder de los LLMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de flujos de experiencia de usuario para la función de llamada
&lt;/h2&gt;

&lt;p&gt;Hemos identificado tres flujos principales de experiencia de usuario que son esenciales para la nueva API de Llamada de Función de OpenAI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1- Ejecución Automática de Funciones&lt;/strong&gt;&lt;br&gt;
Este es el flujo típico de ejecución de llamada de función:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El cliente/usuario envía un mensaje en lenguaje natural.&lt;/li&gt;
&lt;li&gt;En el servidor, el IA SDK envía la lista de funciones predefinidas junto con la entrada del usuario a OpenAI, que devuelve el JSON requerido para la llamada de función.&lt;/li&gt;
&lt;li&gt;El servidor ejecuta la llamada de función.&lt;/li&gt;
&lt;li&gt;El IA SDK envía la salida de la llamada de función a OpenAI y obtiene una salida resumida.&lt;/li&gt;
&lt;li&gt;El IA SDK envía la salida al cliente a través del borde.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17jfu7493kc4wgd8v0zl.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17jfu7493kc4wgd8v0zl.jpeg" alt="Paso 1" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2- Ejecución Automática de Funciones con Intención y Progreso&lt;/strong&gt;&lt;br&gt;
Si bien la función todavía se ejecuta automáticamente, este flujo proporciona contexto al usuario sobre la progresión de la función:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El cliente/usuario envía un mensaje en lenguaje natural.&lt;/li&gt;
&lt;li&gt;En el servidor, el IA SDK envía la lista de funciones predefinidas junto con la entrada del usuario a OpenAI, que devuelve el JSON requerido para la llamada de función.&lt;/li&gt;
&lt;li&gt;El servidor envía una intención al cliente de que habrá una ejecución de llamada de función a través del IA SDK, y procede a ejecutar la llamada de función.&lt;/li&gt;
&lt;li&gt;Mientras la llamada de función se está ejecutando, el IA SDK envía el progreso al cliente.&lt;/li&gt;
&lt;li&gt;Una vez completada, el IA SDK envía la salida de la llamada de función a OpenAI y obtiene una salida resumida.&lt;/li&gt;
&lt;li&gt;El IA SDK envía la salida al cliente a través del edge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flplsxkkpir5sz8qfn21h.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flplsxkkpir5sz8qfn21h.jpeg" alt="Paso 2" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3- Ejecución de Función con Aprobación del Usuario&lt;/strong&gt;&lt;br&gt;
La función solo se ejecuta con la confirmación del usuario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El cliente/usuario envía un mensaje en lenguaje natural.&lt;/li&gt;
&lt;li&gt;En el servidor, el IA SDK envía la lista de funciones predefinidas junto con la entrada del usuario a OpenAI, que devuelve el JSON requerido para la llamada de función.&lt;/li&gt;
&lt;li&gt;El servidor envía una intención al cliente. Si el cliente confirma, el servidor ejecuta la llamada de función.&lt;/li&gt;
&lt;li&gt;El SDK de IA envía la salida de la llamada de función a OpenAI y obtiene una salida resumida.&lt;/li&gt;
&lt;li&gt;El IA SDK envía la salida al cliente a través del borde.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lmamyi2yp7leol3cbdz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lmamyi2yp7leol3cbdz.jpeg" alt="Paso 3" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Casos de uso para la función de llamada de OpenAI
&lt;/h2&gt;

&lt;p&gt;La función de llamada de OpenAI es una herramienta poderosa para construir experiencias de usuario mejoradas con IA.&lt;/p&gt;

&lt;p&gt;Aquí hay algunos ejemplos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Análisis y procesamiento de datos en formato libre:&lt;/strong&gt; En lugar de codificar manualmente complejas expresiones regulares para analizar y procesar datos en formato libre, ahora puedes aprovechar la función de llamada de OpenAI para convertir datos en formato libre en entradas de funciones completamente formateadas y seguras que se pueden usar para realizar operaciones POST/PUT en tu base de datos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Chatbots que interactúan con APIs externas:&lt;/strong&gt; Con la llamada de función, puedes crear rápidamente chatbots que pueden interactuar con APIs de terceros utilizando lenguaje natural. Esto es similar a cómo funcionan los complementos de ChatGPT; toma el Plugin WeatherGPT, por ejemplo, que convierte una pregunta del usuario sobre el clima en una salida JSON estructurada que se puede enviar a una API de clima de tu elección.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo usar la Función de Llamada de OpenAI
&lt;/h2&gt;

&lt;p&gt;Para aprender más sobre la Función de Llamada de OpenAI, construiremos un chatbot de IA que interactúe con la API de Hacker News en tiempo real utilizando la Función de Llamada de OpenAI y el IA SDK de Vercel.&lt;/p&gt;

&lt;p&gt;Si prefieres no empezar desde cero, hemos preparado una plantilla que puedes clonar localmente y utilizar como punto de partida en su lugar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/steven-tey/chathn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Paso 1: Crear una ruta de API para el chat&lt;/strong&gt;&lt;br&gt;
Primero, crea una ruta de API utilizando el tiempo de ejecución Edge. Podemos usar el ejemplo predeterminado en la documentación del AI SDK por ahora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/api/chat/route.ts

import OpenAI from 'openai';
import { OpenAIStream, StreamingTextResponse } from 'ai';

// Optional, but recommended: run on the edge runtime.
// See https://vercel.com/docs/concepts/functions/edge-functions
export const runtime = 'edge';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY!,
});

export async function POST(req: Request) {
  // Extract the `messages` from the body of the request
  const { messages } = await req.json();

  // Request the OpenAI API for the response based on the prompt
  const response = await openai.chat.completions.create({
    model: 'gpt-3.5-turbo',
    stream: true,
    messages: messages,
  });

  // Convert the response into a friendly text-stream
  const stream = OpenAIStream(response);

  // Respond with the stream
  return new StreamingTextResponse(stream);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Paso 2: Definir tus funciones&lt;/strong&gt;&lt;br&gt;
Piensa en las funciones como una serie de arrays posibles que se pueden utilizar para interactuar con tu API, similar a las opciones definidas en una especificación de OpenAPI.&lt;/p&gt;

&lt;p&gt;A continuación, se muestra un ejemplo de una función que obtiene y devuelve las mejores historias en Hacker News. Puedes consultar la lista completa de funciones en la plantilla ChatHN aquí.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/api/chat/functions.ts

import { CompletionCreateParams } from "openai/resources/chat/index";

export const functions: CompletionCreateParams.Function[] = [
  {
    name: "get_top_stories",
    description:
      "Get the top stories from Hacker News. Also returns the Hacker News URL to each story.",
    parameters: {
      type: "object",
      properties: {
        limit: {
          type: "number",
          description: "The number of stories to return. Defaults to 10.",
        },
      },
      required: [],
    },
  },
  ... // more functions
];

async function get_top_stories(limit: number = 10) {
  const response = await fetch(
    "https://hacker-news.firebaseio.com/v0/topstories.json",
  );
  const ids = await response.json();
  const stories = await Promise.all(
    ids.slice(0, limit).map((id: number) =&amp;gt; get_story(id)),
  );
  return stories;
}

export async function runFunction(name: string, args: any) {
  switch (name) {
    case "get_top_stories":
      return await get_top_stories();
     ... // more functions
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si lo prefieres, puedes colocar el archivo de funciones en el mismo directorio que tu ruta de API, ya que solo el contenido devuelto por page.js o route.js se envía al cliente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paso 3: Agregar el mecanismo de llamada de funciones a la ruta de API&lt;/strong&gt;&lt;br&gt;
Una vez que hayas definido tus funciones, puedes comenzar a agregar la llamada de funciones a la ruta de API que creaste en el Paso 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/api/chat/route.ts

import OpenAI from 'openai';
import { OpenAIStream, StreamingTextResponse } from 'ai';

// Optional, but recommended: run on the edge runtime.
// See https://vercel.com/docs/concepts/functions/edge-functions
export const runtime = 'edge';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY!,
});

export async function POST(req: Request) {
  // Extract the `messages` from the body of the request
  const { messages } = await req.json();

  // ---------- NEW CODE STARTS HERE! ----------
  // check if the conversation requires a function call to be made
  const initialResponse = await openai.chat.completions.create({
    model: "gpt-3.5-turbo-0613",
    messages,
    stream: true,
    functions,
    function_call: "auto",
  });

  const stream = OpenAIStream(initialResponse, {
    experimental_onFunctionCall: async (
      { name, arguments: args },
      createFunctionCallMessages,
    ) =&amp;gt; {
      const result = await runFunction(name, args);
      const newMessages = createFunctionCallMessages(result);
      return openai.chat.completions.create({
        model: "gpt-3.5-turbo-0613",
        stream: true,
        messages: [...messages, ...newMessages],
      });
    },
  });
  // ---------- NEW CODE ENDS HERE! ----------

  // Respond with the stream
  return new StreamingTextResponse(stream);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Paso 4: Conectar la interfaz de chat con el AI SDK&lt;/strong&gt;&lt;br&gt;
El último paso es conectar la interfaz de chat con el IA SDK de Vercel.&lt;/p&gt;

&lt;p&gt;Hemos creado un diseño simple similar a ChatGPT en el repositorio ChatHN que puedes copiar y pegar en tu aplicación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujeenvwzttsyuns1b01s.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fujeenvwzttsyuns1b01s.jpeg" alt="ChatHN" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez que todo esté listo, puedes ejecutar el siguiente comando para iniciar la aplicación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Construye una experiencia de usuario con IA con llamada de función y el AI SDK
&lt;/h2&gt;

&lt;p&gt;En resumen, la función de llamada de OpenAI proporciona una forma poderosa de integrar chatbots de IA con APIs de terceros. Al definir funciones y utilizar el SDK de OpenAI, puedes interactuar fácilmente con APIs en tiempo real.&lt;/p&gt;

&lt;p&gt;Con el ejemplo proporcionado, puedes crear un chatbot que obtenga las mejores historias de Hacker News y más. Siguiendo los pasos descritos, puedes incorporar la llamada de función en tu ruta de API y conectarla con la interfaz de chat utilizando el SDK de IA de Vercel. A través de este enfoque, tendrás un chatbot que puede interactuar sin problemas con APIs de terceros, mejorando sus capacidades y proporcionando más valor a los usuarios.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>chatgpt</category>
      <category>programming</category>
    </item>
    <item>
      <title>🤖 ¿Qué es un Modelo Grande de Lenguaje (LLM)?</title>
      <dc:creator>Emanuel Peire</dc:creator>
      <pubDate>Sat, 11 Nov 2023 20:36:02 +0000</pubDate>
      <link>https://forem.com/emapeire/que-es-un-modelo-grande-de-lenguaje-llm-21cp</link>
      <guid>https://forem.com/emapeire/que-es-un-modelo-grande-de-lenguaje-llm-21cp</guid>
      <description>&lt;p&gt;Un Modelo Grande de Lenguaje (LLM) es un tipo de inteligencia artificial que puede comprender y generar texto similar al humano basado en los patrones y la información que ha aprendido a partir de vastas cantidades de datos de texto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comprendiendo los Modelos Grandes de Lenguaje
&lt;/h2&gt;

&lt;p&gt;Los LLMs están diseñados para tomar una cadena de palabras como entrada y esforzarse por anticipar la secuencia subsiguiente con la mayor probabilidad. Esto se logra asignando valores de probabilidad a posibles secuencias sucesivas y luego optando por una.&lt;/p&gt;

&lt;p&gt;Imagina que tienes un amigo robot súper inteligente que ha leído muchos libros y sitios web. Este robot ahora puede hablar y escribir como un humano porque aprendió de toda esa lectura. Puede ayudar a responder preguntas y mantener conversaciones con las personas, entre otras tareas.&lt;/p&gt;

&lt;p&gt;Estas tareas incluyen participar en conversaciones con chatbots, traducir idiomas, generar contenido e incluso recuperación y síntesis de conocimiento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funcionan los LLMs
&lt;/h2&gt;

&lt;p&gt;Para entender cómo funcionan los LLMs, es esencial comprender su proceso de entrenamiento. El entrenamiento de un LLM implica alimentarlo con datos extensos, como libros, artículos o páginas web. Esto permite que el modelo identifique patrones y conexiones entre palabras y frases.&lt;/p&gt;

&lt;p&gt;Una vez entrenado, un LLM puede generar contenido basado en parámetros establecidos por el usuario. Por ejemplo, si alguien desea producir un artículo en el estilo de Shakespeare, proporcionarían una indicación al modelo, y el LLM generaría el resto del artículo basado en su comprensión de las obras de Shakespeare.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso para Modelos de Lenguaje Grandes
&lt;/h2&gt;

&lt;p&gt;Aquí hay algunos tipos de aplicaciones que puedes construir con LLMs, junto con algunos ejemplos de plantillas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Chatbots&lt;/strong&gt;&lt;br&gt;
Al analizar patrones de lenguaje natural, los LLMs pueden generar respuestas similares a las reacciones humanas. Esto es perfecto para empresas que buscan ofrecer servicio al cliente a través de chatbots o agentes virtuales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Recuperación y Síntesis de Conocimiento&lt;/strong&gt;&lt;br&gt;
Los LLMs también son increíblemente competentes en la síntesis de conocimiento. Por ejemplo, puedes conectar OpenAI a una API de terceros y crear una experiencia de chat impulsada por IA intuitiva que tenga acceso a conjuntos de datos poderosos. Métodos como la Generación con Recuperación Aumentada te permiten agregar un componente de recuperación de información al modelo de generación de texto en el que los LLMs ya son buenos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Generación de Contenido&lt;/strong&gt;&lt;br&gt;
Los LLMs pueden producir ensayos, artículos u otras formas de contenido que reflejen el estilo de autores o géneros específicos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Ejecución de Tareas&lt;/strong&gt;&lt;br&gt;
Utilizando las Funciones de OpenAI, puedes agregar fácilmente experiencias de usuario impulsadas por IA a tu aplicación con solo unas pocas líneas de código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Traducción&lt;/strong&gt;&lt;br&gt;
Modelos como GPT-4 pueden traducir con precisión idiomas, tanto idiomas humanos (inglés, francés, chino) como incluso lenguajes de programación (JavaScript, Python, Rust).&lt;/p&gt;

&lt;h2&gt;
  
  
  LLMs Populares
&lt;/h2&gt;

&lt;p&gt;Varios LLMs han ganado prominencia en la comunidad de IA:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1- OpenAI GPT&lt;/strong&gt;&lt;br&gt;
GPT, específicamente GPT-3.5 y GPT-4, son modelos de lenguaje grandes desarrollados por OpenAI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;GPT-3.5: El modelo más rápido y rentable de OpenAI, optimizado para fines de chat, pero también funciona bien para tareas de completado tradicionales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GPT-4: El modelo más poderoso de OpenAI que posee un amplio conocimiento general y experiencia en dominios, lo que le permite seguir instrucciones complejas en lenguaje natural y resolver problemas difíciles con precisión.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2- Anthropic Claude&lt;/strong&gt;&lt;br&gt;
Claude, específicamente claude-instant-1 y claude-2, son modelos de lenguaje grandes desarrollados por Anthropic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;claude-instant-1: Una versión más rápida y económica pero aún muy capaz de Claude, que puede manejar una variedad de tareas, incluyendo diálogos informales, análisis de texto, resumen y comprensión de documentos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;claude-2: El modelo más poderoso de Anthropic que sobresale en una amplia gama de tareas, desde diálogos sofisticados y generación de contenido creativo hasta instrucciones detalladas. Es bueno para el razonamiento complejo, la creatividad, el diálogo reflexivo, la programación y la creación de contenido detallado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3- Cohere Command Nightly&lt;/strong&gt;&lt;br&gt;
Command Nightly, específicamente command-nightly y command-light-nightly, son modelos de lenguaje grandes desarrollados por Cohere.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;command-nightly: Un modelo de conversación que sigue instrucciones de alta calidad y confiabilidad de Cohere, proporcionando un contexto más largo en comparación con modelos generativos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;command-light-nightly: Una versión más pequeña y rápida del modelo de conversación de Cohere con casi la misma capacidad pero una velocidad mejorada.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4- Modelos LLaMA 2 de Meta&lt;/strong&gt;&lt;br&gt;
LLaMA 2, específicamente llama-2–70b-chat y llama-2–70b, son modelos de lenguaje grandes desarrollados por Meta y alojados en Replicate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;llama-2–70b-chat: Un modelo de 70 mil millones de parámetros ajustado para completar diálogos. Perfecto para construir un chatbot con la mejor precisión.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;llama-2–70b: Modelo base de 70 mil millones de parámetros. Perfecto para otros tipos de completados de lenguaje, como completar la escritura de un usuario.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  El Futuro de los LLMs
&lt;/h2&gt;

&lt;p&gt;Si bien los LLMs han revolucionado el panorama de la IA, enfrentan desafíos propios. Garantizar la precisión y confiabilidad del contenido que generan es fundamental, especialmente en aplicaciones como la generación de noticias, donde la precisión es crucial. Una forma de mejorar la confiabilidad de los LLMs es conectarlos a fuentes de datos confiables, asegurando que el contenido se alinee con la identidad de marca de una empresa. También existe el Aprendizaje por Reforzamiento a partir de Comentarios Humanos (RLHF), que es un tipo de IA que aprende a tomar mejores decisiones al recibir orientación y correcciones de los humanos.&lt;/p&gt;

&lt;p&gt;En conclusión, los Modelos Grandes de Lenguaje están transformando la forma en que interactuamos con las máquinas, ofreciendo interacciones más naturales y parecidas a las humanas. A medida que la tecnología continúa evolucionando, las capacidades y aplicaciones de los LLMs están destinadas a expandirse, abriendo el camino para sistemas de IA más avanzados e intuitivos.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>chatgpt</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
