SEO en React ¿Son enemigos? Spoiler: No, pero hay que hablarlo - Episodio 38

SEO en React?
Menudo debate que hay que poner encima de la mesa para hablarlo alto y claro!
- Quería que Google entendiera mi web. Y React me respondió con una pantalla en blanco.🗓 Diario de un SaaS
- 🧠 Qué descubrí sobre SEO en React
- 📸 Ejemplo de lo que Google ve
- 🔍 Explorando opciones: CSR, SSR, SSG
- 🤔 ¿Migrar a Next.js o buscar otra solución?
- 💡 La solución temporal (pero efectiva) para SEO en React: react-helmet-async
- 🧪 Cómo lo comprobé
- 🛑 Lo que me frenó (y me hizo dudar)
- 🧠 Lecciones aprendidas
- 🎯 Próximo paso
- 📌 Cierre
Quería que Google entendiera mi web. Y React me respondió con una pantalla en blanco.🗓 Diario de un SaaS
Desde el principio tuve claro que mi SaaS no podía ser invisible.
Necesitaba que las fichas de piezas fueran encontrables.
O sea, que Google entendiera qué había detrás de cada URL, y que si alguien buscaba un "rotor pieza XYZ"...
¡Mi web saliera ahí!
Pero entonces me encontré con una verdad incómoda:
React no es SEO-friendly por defecto.
🧠 Qué descubrí sobre SEO en React
React usa renderizado del lado del cliente (CSR, Client-Side Rendering).
Es decir, eso significa que cuando entras a una página, el servidor no entrega HTML completo.
Sino que da una especie de contenedor vacío con una etiqueta <div id="root">, y después... el navegador ejecuta JavaScript para construir todo.
El resultado: la mayoría del contenido llega después de que el HTML haya sido cargado.
O sea... un mojón para mí!
Para un usuario humano, no hay problema: ve la página cargada tras unos segundos.
Pero los buscadores no siempre son tan pacientes.
¿Y qué ve Google en ese primer HTML vacío?
- A veces, nada.
- A veces, solo el título genérico de la app.
- A veces, indexa mal o se salta las páginas dinámicas.
📸 Ejemplo de lo que Google ve
Con una app React clásica, sin Helmet ni SSR, el código fuente de cualquier ruta es algo así:
<html>
<head>
<title>Mi App React</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
</body>
</html>
Eso es lo que ve Googlebot en su primer intento de rastreo.
Y si ese main.js tarda en ejecutarse o hay errores... tu contenido no existe para Google.
🔍 Explorando opciones: CSR, SSR, SSG
🔸 CSR (Client-Side Rendering)
- ✅ Rápido de desarrollar.
- ❌ Malo para SEO.
- ❌ El contenido llega después de que cargue JavaScript.
- ⚠️ Google puede no indexar bien rutas dinámicas.
🔸 SSR (Server-Side Rendering)
- ✅ Entrega HTML completo desde el servidor.
- ✅ Mejor para SEO.
- ⚠️ Requiere herramientas como Next.js o frameworks más complejos.
- ⚠️ Aumenta el tiempo de desarrollo.
🔸 SSG (Static Site Generation)
- ✅ Ideal para contenido estático (blogs, páginas que no cambian mucho).
- ⚠️ No tan útil si el contenido depende del usuario o es dinámico.
Yo estaba usando Create React App (CRA) y tenía renderizado del lado del cliente.
Era cómodo, pero limitado.
En pocas palabras, una mierda para el SEO.
🤔 ¿Migrar a Next.js o buscar otra solución?
Migrar a Next.js habría supuesto reescribir mi app desde cero.
O sea, casi la palmo.
Cambiar la estructura de carpetas, aprender sus convenciones, gestionar rutas de forma distinta...
Y lo peor...
Perder tiempo de desarrollo sin garantía de que Google me indexara mejor.
No estaba listo para ese salto.
Y claro, quería una solución práctica y ligera.
💡 La solución temporal (pero efectiva) para SEO en React: react-helmet-async
Después de investigar (y preguntar a la IA), encontré react-helmet-async, una librería que permite añadir metadatos dinámicos dentro de componentes React.
Ejemplo:
import { Helmet } from 'react-helmet-async';
export default function PiezaDetalle({ pieza }) {
return (
<>
<Helmet>
<title>{pieza.titulo} - Mi Almacén de Relojería</title>
<meta name="description" content={pieza.descripcion} />
</Helmet>
<h1>{pieza.titulo}</h1>
<p>{pieza.descripcion}</p>
</>
);
}
Con esto, cada vez que un usuario entra a una ficha de producto, el navegador actualiza el título y la descripción, y Googlebot (si tiene soporte de JavaScript) puede capturarlo.
¿Es perfecto?
No.
Pero es mejor que no hacer nada.
🧪 Cómo lo comprobé
Usé herramientas como:
- https://www.opengraph.xyz
- https://pagespeed.web.dev
- La extensión SEO META in 1 CLICK (en Chrome)
Y noté que:
- Los títulos cambiaban dinámicamente.
- Las descripciones aparecían correctas.
- Las páginas cargaban más rápido si usaba
react-helmet-asyncbien.

🛑 Lo que me frenó (y me hizo dudar)
- ¿Y si Google sigue viendo HTML vacío?
- ¿Y si me gasto meses montando el sistema y luego nadie lo encuentra?
- ¿Y si mi arquitectura ya está mal desde el principio?
Pero aprendí algo importante: no hace falta tener el stack perfecto desde el inicio.
O sea, puedes empezar simple, validar, mejorar.
🧠 Lecciones aprendidas
🔹 React no odia el SEO. Solo necesita ayuda.
No es lo ideal para contenido orientado a buscadores, pero hay herramientas que lo acercan bastante.
🔹 Entender cómo rastrea Google cambia tu forma de desarrollar
Suerte que llevo en SEO desde el 2006 de forma autodidacta.
Algo que siempre modela mi forma de ver webs y las webapps y hace que siempre esté pensando también en cómo lo haría un SEO.
🔹 Empezar por algo, luego mejorar
No necesitas SSR para tener algo indexable.
Ya que con Helmet es una buena puerta de entrada.
🎯 Próximo paso
- Implementar Helmet en cada ficha de pieza
- Explorar opciones de pre-render o build dinámico si el tráfico crece
- Documentar los títulos y descripciones clave por categoría
📌 Cierre
Hoy sé que React y SEO no son enemigos.
Solo tienen personalidades distintas: uno es dinámico, el otro estructurado.
Y como toda relación, se trata de comunicarse mejor.
No hace falta migrar todo a Next.js ni reescribir desde cero.
A veces, lo que necesitas es simplemente ponerle un casco (Helmet) a tu app.
💬 ¿Tú también pensabas que React y SEO no podían convivir?
¿Qué trucos usaste tú?
¿Helmet, prerender, Next...?
Cuéntamelo en comentarios, que de esto aprendemos todos.
Si quieres conocer otros artículos parecidos a SEO en React ¿Son enemigos? Spoiler: No, pero hay que hablarlo - Episodio 38 puedes visitar la categoría Proyecto-IA.

Deja una respuesta