SEO de Nuxt
Nuxt ofrece renderizado del lado del servidor por defecto, pero eso es una configuración por ruta, no una garantía: HTML completo para los rastreadores solo en las rutas que lo mantienen. Modos de renderizado, useSeoMeta(), el kit de herramientas @nuxtjs/seo, advertencias de hidratación y Nitro, Core Web Vitals y los errores que te cuestan silenciosamente.
Idiomas
1 señal de evidencia en esta página
- Herramienta activa relacionadaCore Web Vitals History & Competitor Comparison
Nuxt renderiza páginas en el servidor por defecto, por lo que una ruta que mantiene ese valor predeterminado da a los rastreadores un documento HTML completo en lugar del caparazón vacío que envía una SPA de Vue simple, pero es una configuración por ruta: routeRules o un ssr:false global pueden cambiar cualquier ruta a CSR, así que verifica la ruta real en lugar de asumir por el nombre del framework. La decisión fundamental es el modo de renderizado por ruta: SSR (predeterminado), SSG mediante nuxt generate o reglas de ruta híbridas, porque las metaetiquetas, el esquema y los sitemaps vienen después. Usa useSeoMeta() para meta, trata el paquete @nuxtjs/seo de Harlan Wilton como un kit de herramientas de terceros opcional (no núcleo de Nuxt) para robots/sitemap/OG/schema/canonical, nunca recurras al renderizado dinámico (Google lo ha desaprobado), verifica la hidratación/payload y el comportamiento de caché/preset de despliegue de Nitro independientemente del HTML del servidor, y recuerda que los contratos de renderizado de los rastreadores de IA varían según el proveedor: SSR/SSG pone el contenido en HTML crudo y maximiza la cobertura.
TL;DR — Nuxt es el framework construido sobre Vue, y es bueno para el SEO por una razón principal: en una ruta que mantiene el valor predeterminado, construye las páginas en el servidor, por lo que los motores de búsqueda obtienen una página HTML terminada en lugar de una vacía que tendrían que completar ellos mismos. Es una configuración por ruta, no una garantía para todo el sitio —
routeRuleso unssr: falseglobal pueden convertir cualquier ruta determinada de nuevo en un caparazón vacío al estilo de Vue simple. Verifica la ruta real, no solo el nombre del proyecto. La decisión más importante que tomarás es cómo se renderiza cada ruta; todo lo demás (metaetiquetas, sitemaps) viene después.
Por qué Nuxt es bueno para el SEO — en las rutas que mantienen el valor predeterminado
Vue, por sí solo, construye una aplicación de una sola página: el servidor envía un caparazón HTML casi vacío, y JavaScript completa el contenido una vez que se ejecuta en el navegador. Eso es complicado para la búsqueda, porque la página parece vacía hasta que se ejecuta JavaScript.
Nuxt es el “meta-framework” de Vue — un conjunto de herramientas más completo construido alrededor de Vue — y su valor predeterminado soluciona ese problema. Nuxt renderiza tus páginas en el servidor primero (renderizado del lado del servidor, o SSR), por lo que cuando Google o un visitante solicita una página en una ruta que no ha desactivado el SSR, obtienen el HTML completo de inmediato. Evidence for this claim Nuxt universal rendering returns server-rendered HTML to the browser by default. Scope: Nuxt default universal rendering. Confidence: high · Verified: Nuxt: Rendering modes Sin esperar a JavaScript. Esa es la razón más importante por la que un sitio Nuxt puede ser más fácil de indexar que una aplicación Vue simple — pero es un resultado ruta por ruta, no algo que el nombre del framework garantice. Una ruta con ssr: false, o una que dependa de <ClientOnly> para su contenido principal, renuncia a esa ventaja y envía el mismo problema de caparazón vacío que tiene Vue simple.
La decisión más importante: el renderizado, por ruta
Cuando alguien solicita una página específica, ¿dónde se construye su HTML? Esa es una pregunta a nivel de routeRules, no a nivel de proyecto — una aplicación Nuxt puede mezclar modos entre rutas. Nuxt te ofrece algunas opciones:
- Renderizado del lado del servidor (SSR) — el valor predeterminado. El servidor construye la página completa en cada solicitud. Excelente para el SEO.
- Generación estática (SSG) — ejecuta
nuxt generatey Nuxt construye todas tus páginas en archivos HTML simples con antelación. También excelente para el SEO, y perfecto para blogs y documentación que no cambian cada minuto. - Modo SPA — la página se construye en el navegador, como Vue simple. Evita esto para cualquier cosa que quieras encontrar en la búsqueda.
La buena noticia es que los valores predeterminados ya apuntan en la dirección correcta. En su mayoría solo tienes que evitar desactivarlos.
Añadir títulos y metaetiquetas
En Nuxt configuras el título de tu página y la meta descripción con una función integrada llamada useSeoMeta(). Evidence for this claim Nuxt provides useSeoMeta for defining SEO and social metadata. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta La colocas en una página y pasas tu título, descripción e imagen para compartir en redes sociales:
useSeoMeta({
title: 'My Page Title',
description: 'A concise, page-specific summary with the key information first',
})Esa es la forma moderna y recomendada. (Hay una función más antigua llamada useHead() que todavía funciona y se usa para otras cosas en el <head> de la página, pero para metaetiquetas de SEO recurre a useSeoMeta().) Google no tiene un límite fijo de caracteres para la meta descripción; los fragmentos dependen de la consulta y se truncan para ajustarse al dispositivo, así que previsualiza las páginas importantes en su idioma y escritura previstos en lugar de codificar según una cuota.
El complemento opcional: los módulos SEO de Nuxt
El núcleo de Nuxt no genera un robots.txt, un sitemap XML, imágenes para compartir en redes sociales, datos estructurados ni URL principales — esas son tareas para paquetes separados y opcionales, no algo que nuxt.config.ts te dé por defecto. Un desarrollador llamado Harlan Wilton mantiene un paquete comunitario gratuito de esos paquetes — instalado como @nuxtjs/seo — que cubre todos a la vez. Es un conjunto de herramientas de terceros, no parte de Nuxt en sí, por lo que instalarlo no hace automáticamente que ninguna de esas salidas sea correcta; aún debes confirmar que el sitemap, las reglas de robots y el esquema que genera coincidan con lo que realmente quieres.
Lo que la gente entiende mal
La gente asume que “Vue/Nuxt no puede estar en Google”. Eso era más o menos cierto para las aplicaciones de Vue simple hace años — no es cierto para Nuxt con su renderizado en el servidor. Los errores reales son cosas como desactivar el SSR por accidente, o bloquear tus archivos JavaScript para que Google no pueda construir la página.
¿Quieres la versión más profunda — el menú completo de modos de renderizado, el ecosistema de módulos en detalle, Core Web Vitals y los errores comunes con sus soluciones? Cambia a la pestaña Avanzado.
TL;DR — El valor predeterminado de Nuxt es el renderizado en el servidor, por lo que una ruta que mantiene ese valor predeterminado obtiene un DOM completo en lugar del caparazón vacío que envía una SPA de Vue simple — pero eso es un resultado por ruta:
ssr: falseo una anulación derouteRulespueden convertir cualquier ruta en CSR o híbrida, así que prueba la ruta real, no el nombre del proyecto. La estrategia de renderizado es la decisión fundamental — SSR (predeterminado), SSG (nuxt generate) orouteRuleshíbridos — porque los metadatos, el esquema y los sitemaps vienen después. UsauseSeoMeta()para las etiquetas meta (useHead()para el resto del head, variantes solo de servidor cuando no necesitas reactividad), y trata el paquete@nuxtjs/seode Harlan Wilton como un kit de herramientas de terceros opcional para robots/sitemap/OG/schema/canonical — no es parte del núcleo de Nuxt, y no es prueba de que su salida sea correcta hasta que lo verifiques. Nunca uses renderizado dinámico (Google lo ha desaprobado). El renderizado de los rastreadores de IA varía según el proveedor — SSR/SSG maximiza la cobertura de HTML crudo. Más allá del HTML inicial, verifica la hidratación/payload, los ajustes preestablecidos de implementación de Nitro y el almacenamiento en caché, y el estado HTTP directo de forma independiente — el HTML del servidor por sí solo no prueba nada de eso. Las reglas habituales de SEO para JavaScript siguen aplicándose: enlaces reales<a href>, no bloquees JS/CSS, observa el HTML renderizado frente al HTML crudo.
Nuxt es la respuesta de Vue al problema de las SPA
Vue, por sí solo, envía una aplicación de una sola página: un caparazón HTML más JavaScript que construye el DOM en el navegador. Nuxt es el meta-framework sobre Vue (que se ejecuta en el motor de servidor Nitro en Nuxt 3, con Nuxt 4 siguiendo en 2025), y toda su razón de existir — desde el punto de vista del SEO — es que renderiza en el servidor por defecto. Cada página llega como un documento HTML completamente formado, que es exactamente lo que Googlebot quiere leer sin tener que ejecutar JavaScript primero. El SEO de Vue simple es un tema propio con sus propios modos de fallo; aquí asumo que has elegido Nuxt precisamente para no tener que luchar contra el problema de las SPA.
Este es el mismo punto que hago sobre JavaScript en general: “fine for search engines” (traducción) «adecuado para los motores de búsqueda»; allí incluyo expresamente a Gatsby, Next y Nuxt. Los valores predeterminados de Nuxt apuntan en la dirección correcta. La mayoría de los problemas de SEO de Nuxt son personas que desactivan esos valores predeterminados o apilan errores sobre ellos.
La estrategia de renderizado es la base — se decide por ruta, no por proyecto
Antes de las etiquetas meta, antes del esquema, antes de los sitemaps, la pregunta que decide todo es ¿cómo se produce el HTML para esta ruta específica? Nuxt documenta el renderizado universal (en el servidor) como el valor predeterminado de toda la aplicación, pero ese valor predeterminado no es una garantía a nivel de ruta: un ssr: false global cambia toda la aplicación al renderizado en el cliente, y routeRules puede asignar un modo diferente a cualquier patrón de URL. “Esto es una aplicación Nuxt” no te dice nada sobre cómo se renderiza una página en particular — tienes que comprobar la ruta. Nuxt te da cinco estrategias:
| Modo | Cómo se configura | Impacto en SEO | Mejor para |
|---|---|---|---|
| Universal / SSR | Predeterminado (ssr: true) | Excelente — HTML completo en cada solicitud | Contenido dinámico y personalizado |
| Estático / SSG | nuxt generate | Excelente — HTML construido en el momento de la implementación | Blogs, documentación, marketing |
| Híbrido | routeRules por ruta | Excelente — mezcla por ruta | Sitios grandes con contenido mixto |
| SPA / CSR | ssr: false | Pobre para contenido indexado | Paneles de control, paneles de administración |
| En el borde | Objetivo de implementación | Excelente — TTFB bajo | Rendimiento global |
La documentación oficial de Nuxt es contundente sobre por qué la renderización del lado del cliente es la elección incorrecta para el contenido: “takes more time” (traducción) «lleva más tiempo», mientras que con la renderización del servidor los “web crawlers can directly index” (traducción) «rastreadores web pueden indexar directamente» el contenido de la página. Evidence for this claim Nuxt documents that universal rendering delivers HTML content immediately and allows crawlers to index it directly. Scope: Nuxt rendering; no indexing guarantee. Confidence: high · Verified: Nuxt: Rendering modes
(Documentación de renderizado de Nuxt.) CSR
(ssr: false) está pensado para back-office, paneles y juegos, no para nada
que quieras indexar.
La renderización híbrida es la jugada maestra para sitios grandes. Las reglas de ruta en
nuxt.config.ts te permiten configurar el modo de renderizado y caché por patrón de URL:
routeRules: {
'/blog/**': { prerender: true }, // SSG for the blog
'/product/**': { swr: 3600 }, // ISR-style: regenerate hourly
'/admin/**': { ssr: false }, // SPA for the admin area
'/checkout/**': { ssr: true }, // always-fresh SSR
}swr (stale-while-revalidate) e isr (regeneración estática incremental) generan
una página estáticamente y luego la actualizan en segundo plano: ideal para comercio electrónico con muchas páginas o noticias donde una reconstrucción completa en cada cambio no es práctica. Nuxt
Islands (<NuxtIsland>) renderizan componentes sin enviar JavaScript del lado del cliente,
reduciendo el costo de hidratación y ayudando al INP, la Core Web Vital que suele ser el
problema más común en aplicaciones Nuxt.
Cómo verificar lo que realmente enviaste: Ver código fuente muestra el HTML sin procesar que el servidor envió; si tu contenido está ahí, estás renderizando en el servidor. El panel Elements de DevTools muestra el DOM renderizado. Y la herramienta URL Inspection de GSC muestra lo que Google realmente obtuvo y renderizó: la fuente de la verdad. No confíes en “se ve bien en mi navegador”.
Cómo maneja Googlebot una aplicación Nuxt
Google procesa cualquier aplicación JavaScript en tres fases: rastreo, renderizado e indexación, y el problema es el tiempo: el renderizado ocurre en una cola, no al instante. Como lo expresé en mi guía de SEO para JavaScript, el renderizador es paciente: “there is no fixed timeout for the renderer… It’s really patient, and you should not be concerned.” (traducción) «No hay un tiempo de espera fijo para el renderizador… Es realmente paciente, y no deberías preocuparte.» Pero paciente no es lo mismo que rápido para contenido fresco. Si envías una página renderizada en el cliente, tu contenido no existe para Google hasta que esa ola de renderizado se ejecute; SSR y SSG cierran esa brecha porque el HTML está completo en la primera solicitud.
Dos cosas más importan a escala. Renderizar JavaScript es costoso: de mi charla
JavaScript SEO (Ungagged) de 2019, los costos de rastreo aumentan aproximadamente 20× una vez que Google tiene que renderizar
(direccional, pero el orden de magnitud sigue siendo válido). Y Google toma la directiva
más restrictiva entre el HTML sin procesar y el renderizado, por lo que un noindex inyectado por
JavaScript ganará sobre un index en el HTML sin procesar, y viceversa. Un canonical
inyectado mediante JavaScript se respeta solo si no hay un canonical en el HTML sin procesar
ya. Mantén tus señales de robots y canonical en el HTML renderizado en el servidor, lo cual
Nuxt hace por ti cuando SSR está activado.
La realidad de los rastreadores de IA
Este es el detalle de 2026. Los rastreadores de IA (GPTBot, ClaudeBot, PerplexityBot y los demás) generalmente no ejecutan JavaScript en absoluto. Indexan el HTML sin procesar y nada más. Por lo tanto, una página Nuxt renderizada en el cliente es efectivamente invisible para los motores de respuesta de IA. SSR o SSG no solo es mejor para Google aquí; es el precio de entrada para la optimización de motores de respuesta también. Si quieres que tu contenido sea citado por ChatGPT, Perplexity o Claude, tiene que estar en el HTML en la primera solicitud.
Más allá del HTML inicial: payload, hidratación y códigos de estado
Obtener HTML del servidor con tu contenido es necesario pero no suficiente: varias cosas pueden salir mal después de esa primera respuesta, y “revisé Ver código fuente” no las cubre:
- Carga útil e hidratación. El renderizado universal envía el HTML y una carga útil de datos serializada que el cliente usa para hidratar — adjuntar los listeners de eventos y continuar donde el servidor lo dejó — sin volver a buscar. Que el HTML del servidor se vea bien no prueba que la hidratación haya tenido éxito, que la navegación del cliente reproduzca el mismo contenido, o que la carga útil no esté desactualizada. Si una página se siente bien en la primera carga pero se rompe después de un cambio de ruta en el cliente, eso es un problema de hidratación/carga útil, no un problema del modo de renderizado.
<ClientOnly>y contenido solo para el navegador. Envolver algo en<ClientOnly>— común para widgets que dependen de APIs del navegador — significa que está ausente de la respuesta del servidor incluso en una ruta por lo demás universal. Si tu contenido principal, un enlace clave o tus meta etiquetas terminan dentro de un límite solo para el cliente, los rastreadores y los bots de IA que solo leen el HTML crudo lo pasan por alto, independientemente de tu configuración del modo de renderizado. Inspecciona la respuesta real, no solo la configuración del modo de renderizado.- Los códigos de estado y las redirecciones no se autoverifican. Una página
de error de Nuxt que se renderiza en el navegador, o una redirección impulsada
por
navigateTo()/composable, no prueba por sí misma qué estado HTTP envió la respuesta directa del servidor. La guía de Google es explícita en que los códigos de estado significativos importan para el rastreo y la indexación — confirma el encabezado real concurl -I, no lo que muestra la página de error renderizada en el cliente.
Nada de esto es un argumento en contra del renderizado universal — es el recordatorio de que “el HTML está renderizado en el servidor” es la primera comprobación, no la última.
Nitro, presets de despliegue y límites de caché
La salida del servidor de Nuxt se construye con Nitro, y Nitro compila de manera diferente dependiendo del preset de despliegue que tengas como objetivo (servidor Node, Cloudflare, Vercel, Netlify, estático y otros). Eso importa para el SEO porque los presets y adaptadores pueden diferir en las APIs de runtime disponibles, el comportamiento de caché, el soporte de streaming, el despliegue regional y el acceso al sistema de archivos — una regla de ruta o un handler de servidor que funciona bajo un preset no está garantizado que se comporte de manera idéntica bajo otro. Dos consecuencias que vale la pena probar explícitamente en lugar de asumir:
- Las claves de caché y la invalidación son específicas de la ruta, no automáticas. Las reglas de ruta
swreisrcachean y regeneran la salida, pero una clave de caché incorrecta, una invalidación faltante o un encabezado de caché establecido por tu plataforma de despliegue pueden servir HTML obsoleto, personalizado o inconsistente a los rastreadores. Comprueba la antigüedad real de la respuesta y cualquier encabezadoCache-Control/Ageen una URL en vivo, no solo la configuración derouteRules. - La paridad de producción no está garantizada por el comportamiento de staging. Una ruta que se renderiza correctamente en el desarrollo local o en un despliegue de vista previa no confirma que el preset de producción produzca la misma salida — las rutas del servidor, las redirecciones y el manejo de errores viven en la capa de servidor de Nitro, y esa capa es la parte que más probablemente difiera según el objetivo. Prueba la URL de producción directamente después de cualquier cambio de despliegue, de la misma manera que verificarías el modo de renderizado.
Meta etiquetas: useSeoMeta() y useHead()
La gestión de head de Nuxt se ejecuta en Unhead, y te ofrece dos composables para diferentes trabajos.
useSeoMeta() es el que debes usar para SEO y meta etiquetas sociales. Es una API plana y
type-safe con parámetros tipados. Evidence for this claim useSeoMeta is a typed Nuxt API for SEO and social meta tags. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta Ayuda a evitar el clásico error de Open Graph
de usar name cuando necesitabas property:
useSeoMeta({
title: 'My Page Title',
ogTitle: 'My Page Title',
description: 'Concise page-specific description with the key information first',
ogDescription: 'Concise social description tailored to this page',
ogImage: 'https://mysite.com/og-image.png', // must be an absolute URL
twitterCard: 'summary_large_image',
})useHead() es la herramienta de head de propósito general para todo lo demás — scripts, etiquetas de enlace,
atributos del body y plantillas de título:
useHead({
titleTemplate: '%s · My Site Name',
htmlAttrs: { lang: 'en' },
})El patrón de capas fiable es: valores predeterminados estáticos (charset, viewport, favicon) en
nuxt.config.ts → plantilla de título para todo el sitio y valores OG globales en app.vue →
anulaciones específicas de página mediante useSeoMeta() en el componente de página. Un error común es
poner useSeoMeta() en un layout en lugar de en la página, lo que sobrescribe las etiquetas
específicas de la página con otras genéricas. Y dado que los motores de búsqueda leen la carga inicial, los metadatos SEO
normalmente no necesitan ser reactivos — useServerHead() omite la re-ejecución en el lado del cliente.
Qué API, y qué demuestra realmente:
| API | Alcance | ¿Reactiva? | Qué demuestra sobre la salida |
|---|---|---|---|
useSeoMeta() | Solo metadatos SEO/sociales planos y tipados | Sí (por defecto) | Establece propiedades tipadas correctamente — no que la ruta sea única, canónica o indexable; esa lógica sigue siendo tuya |
useHead() | Cualquier cosa en <head> — scripts, enlaces, atributos, plantilla de título | Sí (por defecto) | Control general de la cabecera; misma advertencia — el uso de la API no es prueba de una respuesta correcta del servidor |
useServerHead() / llamadas solo de servidor | Igual que arriba | No — solo servidor, omite la re-ejecución del cliente | Confirma que la etiqueta se envía una vez en el HTML del servidor; no confirma que la navegación del cliente la restablezca si dependes de ella allí |
Llamar a uno de estos composables te dice que la API se ejecutó — no te dice por sí mismo
qué emite realmente una respuesta directa del servidor o un cambio de ruta en el lado del cliente.
Confírmalo con Ver código fuente o curl, no solo con “llamé a useSeoMeta()”.
El ecosistema de módulos @nuxtjs/seo (Harlan Wilton) — opcional, no núcleo
El núcleo de Nuxt no incluye un sitemap, un robots.txt, generación de imágenes OG ni
Schema.org de serie — esos están fuera de las primitivas propias de Nuxt (useHead,
useSeoMeta, reglas de ruta, modos de renderizado). La comunidad llena ese vacío con
@nuxtjs/seo de Harlan Wilton — un paquete paraguas de terceros instalado por separado
(nuxtseo.com, actualmente en v5.x, mantenido activamente, dirigido a Nuxt
3,16+ y Nuxt 4) que agrupa seis módulos. Instalarlo te da sitemap,
robots, imagen OG y generación de esquema — no garantiza por sí mismo que la
salida sea correcta para tus rutas; verifica lo que produce de la misma manera que
verificarías cualquier otra cosa:
| Módulo | Qué hace |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + cabeceras X-Robots-Tag |
@nuxtjs/sitemap | Sitemaps XML automáticos desde páginas + rutas dinámicas |
nuxt-og-image | Imágenes OG dinámicas (una plantilla Vue → una imagen) |
nuxt-schema-org | Datos estructurados Schema.org JSON-LD |
nuxt-seo-utils | URL principales, migas de pan, valores predeterminados |
nuxt-link-checker | Detección de enlaces rotos en tiempo de compilación |
Instala todo el paquete con npx nuxt module add seo, o toma módulos individuales
(npx nuxt module add sitemap robots). Algunos comportamientos que vale la pena conocer:
@nuxtjs/sitemapse genera automáticamente desde tu directoriopages/más rutas dinámicas, se divide en un índice de sitemap automáticamente después de 50 000 URLs, admite sitemaps multilingües i18n y tiene soporte integrado de IndexNow. Una cosa a tener en cuenta: Google ignorachangefreqypriority; solo importa unlastmodpreciso, y solo cuando el contenido cambia realmente.@nuxtjs/robotsgenerarobots.txt, la metaetiqueta robots y la cabeceraX-Robots-Tag— y por defecto desautoriza a todos los rastreadores en entornos que no son de producción, que es exactamente el peligro de indexación en staging que afecta a las compilaciones headless. También te da reglas por bot, para que puedas bloquear GPTBot específicamente mientras dejas a todos los demás en paz (sé intencional — bloquea un rastreador de IA y no te citará).nuxt-seo-utilsmaneja las URL principales y, útilmente, elimina los parámetros de seguimiento (utm_*,fbclid,gclid) de esas URL automáticamente.
nuxt/image y Core Web Vitals
@nuxt/image es el módulo de imágenes: srcset responsivo automático, formatos modernos
(WebP/AVIF), optimización integrada a través de proveedores CDN y carga diferida. Dos
reglas aportan la mayor parte del valor SEO:
- Nunca hagas lazy-load de la imagen LCP. Tu imagen principal debe cargarse de forma eager; el lazy-loading retrasa tu Largest Contentful Paint.
- Siempre establece
widthyheightpara que el navegador reserve espacio y no sufras un impacto en Cumulative Layout Shift.
<NuxtImg
src="/hero.jpg"
width="1200"
height="630"
alt="Descriptive alt text"
:loading="isHeroImage ? 'eager' : 'lazy'"
format="webp"
/>Los objetivos para 2026 (p75): LCP ≤ 2,5 s, INP ≤ 200ms, CLS ≤ 0,1. En aplicaciones Nuxt, el INP es el que tiende a sufrir porque la hidratación crea retraso en la entrada — que es exactamente para lo que sirven Nuxt Islands y <NuxtIsland>.
Nuxt Content + SEO
Si estás usando @nuxt/content (el módulo de contenido markdown/MDX), la integración con @nuxtjs/seo es sencilla pero tiene un detalle de orden: carga @nuxtjs/seo antes de @nuxt/content en tu array de módulos. Luego puedes configurar el SEO en el frontmatter del contenido (title, description, robots, ogImage, schemaOrg) y extraerlo en tu plantilla [slug].vue con useSeoMeta() después de obtener el contenido. Esta es la versión nativa de Nuxt del patrón de CMS headless, y se aplica la misma disciplina de “reconstruir lo que el plugin hacía”.
Errores comunes de SEO en Nuxt
- Usar el modo SPA (
ssr: false) para contenido que quieres indexar. El error más costoso — y el que te hace invisible para los rastreadores de IA. - URLs relativas para imágenes OG.
ogImagedebe ser una URL absoluta o las vistas previas sociales se rompen. useSeoMeta()en un layout en lugar de la página — las etiquetas genéricas sobrescriben las específicas de la página.- No verificar el HTML renderizado — Ver código fuente ≠ DevTools ≠ lo que Google renderizó. Usa URL Inspection.
- Bloquear JS/CSS en
robots.txt— Google no renderizará desde archivos bloqueados. - Dejar el
noindex/disallow de staging en su lugar después del lanzamiento (o, por el contrario, olvidar que@nuxtjs/robotsbloquea lo que no es producción por defecto y preguntarte por qué producción está bien pero un entorno personalizado no). - Hacer lazy-load de la imagen LCP — hunde tu LCP.
- Faltar
width/heighten las imágenes — CLS. changefreq/priorityen sitemaps — Google los ignora; sololastmodcuenta.- Recurrir al renderizado dinámico. Google lo deprecó — “dynamic rendering is a workaround and not a long-term solution” (traducción) «el renderizado dinámico es un workaround y no una solución a largo plazo» — y solo sirve a los motores para los que lo configuras, perdiéndote Bing y todos los rastreadores de IA. Con Nuxt nunca lo necesitas: SSR y SSG ya dan a los rastreadores HTML completo.
llms.txt y AEO
llms.txt es un archivo de texto plano — primo de robots.txt — que ayuda a las herramientas de IA a navegar tu contenido. El módulo nuxt-llms genera automáticamente /llms.txt y /llms-full.txt desde Nuxt Content. A finales de 2025, sus principales consumidores son servidores MCP y herramientas de codificación con IA (Cursor, Claude Code) más que ChatGPT o Perplexity directamente, y es más útil para sitios de documentación y blogs técnicos — menos para e-commerce o noticias. Vale la pena añadirlo si eres un sitio de docs/dev; no es una prioridad en otros casos.
Dónde encaja
El SEO en Nuxt es realmente una aplicación concreta de JavaScript SEO a través de las propias convenciones de Nuxt — y se superpone en gran medida con el tema de SEO para un CMS headless cuando tu frontend de Nuxt se alimenta de un backend headless. Los principios no cambian; Nuxt solo te da buenos valores por defecto y un ecosistema de módulos sólido para implementarlos.
Resumen de IA
Una versión condensada de la versión avanzada:
- Nuxt es el meta-framework de Vue, y su ventaja SEO es un default:
renderizado del lado del servidor. Una ruta que mantiene ese default envía HTML completo,
no la cáscara vacía que envía una SPA Vue simple — pero es un resultado por ruta, no una
garantía a nivel de proyecto.
ssr: falseo una anulación derouteRulespuede cambiar cualquier ruta a CSR o híbrido, así que verifica la ruta real. - La estrategia de renderizado es la base, decidida por ruta — decide
todo antes de meta, schema o sitemaps. Modos: SSR (default), SSG
(
nuxt generate), híbrido (routeRules), SPA (ssr: false, evita para contenido indexado), edge. - Las
routeRuleshíbridas mezclan modos por URL;swr/isrregeneran en segundo plano; Nuxt Islands reducen el costo de hidratación y ayudan al INP. - Googlebot rastrea → renderiza (en cola, no instantáneo) → indexa; toma la directiva más restrictiva entre HTML crudo vs. renderizado. El renderizado es aproximadamente 20× el costo de rastreo. SSR/SSG cierran la brecha de tiempo.
- El renderizado de rastreadores de IA es específico del proveedor — CSR depende de la ejecución del cliente que no está cubierta por un contrato compartido, así que SSR/SSG maximiza la visibilidad de IA.
- Más allá del HTML de primera carga: verifica la hidratación/payload de forma independiente (el HTML del servidor
≠ prueba de hidratación exitosa o paridad de navegación del cliente), vigila
<ClientOnly>ocultando contenido de los rastreadores incluso en rutas universales, y confirma el estado HTTP/redirecciones directas concurl -Ien lugar de confiar en una página de error renderizada en el cliente. - Nitro y los presets de despliegue (Node, Cloudflare, Vercel, Netlify, estático) pueden diferir en APIs de runtime, caché, streaming y regiones — prueba las cabeceras de caché y la paridad de producción por ruta, no asumas que los presets se comportan idénticamente.
- Etiquetas meta:
useSeoMeta()para SEO/social (type-safe),useHead()para el resto del head, variantes solo de servidor cuando no se necesita reactividad. Capa:nuxt.config.ts→app.vue→ página. No pongasuseSeoMeta()en un layout. Las imágenes OG necesitan URLs absolutas. Llamar a una API prueba que la API se ejecutó, no lo que emite una respuesta directa — confirma con View Source/curl. @nuxtjs/seo(Harlan Wilton) es un kit de herramientas de terceros opcional (v5.x, mantenido activamente, Nuxt 3,16+/4.x) — no es parte del núcleo de Nuxt. Incluye robots, sitemap, imagen OG, Schema.org, canonical y verificador de enlaces, pero instalarlo no prueba por sí mismo la salida correcta. Sitemap: sololastmodimporta. Robots: bloquea no-prod por defecto; reglas de IA por bot.@nuxt/image+ CWV: nunca cargues perezosamente la imagen LCP; siempre establecewidth/height(CLS). Objetivos: LCP ≤ 2,5 s, INP ≤ 200ms, CLS ≤ 0,1.- No uses renderizado dinámico — Google lo deprecó; el SSR/SSG de Nuxt ya sirve HTML completo.
Documentación oficial
Documentación de fuentes primarias de Nuxt y los motores de búsqueda.
Nuxt
- Nuxt — Conceptos de renderizado — renderizado universal, del lado del cliente e híbrido (
routeRules), y por qué los rastreadores prefieren rutas renderizadas en el servidor. - Nuxt — SEO y Meta (primeros pasos) —
useSeoMeta(),useHead()y gestión del head. - Nuxt — composable
useSeoMeta— la referencia de API meta type-safe, incluido el uso solo de servidor. - Nuxt — Motor de servidor (Nitro) — presets de despliegue, salida multiplataforma y dónde puede divergir el comportamiento de runtime/caché.
- Nuxt — Ciclo de vida de Nuxt — renderizado del servidor, transferencia de payload e hidratación como etapas distintas.
- Nuxt Image —
<NuxtImg>, formatos responsivos y configuración del proveedor para Core Web Vitals. @nuxtjs/seoen Nuxt Modules — la entrada del catálogo de módulos: versión actual, descargas y que es un paquete instalado por separado.
- Comprende los conceptos básicos de SEO en JavaScript — el pipeline de rastreo → renderizado → indexación y los enlaces rastreables (independiente del framework; la documentación de Google no menciona Nuxt por nombre).
- Renderizado dinámico (solución alternativa obsoleta) — por qué Google lo obsoletizó y qué usar en su lugar (SSR, renderizado estático, hidratación).
Citas de la fuente
Declaraciones oficiales de Nuxt, Google y mi propio trabajo. Cada enlace de buscador / Nuxt es un enlace profundo que salta al pasaje citado en la página de origen.
Nuxt — renderizado para SEO
- “Indexing and updating the content delivered via client-side rendering takes more time.” (traducción) «Indexar y actualizar el contenido entregado mediante renderizado del lado del cliente lleva más tiempo.» — Documentación de renderizado de Nuxt. Ir a la cita
- “Web crawlers can directly index the page’s content, which makes Universal rendering a great choice for any content that you want to index quickly.” (traducción) «Los rastreadores web pueden indexar directamente el contenido de la página, lo que convierte al renderizado Universal en una excelente opción para cualquier contenido que quieras indexar rápidamente.» — Documentación de renderizado de Nuxt. Ir a la cita
Google — procesamiento de JavaScript y renderizado dinámico
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (traducción) «Google procesa las aplicaciones web JavaScript en tres fases principales: 1. Rastreo 2. Renderizado 3. Indexación.» — Documentación de Google Search Central. Ir a la cita
- “Dynamic rendering is a workaround and not a long-term solution for problems with JavaScript-generated content in search engines. Instead, we recommend that you use server-side rendering, static rendering, or hydration as a solution.” (traducción) «El renderizado dinámico es una solución alternativa y no una solución a largo plazo para los problemas con contenido generado por JavaScript en los motores de búsqueda. En su lugar, recomendamos que uses renderizado del lado del servidor, renderizado estático o hidratación como solución.» — Documentación de Google Search Central. Ir a la cita
Patrick Stox (mi propio trabajo — JavaScript SEO: Una guía definitiva)
- “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.” (traducción) «Cualquier tipo de configuración de SSR, renderizado estático y prerenderizado será adecuada para los motores de búsqueda. Gatsby, Next, Nuxt, etc., son todos excelentes.»
- “There is no fixed timeout for the renderer… It’s really patient, and you should not be concerned.” (traducción) «No hay un tiempo de espera fijo para el renderizador… Es realmente paciente, y no deberías preocuparte.»
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to.” (traducción) «JavaScript no es malo para el SEO, y no es malvado. Simplemente es diferente de lo que muchos especialistas en SEO están acostumbrados.»
Lista de verificación de SEO para Nuxt
Una revisión rápida para confirmar que un sitio Nuxt está configurado para los rastreadores de búsqueda y de IA:
- El contenido que quieres indexar se renderiza en el servidor o en tiempo de compilación (SSR o SSG), no en modo SPA (
ssr: false). - Confirmado mediante Ver código fuente que el contenido importante está en el HTML sin procesar, y mediante Inspección de URLs que Google lo renderiza.
-
useSeoMeta()está en componentes de página, no en un diseño compartido que sobrescribe las etiquetas de la página. -
ogImageusa una URL absoluta (no relativa). - Una plantilla de título se establece una vez en
app.vue; los títulos/descripciones por página son únicos. -
@nuxtjs/sitemapestá generando un sitemap XML;lastmodes preciso y no dependes dechangefreq/priority. -
@nuxtjs/robotsestá configurado; el bloqueo automático fuera de producción no se aplica accidentalmente a producción. -
robots.txtno bloquea tu JS/CSS. - Los canónicos son absolutos y por página (
nuxt-seo-utils). - La imagen LCP se carga de forma eager (no lazy); todas las imágenes tienen
width/height(CLS). - Enlaces reales
<a href>/<NuxtLink>para la navegación — sin enrutamiento con<div @click>. - Si usas
@nuxt/content,@nuxtjs/seose carga antes que él en el array de módulos. - El renderizado dinámico no está en uso en ningún lugar.
Los modelos mentales
1. La estrategia de renderizado es lo primero. Las metaetiquetas, el esquema y los sitemaps dependen de una decisión: cómo se produce el HTML. Responde “¿este contenido se renderiza en el servidor, se genera estáticamente o se renderiza en el cliente?” antes de depurar cualquier otra cosa.
2. SSR es el predeterminado: tu trabajo es principalmente no romperlo.
Nuxt apunta los valores predeterminados en la dirección correcta. La mayoría de los fallos de SEO en Nuxt son alguien que establece ssr: false, bloquea JS/CSS o inyecta señales mediante JavaScript que entran en conflicto con el HTML sin procesar.
3. Elige el modo de renderizado según el tipo de contenido.
- Mayormente estático (blog, documentación, marketing) → SSG (
prerender: true). - Siempre fresco / dinámico → SSR.
- Contenido por horas/días que quiere velocidad estática →
swr/isr. - Detrás de un inicio de sesión, no indexado → SPA (
ssr: false) está bien. - Contenido público que quieres posicionar o citar por IA → nunca SPA.
4. HTML primero, JS segundo para cada señal. El contenido, las metaetiquetas, el canónico, las directivas de robots y los enlaces pertenecen al HTML renderizado en el servidor. Google toma la directiva más restrictiva entre el HTML sin procesar y el renderizado; los rastreadores de IA solo ven el HTML sin procesar. El SEO inyectado con JS es un plan de respaldo, no el plan.
5. Usa los módulos, pero entiende qué hacen.
@nuxtjs/seo ahorra trabajo, pero el bloqueo automático de robots fuera de producción, la realidad del sitemap solo con lastmod y los canónicos con URL absoluta siguen siendo tu responsabilidad para hacerlos bien.
Nuxt SEO — hoja de referencia
Modos de renderizado
| Modo | Config | SEO | Mejor para |
|---|---|---|---|
| Universal / SSR | ssr: true (predeterminado) | ✅ Mejor | Dinámico / personalizado |
| Estático / SSG | nuxt generate | ✅ Mejor | Blogs, documentación, marketing |
| Híbrido | routeRules | ✅ Mejor | Sitios grandes con contenido mixto |
| SPA / CSR | ssr: false | ⚠️ Pobre para indexación | Paneles, administración |
| Edge-side | Destino de despliegue | ✅ TTFB bajo | Rendimiento global |
Composables
| Uso | Recurre a |
|---|---|
| SEO + metaetiquetas sociales | useSeoMeta() (con seguridad de tipos) |
| Plantillas de título, scripts, etiquetas de enlace, atributos html | useHead() |
| Omitir la re-ejecución en el cliente para meta estática | useServerHead() |
Módulos de @nuxtjs/seo
| Módulo | Función |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-Tag (bloquea fuera de producción por defecto) |
@nuxtjs/sitemap | Sitemap XML (solo lastmod importa; índice automático más allá de 50k URLs) |
nuxt-og-image | Imágenes OG dinámicas |
nuxt-schema-org | Datos estructurados JSON-LD |
nuxt-seo-utils | URL principales (elimina utm_*/fbclid/gclid), migas de pan |
nuxt-link-checker | Enlaces rotos en tiempo de compilación |
Reglas rápidas
- Instala todo:
npx nuxt module add seo. - Imágenes OG: solo URLs absolutas.
- Imagen LCP:
loading="eager"; todas las imágenes necesitanwidth/height(CLS). - Objetivos CWV: LCP ≤ 2,5 s, INP ≤ 200ms, CLS ≤ 0,1.
- Nunca bloquees JS/CSS en robots.txt.
- Renderizado dinámico: obsoleto — el SSR/SSG de Nuxt lo reemplaza.
- Rastreadores de IA: sin JavaScript → el contenido SPA es invisible para ellos.
Ve lo que una página de Nuxt realmente envía
Toda la cuestión del SEO en Nuxt se reduce a una comprobación: ¿está tu contenido en el HTML crudo que envía el servidor, o solo después de que se ejecute JavaScript? Si está en el HTML crudo, estás renderizando en el servidor y los rastreadores (y los bots de IA) pueden leerlo.
Obtén el HTML crudo y busca tu contenido
macOS / Linux:
# Raw HTML as the server sends it — before any client JS runs
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your headline actually in the server HTML? (empty = client-rendered)
grep -o "Your headline text" raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"Si tu texto aparece en el navegador pero falta en raw.html, la página está renderizada en el cliente — cambia la ruta a SSR o pre-renderízala. (Un curl simple no puede ejecutar JS; para el DOM renderizado usa URL Inspection o un rastreador headless-Chrome.)
Confirma que no estás bloqueando JS/CSS
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_nuxt|_ipx|assets)"Un Disallow que coincida con /_nuxt/ (la salida de compilación de Nuxt) o /_ipx/ (el optimizador de @nuxt/image) romperá el renderizado — casi siempre es un error.
Fragmento de configuración estática (nuxt.config.ts)
export default defineNuxtConfig({
modules: ['@nuxtjs/seo'], // robots, sitemap, og-image, schema-org, utils
site: { url: 'https://mysite.com' }, // required for absolute canonicals + sitemap
routeRules: {
'/blog/**': { prerender: true }, // SSG for content
'/admin/**': { ssr: false }, // SPA for the dashboard (won't be indexed)
},
}) Herramientas para el SEO en Nuxt
- URL Inspection (Inspección de URLs) (Google Search Console) — la fuente de verdad. Ejecuta una prueba en vivo y revisa el HTML renderizado, la captura de pantalla y los recursos de la página para confirmar que tu contenido de Nuxt se renderizó realmente y que nada está bloqueado.
@nuxtjs/seo/ nuxtseo.com — el paquete de módulos de Harlan Wilton; el panel de herramientas de desarrollo muestra tus robots, sitemap, schema e imágenes OG generados en desarrollo.- Nuxt DevTools — inspecciona las etiquetas head, las reglas de ruta y qué modo de renderizado usa cada ruta.
- Rich Results Test — confirma que el JSON-LD de
nuxt-schema-orgestá presente en la salida renderizada después de cualquier cambio de renderizado. - Ahrefs Site Audit / Screaming Frog (modo de renderizado JS) — rastrea con renderizado JS activado y desactivado para comparar el HTML crudo vs. el renderizado en toda la aplicación Nuxt y detectar brechas de CSR.
- Lighthouse / PageSpeed Insights — Core Web Vitals (LCP, INP, CLS) para el trabajo con
@nuxt/imagey Nuxt Islands. - Bing Webmaster Tools — la vista de rastreo/índice de Bing y dónde aparecen los envíos de IndexNow.
Errores de SEO en Nuxt que debes evitar
Errores concretos que aparecen repetidamente en sitios Nuxt reales — prevén estos antes de que se publiquen, en lugar de diagnosticarlos después de que el tráfico caiga.
Cambiar ssr: false en contenido que quieres indexar
El error de SEO en Nuxt más costoso. El modo SPA envía el mismo problema de caparazón vacío que tiene el Vue simple — los motores de búsqueda tienen que esperar a que una cola de renderizado complete el contenido. Los contratos de renderizado de los rastreadores de IA varían según el proveedor, por lo que un rastreador que obtiene solo el HTML inicial se perderá el contenido de la página.
Por qué está mal: estás renunciando voluntariamente al único valor predeterminado (SSR) que hace que Nuxt sea más fácil de indexar que el Vue simple.
Qué hacer en su lugar: deja ssr: true (el valor predeterminado) para cualquier cosa pública e indexable. Reserva ssr: false para superficies genuinamente no indexadas — paneles de administración con inicio de sesión — mediante routeRules, no con un cambio global de configuración.
Poner useSeoMeta() en un layout compartido
Configurar el título/la descripción dentro de un componente de diseño parece eficiente — un solo lugar,
aplica en todas partes — pero significa que cada página que usa ese diseño obtiene las mismas
etiquetas genéricas, y las llamadas a useSeoMeta() a nivel de página pueden sobrescribirse dependiendo del
orden de renderizado.
Por qué está mal: los títulos y descripciones únicos y específicos de la página son señales básicas de relevancia; un valor predeterminado a nivel de diseño los colapsa todos en una sola cadena.
Qué hacer en su lugar: establece los valores de respaldo globales una vez en app.vue (plantilla de título, valores
predeterminados de OG), luego llama a useSeoMeta() dentro de cada componente de página con el título y la descripción
reales de esa página.
Enviar una URL de ogImage relativa
ogImage: '/social.png' se ve bien en el navegador y falla por completo cuando
Facebook, LinkedIn o X intentan obtenerla, porque los rastreadores sociales no resuelven
las rutas relativas contra tu sitio.
Por qué está mal: las plataformas sociales necesitan una URL absoluta para obtener la imagen; una ruta relativa no se resuelve desde su lado.
Qué hacer en su lugar: siempre pasa una URL completa https:// y establece site.url en
nuxt.config.ts para que los módulos de @nuxtjs/seo puedan construir URLs absolutas por ti
automáticamente.
Recurrir al renderizado dinámico
Servir una instantánea prerenderizada a bots conocidos y la SPA a todos los demás era una solución legítima hace años. Google lo ha señalado directamente desde entonces: “dynamic rendering is a workaround and not a long-term solution.” (traducción) «el renderizado dinámico es una solución temporal y no una solución a largo plazo».
Por qué está mal: solo sirve a los bots que configuras, se pierde todo lo demás (Bing, la mayoría de los rastreadores de IA) y añade infraestructura real que mantener — para un problema que el propio SSR/SSG de Nuxt ya resuelve.
Qué hacer en su lugar: usa SSR o nuxt generate y omite el renderizado dinámico
por completo. No hay ningún escenario donde un sitio de Nuxt lo necesite.
Bloquear /_nuxt/ o /_ipx/ en robots.txt
Un Disallow: /assets/ general o una regla de robots demasiado entusiasta puede atrapar accidentalmente
el directorio de salida de compilación de Nuxt (/_nuxt/) o la ruta del optimizador de @nuxt/image
(/_ipx/).
Por qué está mal: si Googlebot no puede obtener el JS/CSS que construye la página, no puede confirmar que tu salida SSR es lo que parece — y cualquier mejora del lado del cliente deja de renderizarse silenciosamente para él.
Qué hacer en su lugar: nunca prohíbas las rutas de salida de compilación o del optimizador de imágenes. Comprueba
robots.txt después de cada despliegue que toque el enrutamiento o la configuración de módulos, no solo una vez
al inicio.
Dejar el bloque de robots de no producción activo después del lanzamiento
@nuxtjs/robots prohíbe todos los rastreadores en entornos de no producción por defecto —
una buena red de seguridad para el staging, pero lee variables de entorno para decidir, y un
NODE_ENV mal configurado o un ajuste de despliegue de vista previa puede hacer que se active en producción
también.
Por qué está mal: el sitio se ve completamente bien en un navegador mientras robots.txt
prohíbe silenciosamente todo, y nada se indexa hasta que alguien lo nota.
Qué hacer en su lugar: después de cualquier despliegue o cambio de entorno, obtén
https://yoursite.com/robots.txt directamente y confirma que no es un Disallow: /
general.
KPIs continuos para el SEO de Nuxt
Los números continuos a seguir una vez que tu configuración de renderizado es correcta — no comprobaciones de una sola vez, sino señales recurrentes que detectan regresiones a medida que la aplicación cambia.
Core Web Vitals (LCP, INP, CLS)
Qué te dice: si los visitantes reales obtienen una página rápida y estable — afectado directamente por el costo de hidratación de Nuxt Islands (INP) y las elecciones de carga de imágenes (LCP, CLS).
Cómo obtenerlo: datos de campo del Chrome UX Report a través de /tools/crux-tracker/ o /tools/cwv-checker/; datos de laboratorio de Lighthouse para comprobaciones previas al lanzamiento.
Referencia / rango realista: los umbrales “buenos” publicados por Google son LCP ≤ 2,5 s, INP ≤ 200ms, CLS ≤ 0,1 en el percentil 75 — esas son las líneas de aprobado/reprobado que CrUX mismo usa, no un número que yo invento. Dónde te sitúas dentro de “bueno” depende en gran medida del peso de tus imágenes y de cuánto hidratas.
Cadencia: los datos de campo de CrUX se actualizan en una ventana móvil de 28 días — comprueba mensualmente, e inmediatamente después de cualquier cambio en imágenes, fuentes o hidratación.
Paridad entre HTML renderizado y HTML crudo
Qué te indica: si el contenido que los motores de búsqueda y los rastreadores de IA pueden ver realmente (el HTML crudo) coincide con lo que un visitante ve en el navegador (el DOM renderizado), el riesgo principal de SEO en Nuxt si ssr se cambia o una ruta retrocede a CSR.
Cómo obtenerlo: /tools/render-gap/ compara el HTML crudo con el renderizado para una URL; para la vista autoritativa del lado de Google, usa la Inspección de URLs de GSC → “Ver página rastreada”.
Referencia / rango realista: esto es una comprobación binaria, no un rango: tu contenido clave (titular, texto del cuerpo, enlaces internos) debería estar presente en el HTML crudo, sin más. Cualquier discrepancia en una página que quieras indexar o citar es una regresión que hay que corregir, no un número que tolerar.
Cadencia: después de cada despliegue que toque routeRules, diseños o la configuración de ssr; revisa plantillas clave mensualmente en caso contrario.
Cobertura de indexación (informe de indexación de páginas)
Qué te indica: cuántas de tus URLs enviadas ha indexado Google realmente y por qué el resto fueron excluidas (duplicadas, rastreadas pero no indexadas, bloqueadas, etc.), la señal posterior que los problemas de renderizado acaban manifestando.
Cómo obtenerlo: Search Console → informe de indexación de páginas, filtrado a los patrones de URL de tu sitio Nuxt.
Referencia / rango realista: no hay un porcentaje saludable universal: depende de cuántas URLs casi duplicadas o de contenido escaso genere tu estructura de rutas. Observa la tendencia y las razones de exclusión, no un número objetivo.
Cadencia: semanalmente durante y después de una migración de modo de renderizado; mensualmente en caso contrario.
Acceso de rastreadores de IA
Qué te indica: si GPTBot, ClaudeBot, PerplexityBot y rastreadores de IA similares pueden acceder realmente a tus páginas, de forma separada de Google, ya que estos bots generalmente no ejecutan JavaScript y leen solo el HTML crudo que tu robots.txt les permite alcanzar.
Cómo obtenerlo: /tools/ai-crawler-checker/ para confirmar que ningún agente de usuario de IA está desautorizado; registros del servidor para confirmar que los bots están solicitando páginas realmente, no solo que se les permite.
Referencia / rango realista: no hay una referencia de tasa de citación que pueda darte honestamente: la frecuencia con la que un motor de respuestas de IA te cita depende del espacio de consultas y la competencia, no de algo que la configuración de Nuxt controle directamente. Rastrea el acceso (permitido vs. bloqueado), no un porcentaje de citación inventado.
Cadencia: después de cada cambio en robots.txt o en la configuración de @nuxtjs/robots; revisa los registros mensualmente en caso contrario.
Ponte a prueba: SEO en Nuxt
Cinco preguntas rápidas sobre cómo optimizar un sitio Nuxt para búsqueda. Elige una respuesta para cada una y luego comprueba.
Recursos que valen tu tiempo
Mis escritos relacionados
- JavaScript SEO: A Definitive Guide — mi guía completa sobre renderizado, paridad del DOM, la regla de la directiva más restrictiva y por qué SSR/estático/prerender (incluido Nuxt) son todos adecuados para búsqueda.
- The Beginner’s Guide to Technical SEO — dónde encajan el renderizado y el rastreo en el panorama general.
Mis charlas
- JavaScript SEO — Ungagged 2019 (SlideShare) — el Chromium evergreen de Googlebot, el costo de rastreo de renderizado de aproximadamente 20×, la API de History sobre el enrutamiento por hash y cómo Google maneja las canónicas inyectadas con JavaScript. (Descargo de responsabilidad permanente: el consejo de renderizado dinámico en esa presentación ahora está desactualizado — Google lo ha desaprobado).
Del sector
- Nuxt — Conceptos de renderizado (oficial) — renderizado universal frente a renderizado del lado del cliente y por qué los rastreadores prefieren SSR.
- Nuxt — SEO y metadatos (oficial) —
useSeoMeta()yuseHead(), la referencia de inicio. - Aprende SEO con Nuxt (Harlan Wilton / nuxtseo.com) — la guía de SEO para Nuxt más completa y centrada en desarrolladores, mantenida al día.
- harlan-zw/nuxt-seo (GitHub) — el código fuente del paquete de módulos
@nuxtjs/seo. - Nuxt Image (oficial) —
<NuxtImg>y optimización de Core Web Vitals. - Optimiza el rendimiento de Nuxt (DebugBear) — un recorrido práctico de las correcciones de Core Web Vitals en Nuxt.
- Modos de renderizado de Nuxt 3 (RisingStack) — una comparación técnica de SSR, SSG y renderizado híbrido.
- r/TechSEO — la comunidad para depurar renderizado e indexación.
Vídeos
- Google Search Central (YouTube) — la serie JavaScript SEO de Martin Splitt es el mejor recorrido oficial de cómo Google rastrea, renderiza e indexa aplicaciones JS; es independiente del framework, pero se aplica directamente a Nuxt. Canal
Registro de cambios
Actualizado el 22 ago 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.
Actualizado el 27 jul 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.
Actualizado el 18 jul 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.