Volver al blog

Error de hidratación en Next.js: Causas y Soluciones

Descubre las causas reales del error de hidratación en Next.js y aprende a corregir divergencias de HTML, fechas y zonas horarias de forma definitiva.

24 de agosto de 2026
9 min de lectura
8 vistas
Error de hidratación en Next.js: Causas y Soluciones

¿Qué es el error de hidratación en Next.js y por qué ocurre?

El error de hidratación en Next.js ocurre cuando existe una divergencia entre el árbol React pre-renderizado en el servidor y el árbol de componentes generado en la primera renderización dentro del navegador. La hidratación es el proceso en el que React convierte el HTML pre-renderizado proveniente del servidor en una aplicación interactiva, adjuntando los manejadores de eventos (event handlers) a los elementos del DOM.

Cuando React detecta que el HTML enviado por el servidor no corresponde exactamente a lo que el cliente renderizó en la inicialización, dispara la advertencia de error de hidratación. Resolver este problema exige identificar dónde la estructura del servidor y la del cliente se separaron, asegurando que el código responda de forma idéntica en ambos entornos antes de la interactividad.

Al estructurar tu proyecto, asegurar que el código se ejecute de forma consistente en el servidor y en el navegador previene fallos de renderización. Si estás desarrollando o planeando cuánto tiempo lleva hacer un sitio web, dominar el flujo de hidratación es indispensable para la calidad del código en producción.

Puntos clave

  • Concepto esencial: la hidratación es el momento en que React adjunta los event handlers al HTML proveniente del servidor.
  • Causa raíz: diferencias de marcado HTML, datos de fecha/zona horaria o APIs del navegador entre el servidor y el cliente.
  • Comportamiento de iOS: los dispositivos de Apple convierten números y correos electrónicos en enlaces automáticamente si no se configuran.
  • Soluciones oficiales: uso de useEffect, importación dinámica con next/dynamic y la prop suppressHydrationWarning.

Principales causas de errores de hidratación en proyectos Next.js

La documentación oficial de Next.js sobre errores de hidratación detalla los escenarios que generan inconsistencia entre la pre-renderización en el servidor y el navegador.

Anidamiento incorrecto de etiquetas HTML

El navegador intenta corregir automáticamente HTML inválido antes de que React hidrate la página. Cuando el marcado enviado por el servidor tiene elementos anidados incorrectamente, el árbol del DOM es reestructurado por el navegador, resultando en una divergencia con el árbol de React. Los casos más comunes incluyen:

  • Un párrafo (<p>) dentro de otro párrafo (<p>).
  • Un <div> insertado dentro de un párrafo (<p>).
  • Una lista (<ul> o <ol>) dentro de un párrafo (<p>).
  • Contenido interactivo anidado, como un enlace (<a>) dentro de otro enlace (<a>) o un botón (<button>) dentro de otro botón (<button>).

Uso de APIs exclusivas del navegador y comprobaciones typeof window

Llamar a APIs que solo existen en el entorno del cliente (como window o localStorage) durante la fase de renderización hace que el servidor no pueda ejecutar el mismo fragmento de código. De igual forma, añadir condicionales del tipo typeof window !== 'undefined' directamente en la lógica de renderización altera la estructura generada: el servidor renderiza una rama y el navegador renderiza otra en la primera renderización.

Constructor Date(), fechas y zonas horarias

APIs dependientes del tiempo, como el constructor Date(), son fuentes frecuentes de errores. Si el servidor de Next.js procesa la solicitud configurado con la zona horaria UTC y el navegador del usuario está en la zona horaria de São Paulo, el texto impreso en pantalla será diferente en ambos lados. Esta diferencia en el HTML generado rompe la hidratación. Como se abordó en las discusiones del repositorio next-intl en GitHub, gestionar datos de localización y zona horaria exige una atención redoblada.

Comportamiento automático de iOS Safari

En dispositivos iOS, el sistema operativo inyecta enlaces automáticamente sobre secuencias numéricas (que interpreta como teléfonos) y direcciones de correo electrónico encontradas en el texto. Esta modificación en el HTML directamente por el sistema crea nodos adicionales que no existían en el servidor, disparando el error de hidratación.

Extensiones, CSS-in-JS y servicios de CDN/Edge

Otros factores externos también alteran la respuesta recibida por el navegador:

  • Extensiones de navegador: add-ons que modifican el árbol del DOM insertando scripts o elementos.
  • Bibliotecas CSS-in-JS mal configuradas: cuando la extracción del CSS crítico no está sincronizada entre servidor y cliente.
  • CDN y redes Edge: servicios que alteran la respuesta del servidor. Un ejemplo citado nominalmente en la documentación de Next.js es el recurso Auto Minify de Cloudflare, que modifica el HTML antes de entregarlo al cliente.

"La hidratación falla siempre que el HTML enviado por el servidor no coincide perfectamente con el primer resultado de la renderización en el cliente."

Tabla comparativa: causa del error vs. corrección recomendada

Causa de la divergencia Origen del problema Corrección recomendada
Anidamiento inválido HTML semánticamente incorrecto (ej: div en p) Corregir las etiquetas HTML para respetar la especificación del DOM
APIs de navegador (localStorage, window) Acceso a datos que no existen en el servidor Ejecutar la lectura dentro de useEffect con estado isClient
Fechas y zona horaria divergentes Servidor en UTC y cliente en la zona horaria local Usar Intl.DateTimeFormat con timeZone fijo o formatear en el servidor
Auto-formateo de iOS Sistema convierte texto en enlaces de teléfono/correo electrónico Añadir meta tag format-detection en el layout
Componentes exclusivos de cliente Dependencia pesada del navegador Cargar vía next/dynamic con { ssr: false }

Cómo resolver el error de hidratación paso a paso

Análisis detallados del problema, como el artículo técnico publicado en el blog de OneUptime, refuerzan que existen enfoques específicos para cada causa de desalineación. A continuación se presentan los pasos prácticos para corregir cada escenario.

Paso 1: Ajustar el código que depende del cliente con useEffect

Para fragmentos de código que dependen de window o localStorage, utiliza el hook useEffect. El servidor renderizará el estado inicial seguro y, después de la hidratación, React actualizará la pantalla en el cliente.

'use client';

import { useState, useEffect } from 'react';

export default function UserProfile() {
  const [isClient, setIsClient] = useState(false);

  useEffect(() => {
    setIsClient(true);
  }, []);

  if (!isClient) {
    return <<span class="text-gray-500">Cargando...</span>;
  }

  const theme = localStorage.getItem('theme');
  return <<span>Tema actual: {theme}</span>;
}

Paso 2: Deshabilitar el SSR en componentes específicos con next/dynamic

Si tienes un componente que depende enteramente de APIs del navegador y no necesita ser pre-renderizado en el servidor, deshabilita el SSR (Server-Side Rendering) utilizando la función dynamic de next/dynamic.

import dynamic from 'next/dynamic';

const ComponenteApenasCliente = dynamic(
  () => import('../components/ApenasCliente'),
  { ssr: false }
);

export default function Page() {
  return (
    <<main>
      <h1>Mi Página</h1>
      <ComponenteApenasCliente />
    </main>
  );
}

Paso 3: Garantizar consistencia en fechas y zonas horarias

Para evitar divergencias de fecha entre el servidor (que puede operar en UTC) y el cliente (en la zona horaria de São Paulo), define explícitamente las opciones de zona horaria utilizando Intl.DateTimeFormat o formatea la cadena directamente en el servidor sin recalcularla en el navegador.

export default function DataFormatada({ date }: { date: Date }) {
  const dataFormatada = new Intl.DateTimeFormat('pt-BR', {
    dateStyle: 'full',
    timeStyle: 'medium',
    timeZone: 'America/Sao_Paulo',
  }).format(date);

  return <<time>{dataFormatada}</time>;
}
Interfaz de código Next.js demostrando la corrección de error de hidratación en React
Ajustar el alineamiento de componentes entre servidor y cliente evita errores de hidratación en producción.

Paso 4: Bloquear el auto-formateo de iOS con meta tag

Para impedir que iOS inserte etiquetas de enlace automáticas en números y correos electrónicos en el texto, añade la meta tag format-detection en tu archivo de layout o encabezado de la aplicación.

export const metadata = {
  other: {
    'format-detection': 'telephone=no, date=no, email=no, address=no',
  },
};

En HTML tradicional o páginas legadas, la etiqueta corresponde al siguiente formato:

<<meta name="format-detection" content="telephone=no, date=no, email=no, address=no" />

Paso 5: Usar la prop suppressHydrationWarning de forma consciente

La documentación de Next.js proporciona la propiedad suppressHydrationWarning para indicar a React que no debe advertir sobre divergencias en un elemento específico. Es útil para timestamps que cambian rápidamente, pero debe usarse con precaución debido a sus tres advertencias explícitas:

  1. Funciona solo un nivel de profundidad en el elemento donde se aplicó.
  2. Es una escape hatch (mecanismo de escape) que no debe usarse en exceso en el código.
  3. React no intenta corregir el contenido de texto divergente cuando la propiedad está activa, manteniendo el valor del servidor visible hasta otra actualización.
export default function Timestamp() {
  return (
    <<span suppressHydrationWarning>
      {new Date().toLocaleTimeString()}
    </span>
  );
}

Preguntas frecuentes

¿Por qué es una mala práctica esparcir suppressHydrationWarning por el código?

Porque la prop suppressHydrationWarning funciona solo como un interruptor de advertencia y no corrige la causa raíz de la divergencia. Además, actúa solo a un nivel de profundidad y hace que React ignore las discrepancias en el texto, lo que puede enmascarar bugs visuales serios en la aplicación.

¿Cómo afecta Cloudflare Auto Minify a la hidratación en Next.js?

El recurso Auto Minify de Cloudflare modifica el código HTML enviado por el servidor antes de que llegue al navegador del cliente. Como React en el cliente espera recibir exactamente la misma estructura HTML que generó en el servidor, esta alteración externa provoca una falla de correspondencia durante la hidratación.

¿Qué sucede si renderizo el constructor Date() directamente en el JSX?

Como la ejecución ocurre en momentos y lugares diferentes, el servidor generará una cadena de fecha basada en la hora de la solicitud y la zona horaria del servidor, mientras que el cliente generará otra cadena basada en el reloj del ordenador del usuario. Esta diferencia de texto entre el HTML del servidor y el del cliente rompe el proceso de hidratación de React.

Conclusión

Resolver el error de hidratación en Next.js exige entender el origen de la discrepancia en lugar de simplemente ocultar la advertencia. Al identificar errores de anidamiento HTML, aislar código del cliente con useEffect, fijar zonas horarias en fechas y desactivar modificadores de iOS, tu aplicación en Next.js alcanzará estabilidad y alto rendimiento en producción.

Compartir:
Lee Sugano

Sobre Lee Sugano

Lee Sugano

Agencia de soluciones digitales con sede en Japón y clientes en más de 10 países. Compartimos insights sobre desarrollo, diseño y marketing digital para empresas que no se conforman con lo genérico.

¿Te gustó este contenido?

Recibe insights exclusivos sobre desarrollo web, diseño y marketing digital directamente en tu email.

Sin spam. Cancela cuando quieras.