nuxt logo

Traducción de Documentación (No Oficial)

Nuxt.js
Version:v3.17

Ciclo de Vida de Nuxt

Comprender el ciclo de vida de las aplicaciones Nuxt puede ayudarte a obtener una comprensión más profunda de cómo opera el framework, especialmente tanto para el renderizado del lado del servidor como del lado del cliente.

El objetivo de este capítulo es proporcionar una visión general de alto nivel de las diferentes partes del framework, su orden de ejecución y cómo trabajan juntas.

Servidor

En el servidor, se ejecutan los siguientes pasos para cada solicitud inicial a tu aplicación:

Paso 1: Configurar el Servidor Nitro y los Plugins de Nitro (Una vez)

Nuxt está impulsado por Nitro, un motor de servidor moderno.

Cuando Nitro se inicia, inicializa y ejecuta los plugins en el directorio /server/plugins. Estos plugins pueden:

  • Capturar y manejar errores a nivel de aplicación.
  • Registrar hooks que se ejecutan cuando Nitro se apaga.
  • Registrar hooks para eventos del ciclo de vida de las solicitudes, como modificar respuestas.

Los plugins de Nitro se ejecutan solo una vez cuando el servidor se inicia. En un entorno sin servidor, el servidor se inicia con cada solicitud entrante, al igual que los plugins de Nitro. Sin embargo, no se esperan.

Ver también guide > directory-structure > server#server-plugins

Paso 2: Middleware del Servidor Nitro

Después de inicializar el servidor Nitro, el middleware en server/middleware/ se ejecuta para cada solicitud. El middleware puede usarse para tareas como autenticación, registro o transformación de solicitudes.

Devolver un valor desde el middleware terminará la solicitud y enviará el valor devuelto como respuesta. ¡Este comportamiento generalmente debe evitarse para asegurar un manejo adecuado de las solicitudes!

Ver también guide > directory-structure > server#server-middleware

Paso 3: Inicializar Nuxt y Ejecutar Plugins de la Aplicación Nuxt

Primero se crean las instancias de Vue y Nuxt. Luego, Nuxt ejecuta sus plugins del servidor. Esto incluye:

  • Plugins integrados, como Vue Router y unhead.
  • Plugins personalizados ubicados en el directorio plugins/, incluidos aquellos sin sufijo (por ejemplo, myPlugin.ts) y aquellos con el sufijo .server (por ejemplo, myServerPlugin.server.ts).

Los plugins se ejecutan en un orden específico y pueden tener dependencias entre sí. Para más detalles, incluido el orden de ejecución y el paralelismo, consulta la documentación de Plugins.

Después de este paso, Nuxt llama al hook app:created, que puede usarse para ejecutar lógica adicional.

Ver también guide > directory-structure > plugins

Paso 4: Validación de Rutas

Después de inicializar los plugins y antes de ejecutar el middleware, Nuxt llama al método validate si está definido en la función definePageMeta. El método validate, que puede ser sincrónico o asincrónico, se usa a menudo para validar parámetros de rutas dinámicas.

  • La función validate debe devolver true si los parámetros son válidos.
  • Si la validación falla, debe devolver false o un objeto que contenga un statusCode y/o statusMessage para terminar la solicitud.

Para más información, consulta la documentación de Validación de Rutas.

Ver también getting-started > routing#route-validation

Paso 5: Ejecutar Middleware de la Aplicación Nuxt

El middleware te permite ejecutar código antes de navegar a una ruta particular. A menudo se usa para tareas como autenticación, redirección o registro.

En Nuxt, hay tres tipos de middleware:

  • Middleware de ruta global
  • Middleware de ruta nombrado
  • Middleware de ruta anónimo (o en línea)

Nuxt ejecuta automáticamente el middleware global la primera vez que se ingresa a la aplicación y cada vez antes de la navegación de rutas. El middleware nombrado y anónimo se ejecuta solo en las rutas especificadas en la propiedad middleware del meta de la página (ruta) definido en los componentes de página correspondientes.

Para detalles sobre cada tipo y ejemplos, consulta la documentación de Middleware.

Cualquier redirección en el servidor resultará en un encabezado Location: siendo enviado al navegador; el navegador luego hace una nueva solicitud a esta nueva ubicación. Todo el estado de la aplicación se restablecerá cuando esto suceda, a menos que se persista en una cookie.

Ver también guide > directory-structure > middleware

Paso 6: Renderizar Página y Componentes

Nuxt renderiza la página y sus componentes y obtiene cualquier dato requerido con useFetch y useAsyncData durante este paso. Dado que no hay actualizaciones dinámicas y no ocurren operaciones DOM en el servidor, los hooks del ciclo de vida de Vue como onBeforeMount, onMounted y hooks posteriores NO se ejecutan durante SSR.

Por defecto, Vue pausa el seguimiento de dependencias durante SSR para un mejor rendimiento.

No hay reactividad en el lado del servidor porque Vue SSR renderiza la aplicación de arriba hacia abajo como HTML estático, lo que hace imposible retroceder y modificar el contenido que ya se ha renderizado.

Debes evitar el código que produce efectos secundarios que necesitan limpieza en el ámbito raíz de <script setup>. Un ejemplo de tales efectos secundarios es configurar temporizadores con setInterval. En el código solo del lado del cliente podemos configurar un temporizador y luego desmontarlo en onBeforeUnmount o onUnmounted. Sin embargo, debido a que los hooks de desmontaje nunca se llamarán durante SSR, los temporizadores permanecerán para siempre. Para evitar esto, mueve tu código de efectos secundarios a onMounted.

Mira un video de Daniel Roe explicando el Renderizado del Servidor y el Estado Global.

Paso 7: Generar Salida HTML

Después de que se obtienen todos los datos requeridos y se renderizan los componentes, Nuxt combina los componentes renderizados con configuraciones de unhead para generar un documento HTML completo. Este HTML, junto con los datos asociados, se envía de vuelta al cliente para completar el proceso SSR.

Después de renderizar la aplicación Vue a HTML, Nuxt llama al hook app:rendered.

Antes de finalizar y enviar el HTML, Nitro llamará al hook render:html. Este hook te permite manipular el HTML generado, como inyectar scripts adicionales o modificar etiquetas meta.

Cliente (navegador)

Esta parte del ciclo de vida se ejecuta completamente en el navegador, sin importar qué modo de Nuxt hayas elegido.

Paso 1: Inicializar Nuxt y Ejecutar Plugins de la Aplicación Nuxt

Este paso es similar a la ejecución del lado del servidor e incluye tanto plugins integrados como personalizados.

Los plugins personalizados en el directorio plugins/, como aquellos sin sufijo (por ejemplo, myPlugin.ts) y con el sufijo .client (por ejemplo, myClientPlugin.client.ts), se ejecutan en el lado del cliente.

Después de este paso, Nuxt llama al hook app:created, que puede usarse para ejecutar lógica adicional.

Ver también guide > directory-structure > plugins

Paso 2: Validación de Rutas

Este paso es el mismo que la ejecución del lado del servidor e incluye el método validate si está definido en la función definePageMeta.

Paso 3: Ejecutar Middleware de la Aplicación Nuxt

El middleware de Nuxt se ejecuta tanto en el servidor como en el cliente. Si deseas que cierto código se ejecute en entornos específicos, considera dividirlo usando import.meta.client para el cliente y import.meta.server para el servidor.

Ver también guide > directory-structure > middleware#when-middleware-runs

Paso 4: Montar la Aplicación Vue e Hidratación

Llamar a app.mount('#__nuxt') monta la aplicación Vue en el DOM. Si la aplicación usa el modo SSR o SSG, Vue realiza un paso de hidratación para hacer que la aplicación del lado del cliente sea interactiva. Durante la hidratación, Vue recrea la aplicación (excluyendo Componentes del Servidor), empareja cada componente con sus nodos DOM correspondientes y adjunta los escuchadores de eventos DOM.

Para asegurar una hidratación adecuada, es importante mantener la consistencia entre los datos en el servidor y el cliente. Para solicitudes de API, se recomienda usar useAsyncData, useFetch u otros composables compatibles con SSR. Estos métodos aseguran que los datos obtenidos en el lado del servidor se reutilicen durante la hidratación, evitando solicitudes repetidas. Cualquier nueva solicitud solo debe activarse después de la hidratación, evitando errores de hidratación.

Antes de montar la aplicación Vue, Nuxt llama al hook app:beforeMount.

Después de montar la aplicación Vue, Nuxt llama al hook app:mounted.

Paso 5: Ciclo de Vida de Vue

A diferencia del servidor, el navegador ejecuta el ciclo de vida completo de Vue.