Frameworks JavaScript del lado del cliente para SEO

React, Vue, Angular, Svelte y SolidJS comparten un problema de SEO: el renderizado del lado del cliente envía un shell vacío, y un patrón de solución: gestión del head más una estrategia de renderizado.

Publicado por primera vez: 26 jun 2026 · Última actualización: 8 ago 2026 · Avanzado
Idiomas

React, Vue, Angular, Svelte y SolidJS son bibliotecas de UI que, de forma predeterminada, envían un shell HTML casi vacío y construyen la página en el navegador (renderizado del lado del cliente). Eso significa que los rastreadores reciben una página en blanco hasta que se ejecuta JavaScript: Google puede renderizarla, pero en una cola retrasada, y otros rastreadores (Bing y los bots de IA) son mucho menos fiables. La solución es la misma para los cinco: (1) un paquete de gestión del head para que existan metaetiquetas por ruta y (2) una estrategia de renderizado: prerenderizado, SSR o migración al meta-framework correspondiente. Este hub explica el problema y la solución compartidos y después enlaza con los análisis detallados de cada framework.

TL;DR — React, Vue, Angular, Svelte y SolidJS son bibliotecas de UI que usan renderizado del lado del cliente de forma predeterminada: envían un shell HTML casi vacío y construyen el DOM en el navegador. El problema de SEO es idéntico en los cinco casos: los rastreadores reciben un shell vacío y el contenido solo existe después de que se ejecuta JS. Google renderiza estas aplicaciones, pero con un proceso retrasado y en cola; Bing y los rastreadores de IA son mucho menos fiables. La solución también es idéntica: (1) gestión del head (un paquete por ruta para <title> y las metaetiquetas) y (2) una estrategia de renderizado (prerenderizado, SSR o migración al meta-framework correspondiente). Las diferencias entre frameworks son principalmente qué paquete y qué estrategia usar; cada análisis detallado se ocupa de ellas a continuación.

Son bibliotecas, no frameworks completos — y esa es la raíz del problema

La arquitectura de cada framework varía, así que el renderizado en el cliente no es un fallo automático de indexación. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: MDN: Client-side frameworks El renderizado en el servidor o el prerenderizado reduce la dependencia de que el JavaScript se ejecute en el rastreador, sin garantizar la indexación. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics

React, Vue, Angular, Svelte y SolidJS son principalmente bibliotecas de renderizado de UI. Su función es convertir tus datos en un DOM y mantenerlo sincronizado a medida que cambia el estado. De forma predeterminada, ese DOM se construye en el navegador: eso es exactamente lo que hace que se sientan rápidas y parecidas a una aplicación, y exactamente lo que crea el problema de SEO.

Una compilación predeterminada envía un shell HTML con un nodo de montaje vacío (<div id="root">, <div id="app">, <app-root>) y un paquete de JavaScript. Todo lo que le importa a un motor de búsqueda —títulos, texto principal, enlaces internos y datos estructurados— lo inyecta ese paquete después de descargarse y ejecutarse. Antes de que se ejecute JS, no hay nada.

Esto es el renderizado del lado del cliente: el comportamiento de serie de las bibliotecas sin meta-framework ni paso de prerenderizado durante la compilación. No es un error; es el punto de partida predeterminado. Pero «predeterminado» no significa «permanente» ni «universal»: cambia según la versión y el CLI o starter que hayas usado, y dos rutas de la misma aplicación pueden acabar con modos de renderizado distintos según cómo se haya construido cada una (una página de marketing prerenderizada y un panel dejado como CSR puro). No des por sentado el comportamiento de un framework por su nombre: comprueba qué entrega realmente una ruta concreta en una compilación concreta.

El problema compartido: un shell vacío

Google explica explícitamente que procesa las aplicaciones JS en fases —rastreo, renderizado e indexación— y que “without rendering Google might not see that content.” (traducción) «sin renderizado, Google podría no ver ese contenido». En una aplicación CSR, todo el contenido está detrás de ese paso de renderizado. De ahí se desprenden tres consecuencias:

  • El renderizado se retrasa y la espera no es fija. El renderizado es un paso independiente que se pone en cola después del rastreo. Google documenta el rastreo, el renderizado y la indexación como tres fases distintas, pero no se compromete con un tiempo de espera universal para todas las páginas. El retraso varía según la URL y los recursos de Google disponibles en ese momento; tu contenido no existe para la indexación hasta que se completa el renderizado, tarde lo que tarde en esa página.
  • Los rastreadores que no son de Google no están garantizados. Bing renderiza JavaScript de forma irregular y la mayoría de los rastreadores de IA (los bots que obtienen páginas para los LLM y la búsqueda con IA) ejecutan poco JavaScript o nada. Son empresas distintas con infraestructuras distintas, así que nada de esto se puede generalizar a partir de la documentación de Google: verifica el comportamiento actual de cada proveedor en lugar de suponer que coincide con el de Google o con la prueba del año pasado. Un sitio que solo usa CSR corre el riesgo de ser casi invisible para los rastreadores que no renderizan, y los rastreadores de IA representan una proporción creciente del tráfico.
  • Faltan metadatos por página. Un solo archivo HTML implica un solo <title> y una sola meta description para todas las rutas, a menos que gestiones activamente el head por ruta.

La solución compartida, parte 1: gestión del head

Como una SPA tiene un único documento HTML, necesitas código que actualice el head del documento cuando el usuario (y el renderizador del rastreador) se desplaza entre rutas. Todos los frameworks tienen un paquete canónico o una API incorporada para esto:

  • Reactreact-helmet-async (o la API de metadatos del framework si has migrado a Next.js).
  • Vue@unhead/vue (el motor de las utilidades de SEO de Nuxt).
  • Angular → los servicios incorporados Title y Meta de @angular/platform-browser: no necesitas ninguna dependencia adicional.
  • Svelte → el elemento incorporado <svelte:head>.
  • SolidJS@solidjs/meta (y SolidStart para la ruta SSR).

La gestión del head te proporciona metaetiquetas correctas y únicas, pero por sí sola no resuelve el problema del shell vacío. Las etiquetas siguen apareciendo solo después de que se ejecuta JS. Por eso también necesitas la parte 2.

La solución compartida, parte 2: una estrategia de renderizado

Para incluir contenido real (y las etiquetas del head) en el HTML antes de que se ejecute JavaScript, puedes elegir uno de tres enfoques. Este es el orden según cuánto riesgo de SEO elimina cada uno:

  1. Prerenderizado / generación estática (SSG). Genera HTML estático para cada ruta durante la compilación. Es la opción de menor riesgo para contenido que no cambia por solicitud. Cada biblioteca tiene una ruta de prerenderizado (por ejemplo, el prerenderizado incorporado de SolidJS y los plugins de prerenderizado de Vue y Angular).
  2. Renderizado del lado del servidor (SSR). Renderiza el HTML en el servidor por solicitud y después hidrátalo en el navegador. Aquí entran los meta-frameworks: Next.js (React), Nuxt (Vue), Angular SSR (antes Angular Universal), SvelteKit (Svelte) y SolidStart (SolidJS). Para la mayoría de los sitios de contenido que necesitan posicionarse, adoptar el meta-framework correspondiente es la solución más limpia.
  3. Mantener el CSR completo, pero hacerlo rastreable. A veces es aceptable para superficies similares a una aplicación que están detrás de un inicio de sesión y no necesitan posicionarse, pero es un mal valor predeterminado para todo lo que quieras incluir en las búsquedas.

Toma esta decisión por ruta, no por aplicación. Una página de marketing y un panel con sesión iniciada dentro de la misma base de código pueden encajar razonablemente en filas distintas de esa lista. Para cada ruta, pregunta:

  • Salida: ¿el contenido debe estar en la respuesta inicial o está bien que aparezca después de que se ejecute JS?
  • Frescura: ¿es lo bastante estable para generarlo una vez (prerenderizado) o cambia en cada solicitud (SSR)?
  • Personalización: ¿es distinto para cada visitante? El prerenderizado no puede ayudar aquí; debes elegir entre SSR y CSR.
  • Costo del servidor: el SSR añade cómputo en cada solicitud; el prerenderizado concentra ese costo en la compilación.
  • Dependencia de JS: ¿cuánto depende la utilidad de la ruta de que se ejecute JavaScript en el cliente?
  • Comportamiento ante fallos: si JS falla o está bloqueado, ¿la ruta se degrada a algo utilizable o a nada?

La decisión es la misma independientemente del framework: ¿este contenido necesita posicionarse o ser citado? Si la respuesta es sí, introdúcelo en HTML renderizado en el servidor o prerenderizado. Si es una interfaz de aplicación puramente interactiva, el CSR está bien.

Cómo gestiona Google estas aplicaciones (y por qué otros no lo hacen)

Google puede renderizar cada uno de estos frameworks: ejecuta un Chrome headless actualizado y ejecuta tu JS. Pero lo hace en una cola aplazada, y el renderizador es sin estado (no conserva cookies ni localStorage, no usa service workers y no interactúa: no hará scroll ni clic). Por eso, además de elegir framework, se aplican las mismas reglas de JS-SEO del hub de JavaScript SEO: enlaces <a href> reales, paridad entre el DOM sin renderizar y el renderizado, ningún contenido detrás de una interacción y ningún noindex inyectado por JS.

Fuera de Google, la situación es peor. El renderizado de JS de Bing es más irregular y los rastreadores de IA, en gran medida, no renderizan. En una aplicación CSR, eso puede significar que tu contenido exista para Google (con el tiempo), pero no para Bing ni para las herramientas de IA con las que cada vez más personas buscan. El SSR o el prerenderizado cierran esa brecha para todos, no solo para Google: es el argumento más sólido para no publicar contenido que dependa únicamente del CSR.

Los cinco frameworks de un vistazo

FrameworkPredeterminadoGestión del headSSR / meta-frameworkNota de SEO
ReactCSRreact-helmet-asyncNext.js (Metadata API)La SPA que prioriza CSR más común; Next.js es la solución SEO estándar
VueCSR@unhead/vueNuxt (useSeoMeta())Nuxt usa SSR de forma predeterminada; Vue puro necesita prerenderizado o Nuxt
AngularCSR (SPA)servicios incorporados Title/MetaAngular SSR (antes Universal)SPAs grandes; Angular moderno añade SSR e hidratación incremental
SvelteCSR (Svelte) / SSR (SvelteKit)<svelte:head>SvelteKit (SSR predeterminado)SvelteKit usa SSR por defecto: cuidado con la trampa estática ssr:false
SolidJSCSR@solidjs/metaSolidStartReactividad granular; SolidStart añade SSR y prerenderizado

El patrón es coherente: un valor predeterminado CSR, un paquete para el head y una estrategia de renderizado (normalmente el meta-framework correspondiente). Lo que cambia son los nombres y algunos bordes problemáticos.

Dónde seguir: análisis detallados de cada framework

Este hub es el mapa. Cada framework tiene su propia guía con los paquetes, la configuración y las particularidades específicas:

  • React SEO: por qué React, que prioriza CSR, crea riesgo de indexación, React Router y la History API, react-helmet-async y cuándo recurrir a Next.js.
  • Vue SEO: el valor predeterminado CSR de Vue 3, createWebHistory(), @unhead/vue, el prerenderizado sin meta-framework y cuándo Nuxt es la opción adecuada.
  • Angular SEO: los valores predeterminados SPA de Angular, @angular/ssr, los servicios incorporados Title y Meta, el prerenderizado y la hidratación incremental.
  • Svelte SEO: Svelte frente a SvelteKit, SSR predeterminado en SvelteKit, <svelte:head>, la trampa de adapter-static + ssr: false y sus implicaciones para los rastreadores de IA.
  • SolidJS SEO: el valor predeterminado CSR de SolidJS, @solidjs/meta, SolidStart para SSR y prerenderizado, y cómo su modelo granular afecta al resultado renderizado.

Para los propios modos de renderizado (CSR, SSR, SSG, ISR, hidratación y renderizado dinámico) y las reglas generales de renderizado/paridad, consulta el hub principal de JavaScript SEO.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.