SEO con JavaScript

Cómo asegurar que los buscadores rastreen, rendericen e indexen contenido que depende de JavaScript: enlaces reales, paridad, carga diferida, desplazamiento infinito, soft 404 y pruebas.

Publicado por primera vez: 23 jun 2026 · Última actualización: 2 sept 2026 · Avanzado
1 señal de evidencia en esta página

El SEO con JavaScript comprueba si los buscadores pueden rastrear, renderizar e indexar contenido dependiente de JavaScript. Google puede ejecutar JS; los fallos reales son la paridad entre HTML inicial y renderizado, la interacción, el estado y el tiempo. Usa enlaces reales, no bloquees JS/CSS, prefiere SSR o prerenderizado para el contenido que debe posicionarse y vigila el desplazamiento infinito.

TL;DR—Google puede ejecutar JavaScript, entonces “¿puede Google leer JS?” esta mal pregunta. Los modos de falla sonparidad(DOM sin formato versus renderizado),interacción(Google no se desplaza ni hace clic),estado(el renderizador no tiene estado), y> momento. Mantenga los enlaces tan reales<a href>anclajes, no bloquee JS/CSS, realice carga diferida ventana gráfica, no interacción, devuelve estados reales para 404 del lado del cliente y recuerda un crudonoindexpuede impedir la representación antes de que JavaScript pueda eliminarla. combinar directivas que realmente se procesaron, pero que no asumen un ganador universal sin procesar/renderizado. Observe especialmente el desplazamiento infinito: una ventana gráfica de renderizado alta puede activar el cargador y fusionar dos URL en una página indexada. Para las partes internas del renderizador y qué renderizado modo para elegir, verrepresentación.

¿Puede Google leer JavaScript? Sí, esa no es la pregunta.

Google puede ejecutar JavaScript; los riesgos reales son la paridad, la interacción, el estado y el tiempo. Fuente: /technical-seo/javascript-seo/

De izquierda a derecha aparecen rastreo, renderizado e indexación. Del renderizado salen cuatro fallos: paridad, cuando el DOM renderizado no coincide con lo esperado; interacción, cuando el contenido exige desplazarse o hacer clic; estado, cuando depende de cookies o almacenamiento que el renderizador borra; y tiempo, cuando JavaScript retrasa el contenido.

© Patrick Stox LLC · CC BY 4.0 ·

Google procesa aplicaciones JavaScript en tres fases:“Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.”La fase media ejecuta su JS en un Chrome permanente y sin cabeza para construir el DOM que se indexa.”Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.”

Evidencia de esta afirmación Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Alcance: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confianza: alta · Verificado: Google Search Central: Understand the JavaScript SEO basics

Entonces Googlepoderejecuta tu JavaScript. Las preguntas útiles son más específicas:

  • Paridad— ¿El DOM renderizado realmente contiene lo que crees que contiene?
  • Interacción— ¿Hay algo que requiera un desplazamiento o un clic que Google no realice?
  • Estado- ¿Confías en las cookies/almacenamiento local que borra el renderizador sin estado?
  • Momento– ¿El contenido crítico se pospone detrás de JavaScript lento o tardío?

Específicamente en el momento: Google pone en cola una página rastreada (una que devolvió un200) para renderizado, y*“the page may stay on this queue for a few seconds, but it can take longer than that.”*No hay retrasos ni tiempos de espera fijos publicados, y una página que devuelve un estado distinto de 200, o que comienza con unnoindexdirectiva, puede saltarse la renderice la cola en lugar de esperar a que JavaScript la cambie.

Evidencia de esta afirmación Google queues crawled pages with a 200 response for rendering; the page may stay in that queue for a few seconds but can take longer, with no published fixed delay or timeout, and non-200 or initial noindex responses may skip rendering. Alcance: Google Search's documented render-queue behavior; not a guaranteed or universal timing figure. Confianza: alta · Verificado: Google Search Central: Understand the JavaScript SEO basics

la mecanica decómoGoogle renderiza: el servicio de renderizado web, apatridia, almacenamiento en caché, el mito de las “dos olas”: vive en elrepresentaciónpágina. Aquí me centraré en el problemas prácticos y soluciones.

Los enlaces deben ser reales.<a href>anclas

Este es el error de JS-SEO más común.”Google can only discover your links if they are <a> HTML elements with an href attribute.”Un clicable<div>con unonclickEl controlador es invisible para Google como enlace: no será seguido y las páginas que dependen de él para su descubrimiento pueden no ser rastreados. Está perfectamente bieninyectarenlaces con JavaScript, siempre y cuando terminen siendo reales<a href>anclajes en el DOM renderizado. Esas anclas renderizadas se analizandespuésSin embargo, se ejecuta JavaScript: aterrizar en el DOM renderizado hace que un enlace sea reconocible, no es una promesa de que el La URL se rastrea, indexa o trata de la misma manera que un enlace presente en el HTML sin formato.

Evidencia de esta afirmación Google can reliably discover links only when they are HTML anchor elements with an href attribute. Alcance: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confianza: alta · Verificado: Google Search Central: Make your links crawlable

Contenido de carga diferida y controlado por interacción

El renderizador no se comporta como un usuario curioso:*“Google Search does not interact with your page.”*Sin desplazarse, sin hacer clic, sin desplazarse. Entonces, cualquier contenido que solo No se verán cargas en uno de esos eventos.

Guía de Google: cargue contenido cuando ingrese a la ventana gráfica, no cuando el usuario actúe.*“make sure that your lazy-loading implementation loads all relevant content whenever it is visible in the viewport,“y”don’t add lazy-loading to content that is likely to be immediately visible when a user opens a page.”*Utilice IntersectionObserver o nativoloading="lazy"para imágenes, nunca un controlador de desplazamiento o clic, por lo que el El contenido se carga durante un renderizado normal.

Evidencia de esta afirmación Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Alcance: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confianza: alta · Verificado: Google Search Central: Fix lazy-loaded content

Desplazamiento infinito: cuando dos páginas se indexan como una

Un viewport alto de Google puede activar el desplazamiento infinito y unir dos páginas bajo una sola URL indexada. Fuente: /technical-seo/javascript-seo/

Un viewport normal termina tras la primera página. El viewport de renderizado de Google puede ser más alto, alcanzar el disparador, cargar la página siguiente sin desplazamiento real y anexarla al mismo DOM. Google puede indexar entonces el contenido de ambas bajo una URL.

© Patrick Stox LLC · CC BY 4.0 ·

Éste es el que casi nadie explica y merece la pena toda la sección.

El robot de Google puede renderizar en una ventana gráfica considerablemente más alta que una ventana de navegador típica. Google no publica un tamaño exacto de la ventana gráfica de renderizado (y puede cambiar), así que no lo hagas. diseñar contra un número específico; En su lugar, pruebe su propia implementación. lo que importa es el mecanismo: si su cargador de desplazamiento infinito se activa según la posición de desplazamiento o altura de la ventana gráfica, una ventana gráfica de renderizado más alta de lo esperado puedeactivar el cargador durante el renderizado- y elpróximoEl contenido de la página del artículo o producto se obtiene. agregado en el mismo DOM. Ahora el contenido de dos URL distintas se ha renderizado juntos, y Google puede indexarlos comounopágina. En mi propia experiencia,“occasionally, two pages get indexed as one”— Me han reportado páginas como “no indexadas” que estaban realmente indexado como parte deotropágina (generalmente la publicación anterior en el feed), porque*“when Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.”*Confirma si el tuyo La configuración hace esto comprobando el HTML renderizado de URL Inspection para encontrar una página que esperaría ver. Detente en seco: no asumas un tamaño y no asumas que estás a salvo.

Hay dos capas para hacer esto bien.

**En primer lugar, haga que la búsqueda con desplazamiento infinito sea fácil de usar.Soporte de carga paginada debajo del pergamino infinito. Cada trozo debe tener”its own persistent, unique URL,“El contenido de cada URL debe permanecer igual cada vez que se carga. Evite parámetros relativos como?date=yesterday, debería”link sequentially to the individual URLs so that search engines can discover the URLs in a paginated set,“y cuando se carga un nuevo fragmento en el desplazamiento, deberías”update the displayed URL using the History API.”usar reales<a href>enlaces de paginación y URL únicas:“don’t use URL fragment identifiers”(la parte después de un#) para los números de página, porque Google ignora ellos. Como digo en miGuía de SEO de JavaScript, “Si tienes una configuración de desplazamiento infinito, sigo recomendando una versión de página paginada para que Google pueda rastrearla correctamente.”

**Si un cargador con errores está fusionando páginas activamente,**la solución más rápida es contundente:*“block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.”*Si el cargador no puede ejecutarse durante el renderizado, no puede agregar la página siguiente. contenido, y cada URL se representa nuevamente como sí misma.

Soft-404 después del enrutamiento del lado del cliente

Las aplicaciones de una sola página pueden intercambiar contenido sin cambiar el código de estado HTTP, por lo que una La vista “no encontrada” aún puede regresar200. Google puede clasificar esa respuesta como una soft 404 después de evaluar el contenido devuelto, pero una recuperación estática por sí sola no puede probar que Google ha hecho esa clasificación. Dos correcciones: navegue con la API de historial y, para un estado genuino de no encontrado, entréguelo a un URL que devuelve un valor real404estado o agregar unnoindexetiqueta. Y no te apoyes en la URL fragmentos para enrutamiento -“the AJAX-crawling scheme has been deprecated since 2015, so you can’t rely on URL fragments to work with Googlebot.”

Una redirección del lado del cliente tiene el mismo problema de evidencia: la respuesta inicial puede permanecer200hasta que se ejecute JavaScript. Googleadmite redirecciones de JavaScript solo como alternativacuando las redirecciones del lado del servidor o de meta-actualización no son posibles. Informar el estado estático y la navegación prestada observada por separado; no reescriba el estado HTTP en el audite o llame a cada URL representada, cambie una redirección.

No bloquees JavaScript o CSS en robots.txt

Googleno renderizará JavaScript desde archivos bloqueados o en páginas bloqueadas. Arobots.txtregla que no permite su paquete (o el/_next/, /static/, /assets/directorio en el que se encuentra) puede interrumpir el procesamiento por completo: Google busca el shell, no puede ejecuta los scripts e indexa una página vacía. Verifique la inspección de URLrecursos de la páginapor cualquier cosa bloqueada.

Directivas de paridad DOM y robots conscientes de la etapa

Compara tuHTML sin formato(Ver código fuente) contra elHTML renderizado(Inspección de URL). El contenido que solo existe en el HTML renderizado aún se indexa:sise rinde. Contenido en ninguno de los dos no existe para Google.

Hay un riesgo de orden de etapa que Google documenta directamente:*“When Google encounters the noindex tag, it may skip rendering and JavaScript execution, which means using JavaScript to change or remove the robots meta tag from noindex may not work as expected.”*Si su HTML sin formato incluye una inicialnoindexquerías intercambiar con JavaScript, Google puede actuar sobre esa basenoindexy nunca ejecutar el script que lo han eliminado.

No convierta esto en una regla universal de “victorias renderizadas”. La conciliación es específica del campo:

CampoLo que puede establecer la comparación sin formato/renderizado
Contenido principal y enlacesGoogle puede utilizar contenido y real.<a href>enlaces producidos durante la renderización si la renderización tiene éxito. La disponibilidad bruta reduce esa dependencia.
Título y descripciónGoogle puede procesar metadatos establecidos en JavaScript, pero los enlaces de títulos y fragmentos se seleccionan de varias fuentes. Mostrar ambos estados; no afirme que el valor prestado, el primero o el último están garantizados.
Directivas de robotsun crudonoindexpuede hacer que Google omita la renderización, por lo que es posible que nunca se vea la eliminación de JavaScript. Agregar restricciones más tarde no es evidencia de que se haya cancelado una restricción anterior.
Canónicode googleGuía de JavaScriptdice no establecer un valor en la fuente y luego cambiarlo con JavaScript. Utilice un método y verifique una declaración de cabeza representada.
Estado HTTP y redireccionamientoJavaScript no puede cambiar el estado de la respuesta ya recibida. Registre el estado estático y cualquier navegación representada observada como hechos separados.

Esa matriz es la razón por la cual un auditor debe mantener la fuente, la entrega, el encabezado de respuesta y estado de búsqueda observado distinto en lugar de colapsarlos en un valor “efectivo”.

Elija un modo de renderizado que coloque el contenido en el DOM

La mayor parte del riesgo JS-SEO se reduce acómose produce el HTML. La versión corta: SSR, estática/prerenderización e hidratación colocan contenido en (o rápidamente en) el DOM, lo que reduce cuánto depende su visibilidad del éxito del renderizador; lado del cliente completo El renderizado deja más en juego para que el renderizado se complete correctamente, a tiempo y en todo momento. El renderizado dinámico es una solución alternativa, no una opción de pares, según la última guía de Google actualizado en diciembre de 2025, describe el renderizado dinámico como una solución alternativa en lugar de una solución a largo plazo y recomienda renderizado del lado del servidor, renderizado estático o hidratación en su lugar. Como lo puse en miGuía de SEO de JavaScript, *“any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.”*El menú completo: CSR, SSR, SSG, hidratación, ISR, borde, streaming y renderizado dinámico, con una tabla de compensaciones esta en elrepresentaciónpágina. Google por separado describe la renderización del lado del servidor o la renderización previa como una buena idea para los usuarios y rastreadores. Evidencia de esta afirmación Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Alcance: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confianza: alta · Verificado: Google Search Central: Understand the JavaScript SEO basics

como probar

La inspección de URL en Search Console es la fuente de la verdad: ejecute una prueba en vivo y luego mire elHTML renderizado, elcaptura de pantalla, y elrecursos de página/consola mensajespara ver qué se cargó y qué falló. La prueba de resultados enriquecidos ofrece una rápida verificación de HTML renderizado. A escala, utilice un rastreador que ejecute JavaScript (Sitio Ahrefs Audit, Screaming Frog en modo de renderizado JS) para diferenciar el formato sin procesar del renderizado en todo el sitio.

Una diferencia de renderizado diagnostica, no puntúa: investiga los elementos esenciales que aparecen solo tras JavaScript o desaparecen después.

Una página ilustrativa tiene un título en ambos estados, 18 encabezados inicialmente y 19 renderizados, 42 enlaces internos inicialmente y 71 renderizados, ninguna descripción de producto inicialmente y 12 renderizadas, y seis canonical inicialmente pero uno renderizado. Los datos son sintéticos.

JavaScript no es malo para el SEO y no es malo. es solodiferentede lo que muchos Los SEO están acostumbrados. Trabaje con sus desarrolladores, introduzca su contenido importante en el DOM, y deje que las propias herramientas de Google, no sus suposiciones, sean el árbitro de lo que se genera.

Adónde ir a continuación: el clúster SEO de JavaScript

Este centro es el mapa. Cada tema a continuación es su propia inmersión profunda:

Renderizado y arquitectura

  • SEO para un CMS headless— cómo las interfaces desacopladas afectan el rastreo, el renderizado, los metadatos, los mapas de sitio y las etiquetas canónicas; qué modo de renderizado elegir; y los modos de falla específicos sin cabeza que necesita conocer.

Guías específicas del marco

  • Reaccionar SEO- por qué React, que es primero en CSR, crea riesgo de indexación, cómo Google representa las aplicaciones React, React Router y History API, react-helmet-async para metaetiquetas y cuándo recurrir a Next.js.
  • SEO angulares- Valores predeterminados de SPA de Angular,@angular/ssr(sucesor de Angular Universal), los servicios de título y meta integrados, renderizado previo e hidratación incremental en Angular moderno.
  • Siguiente.js SEO- Pages Router vs App Router, la API de metadatos,next/imagey CWV, sincronización ISR y Googlebot, mapas de sitio y los errores de SEO más comunes de Next.js.
  • SEO— SSR por defecto,useSeoMeta(), los modos de renderizado de Nuxt, el@nuxtjs/seoecosistema de módulos y cómo se compara Nuxt con Vue simple en cuanto a indexabilidad.
  • Vista SEO- CSR predeterminado de Vue 3 y lo que eso significa para los rastreadores,createWebHistory(), @unhead/vue, opciones de renderizado previo sin un metamarco, y cuando Nuxt es la decisión correcta.
  • SEO esbelto— Svelte vs SvelteKit, SSR por defecto en SvelteKit,<svelte:head>, eladapter-static + ssr: falsetrampa, opciones de adaptadores e implicaciones del rastreador de IA.
  • AstroSEO— zero-JS por defecto, arquitectura de islas,@astrojs/sitemap, astro:assets, Ver API de historial y transiciones, comportamiento de respaldo de las islas de servidores y ventajas de Core Web Vitals de Astro.

Añadir una nota de experto

Fijar una cita de experto

¿Es una persona nueva? Crea su perfil sin reclamar en /admin/experts/ → Fijar una cita de experto primero.