¿Qué es el Error 'Hydration Failed' en Next.js?
El error de hidratación (Hydration Failed) en Next.js ocurre cuando el HTML generado por el servidor (SSR) no coincide con el HTML inicial que renderiza el navegador del cliente en el primer montaje. Esto suele causar inconsistencias visuales y advertencias en la consola del navegador que afectan la experiencia del usuario y el SEO.
Principales causas del error de hidratación
- Uso de funciones que devuelven valores dinámicos diferentes en cada ejecución como
new Date(),Math.random()olocalStorage. - Estructuras HTML inválidas (por ejemplo, anidar un bloque
<p>dentro de otro o etiquetas<div>dentro de<p>). - Extensiones del navegador que modifican el DOM antes de que se complete la hidratación de React.
Método 1: Usar useEffect para renderizado exclusivo en el cliente
La forma más común de evitar que el servidor renderice elementos dinámicos que causan conflictos es diferir su carga hasta que el componente se monte en el navegador.
- Identifica el componente o la variable que genera el valor dinámico.
- Envuelve la lógica utilizando el hook
useEffectjunto con un estado booleano. - Ejemplo de código corregido:
const [isClient, setIsClient] = useState(false);useEffect(() => { setIsClient(true); }, []);return <div>{isClient ? <p>{window.innerWidth}</p> : 'Cargando...'}</div>;
Método 2: Desactivar la hidratación en elementos específicos
Si necesitas que un bloque de código se renderice únicamente en el cliente y no te importa el SEO de esa sección específica, puedes indicarle a React que ignore la validación en ese nodo utilizando suppressHydrationWarning.
- Localiza la etiqueta HTML que genera la advertencia (por ejemplo, una etiqueta
<time>con la hora actual). - Agrega el atributo booleano directamente en la etiqueta JSX.
- Ejemplo de implementación:
<time suppressHydrationWarning>{new Date().toLocaleTimeString()}</time>
Método 3: Validar la estructura HTML correcta
A veces el error no es por JavaScript, sino por una mala maquetación HTML que el navegador corrige automáticamente al cargar, generando el desfase.
- Revisa la consola de desarrollo para identificar el árbol de nodos que no coincide.
- Corrige etiquetas anidadas incorrectamente, como bloques de texto complejos dentro de párrafos.
- Asegúrate de que tus componentes devuelvan un único elemento raíz válido y limpio.