Vue Framework

Nuxt

Nuxt es el framework de Vue que añade enrutamiento basado en archivos, auto-imports, renderizado en el servidor y un motor de servidor integrado, convirtiendo una app de Vue en un proyecto full-stack.

intermediate14 min readUpdated 15 sept 2026
users.vue
vue
<!-- pages/users.vue -->
<script setup>
const { data: users, pending, error } = await useFetch("/api/users");
</script>

<template>
  <p v-if="pending">Loading…</p>
  <p v-else-if="error">Something went wrong.</p>
  <ul v-else>
    <li v-for="user in users" :key="user.id">
      {{ user.name }}
    </li>
  </ul>
</template>
Basado en
Vue 3
Router
Basado en archivos (pages/)
Servidor
Motor Nitro
Datos
useFetch, useAsyncData
Renderizado
SSR, SSG, SPA, híbrido
Imports
Automáticos

Por que importa

Por qué los desarrolladores eligen Nuxt

Todo automático

Los componentes, composables y las APIs de Vue se importan automáticamente, por lo que escribes menos código repetitivo y mantienes los archivos enfocados.

Un servidor real integrado

El motor Nitro potencia las rutas de API, el middleware de servidor y múltiples objetivos de despliegue desde la misma base de código.

Rápido por defecto

El renderizado en el servidor, el code splitting a nivel de ruta y la extracción de payload vienen configurados de fábrica.

La imagen completa

Las tres ideas detrás de Nuxt

Un router basado en el sistema de archivos, imports automáticos y el motor de servidor Nitro trabajando juntos en un solo proyecto.

El router de archivos

Enrutamiento

Los archivos en pages/ se convierten en rutas, con layouts, rutas anidadas y middleware de ruta.

Auto-imports

Ergonomía

Componentes, composables y utilidades están disponibles sin necesidad de sentencias de importación.

Nitro

Servidor

Un motor de servidor que gestiona rutas de API, renderizado y adaptadores de despliegue.

Nuxt de un vistazo

Lo que Nuxt añade a Vue

Enrutamiento basado en archivos

pages/ mapea archivos a rutas, incluyendo segmentos dinámicos y anidados.

Layouts

Comparte una estructura común entre páginas y cambia de layout según la ruta.

useFetch & useAsyncData

Obtención de datos compatible con SSR con estados de carga y error integrados.

Rutas de servidor

Escribe endpoints de API en server/api utilizando el motor Nitro.

SEO y meta

useHead y useSeoMeta gestionan títulos, descripciones y etiquetas sociales.

Módulos

Un rico ecosistema de módulos añade funcionalidades con una sola línea de configuración.

Una breve historia

De Nuxt 1 a una plataforma de Vue moderna

  1. 2016

    Nuxt 1

    Nuxt introduce el renderizado en el servidor y convenciones de enrutamiento a las aplicaciones de Vue.

    16
  2. 2018

    Nuxt 2

    Una versión estable y ampliamente adoptada con un gran ecosistema de módulos.

    18
  3. 2022

    Nuxt 3

    Una reescritura sobre Vue 3 y Vite que introduce el servidor Nitro y la Composition API.

    22
  4. 2024

    Madurez de Nuxt 3

    Mejor rendimiento, una capa de servidor unificada y soporte de primer nivel para TypeScript.

    24
  5. Hoy

    El meta-framework de Vue

    La opción predeterminada para proyectos de Vue full-stack y con mucho contenido.

    Hoy

La guia completa

Nuxt: Todo lo que necesitas saber

¿Qué es Nuxt?

Nuxt es el meta-framework de Vue. Mientras que Vue te proporciona componentes y reactividad, Nuxt añade las piezas que toda aplicación real necesita —enrutamiento, renderizado en el servidor, obtención de datos, un entorno de ejecución de servidor y un ecosistema de módulos— y las integra todas con configuraciones predeterminadas coherentes.

Es la contraparte de Next.js para Vue y sigue la misma filosofía general: utilizar el sistema de archivos para el enrutamiento, renderizar en el servidor por defecto y tratar la obtención de datos como una prioridad fundamental. Si ya conoces Vue, Nuxt se siente como un paso siguiente natural en lugar de un framework nuevo.

Enrutamiento basado en archivos

Los archivos en pages/ se convierten en rutas. Los segmentos dinámicos utilizan corchetes y las carpetas anidadas crean rutas anidadas.

pages/
├── index.vue            # /
├── about.vue            # /about
├── blog/
│   ├── index.vue        # /blog
│   └── [slug].vue       # /blog/:slug
└── dashboard/
    ├── index.vue        # /dashboard
    └── settings.vue     # /dashboard/settings
<!-- pages/blog/[slug].vue -->
<script setup>
const route = useRoute();
const { data: post } = await useFetch(`/api/posts/${route.params.slug}`);
</script>

<template>
  <article>
    <h1>{{ post.title }}</h1>
    <div v-html="post.body" />
  </article>
</template>

useRoute te proporciona la ruta actual, y NuxtLink gestiona la navegación del lado del cliente con prefetching. Los layouts en layouts/ envuelven las páginas y te permiten compartir una estructura común entre múltiples rutas.

Auto-imports

Nuxt importa automáticamente las APIs de Vue, sus propios composables, y tus componentes y composables. Así escribes menos código repetitivo y los archivos se mantienen enfocados.

<!-- components/UserCard.vue -->
<script setup>
const props = defineProps({ user: Object });
</script>

<template>
  <article class="card">
    <h3>{{ user.name }}</h3>
  </article>
</template>

Los componentes en components/ están disponibles en cualquier lugar sin necesidad de importarlos, y tus propios composables en composables/ también se importan automáticamente. El resultado es menos ceremonia y menos listas de imports que mantener.

Obtención de datos con useFetch

useFetch y useAsyncData son la forma recomendada de cargar datos. Se ejecutan durante el renderizado en el servidor, transfieren el resultado al cliente y exponen el estado de carga y de error.

<!-- pages/posts.vue -->
<script setup>
const { data: posts, pending, error } = await useFetch("/api/posts");
</script>

<template>
  <p v-if="pending">Loading…</p>
  <p v-else-if="error">Could not load posts.</p>
  <PostList v-else :posts="posts" />
</template>

Debido a que la solicitud ocurre en el servidor, el primer renderizado ya incluye los datos. Esto evita el destello de contenido vacío que ocurre al realizar la obtención de datos en onMounted, y funciona con almacenamiento en caché, revalidación y claves personalizadas para un control más preciso.

El servidor Nitro

Nuxt incluye un motor de servidor llamado Nitro. Los archivos en server/api/ se convierten en endpoints de API, y server/routes/ puede servir handlers personalizados.

// server/api/users.get.ts
export default defineEventHandler(async () => {
  const config = useRuntimeConfig();
  return $fetch("https://api.example.com/users", {
    headers: { Authorization: config.apiKey },
  });
});
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  const user = await db.user.create({ data: body });
  return { user };
});

Esto mantiene los secretos y las credenciales de terceros en el servidor. El cliente llama a tu propio endpoint y Nitro se encarga del resto. El mismo motor se despliega en Node, funciones serverless, edge runtimes y hosts estáticos a través de adaptadores.

SEO, meta y módulos

Nuxt simplifica el SEO optimizado para el servidor mediante el uso de composables.

<!-- pages/about.vue -->
<script setup>
useSeoMeta({
  title: "About us",
  description: "Who we are and what we build.",
  ogImage: "/og/about.png",
});
</script>

Los composables useHead y useSeoMeta gestionan los títulos, descripciones, URLs canónicas y etiquetas sociales, y se renderizan correctamente en el servidor para que los rastreadores puedan verlos. Más allá de esto, el ecosistema de módulos de Nuxt añade autenticación, contenido, imágenes, analíticas y más con solo una o dos líneas de configuración.

Modos de renderizado

Nuxt soporta diversas estrategias de renderizado y te permite elegir una por ruta:

  • Universal (SSR) renderiza en el servidor e hidrata en el cliente; es la opción por defecto.
  • Static (SSG) prerenderiza las páginas en el momento del build.
  • SPA renderiza completamente en el cliente, como una aplicación de Vue clásica.
  • Hybrid combina estas estrategias, permitiendo que las páginas de marketing sean estáticas mientras que un dashboard se renderice en el cliente.

También puedes habilitar la regeneración estática incremental y reglas de ruta para ajustar el almacenamiento en caché y el renderizado sin necesidad de reestructurar la aplicación.

Mejores prácticas

  • Usa useFetch y useAsyncData en lugar de realizar peticiones en onMounted.
  • Mantén los secretos y las llamadas a terceros en rutas server/api.
  • Deja que los auto-imports hagan su trabajo; no luches contra ellos con importaciones manuales.
  • Define los metadatos de SEO con useSeoMeta en cada página.
  • Elige un modo de renderizado por ruta en lugar de un único modo para todo.
  • Usa NuxtLink para la navegación interna para que el prefetching y las transiciones funcionen.
  • Organiza la lógica reutilizable en composables dentro de composables/.

Errores comunes

  • Realizar el fetch de datos en onMounted y perder el beneficio de SSR.
  • Exponer API keys al llamar a terceros directamente desde el cliente.
  • Recurrir a un store global cuando useState o un composable serían suficientes.
  • Ignorar las reglas de rutas y renderizar en exceso páginas que podrían ser estáticas.
  • Asumir que las API de los módulos de Nuxt 2 funcionan sin cambios en Nuxt 3.
  • Omitir los metadatos de SEO porque el framework hace que sea fácil olvidarlos.

Próximos pasos

Nuxt convierte Vue en una plataforma full-stack. Profundiza tus conocimientos de Vue, añade TypeScript y compara este enfoque con Next.js y SvelteKit. Después, construye una aplicación pequeña con una página, una ruta de servidor y useFetch para experimentar lo natural que encajan todas las piezas.

Obtención de datos

useFetch se ejecuta en el servidor durante el SSR e hidrata el resultado, evitando saltos visuales y la gestión manual del estado.

Preferir
<script setup>
const { data: posts } = await useFetch("/api/posts");
</script>

<template>
  <PostList :posts="posts" />
</template>
Evitar
<script setup>
const posts = ref([]);
onMounted(async () => {
  posts.value = await fetch("/api/posts")
    .then((r) => r.json());
});
</script>

Lógica de servidor

Mantén los secretos y las llamadas a terceros en el servidor Nitro, y deja que el cliente llame a tu propio endpoint.

Preferir
// server/api/users.get.ts
export default defineEventHandler(async () => {
  const key = useRuntimeConfig().apiKey;
  return $fetch("https://api.example.com/users", {
    headers: { Authorization: key },
  });
});
Evitar
// calling a third party directly
// from the client exposes the key
const data = await $fetch(
  "https://api.example.com/users",
  { headers: { Authorization: apiKey } },
);

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Nuxt?

Nuestro tutorial interactivo te guia a traves de Nuxt paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.