Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix Now×
Skip to content
World desk5 min

Cómo solucionar “Text content does not match server-rendered HTML” en Next.js App Router

El error indica que el HTML prerenderizado y el primer render del navegador no coinciden. Aprende a localizar la diferencia y corregirla sin ocultar el problema.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

El error aparece cuando el HTML generado por el servidor no coincide con lo que React produce en el primer render del navegador durante la hidratación. La solución preferible es hacer que ambos generen la misma salida inicial. Empieza por comparar los datos y valores que cambian; después revisa APIs del navegador, fechas y formatos, markup inválido y modificaciones del HTML por extensiones o servicios externos.

Qué significa el error de hidratación

Next.js muestra “Text content does not match server-rendered HTML” cuando React encuentra una diferencia entre el HTML prerenderizado y el árbol que genera el navegador al hidratarlo. Hidratar significa conectar al HTML existente la lógica e interactividad de React; no es un segundo render independiente en el que el contenido inicial pueda variar libremente. React requiere que ambos lados concuerden.

As an Amazon Associate I earn from qualifying purchases.

El mensaje señala una discrepancia, no identifica por sí solo su causa. La documentación oficial de Next.js y la guía de React sobre hydrateRoot describen causas y alternativas generales. Sin el código, la versión instalada y el navegador implicado no se puede atribuir el problema a una causa concreta ni asumir que sea exclusivo de App Router.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cómo encontrar qué está cambiando

Localiza el primer elemento o texto que difiere y sigue el valor que lo genera. Pregunta qué valor se usó para producir el HTML del servidor y cuál se usó en el primer render del navegador.

  • Datos y estado inicial: verifica que el cliente empiece con el mismo conjunto de datos que produjo el HTML. Si cada lado obtiene una respuesta distinta o parte de un estado distinto, su JSX puede no coincidir.
  • APIs del navegador: busca lecturas de window, localStorage, matchMedia u otras APIs dentro de la lógica que decide el JSX inicial. Esas APIs no representan necesariamente el mismo valor en el servidor y el navegador.
  • Tiempo y valores variables: revisa Date(), horas, números aleatorios y formatos de fecha dependientes de la configuración regional. Un valor calculado en instantes distintos o con locales distintos puede producir texto diferente.
  • Markup inválido: inspecciona anidaciones incorrectas, como un <p> dentro de otro <p>, un <div> dentro de un párrafo o controles interactivos anidados, como enlaces o botones.
  • HTML modificado después de generarse: si ocurre solo en ciertos navegadores o en producción, comprueba si una extensión altera el DOM, si un CDN transforma el HTML —Next.js menciona Cloudflare Auto Minify— o si iOS convierte automáticamente datos de contacto en enlaces.
  • CSS-in-JS: comprueba que la biblioteca y su configuración de renderizado en servidor sigan el ejemplo oficial correspondiente. Una configuración incorrecta también puede causar discrepancias.

Arreglos posibles y cuándo usarlos

Estrategia Cuándo encaja Efecto o límite
Hacer idéntico el render inicial Los datos, el estado o el formato pueden mantenerse estables. Resuelve la discrepancia en su origen y cumple el requisito de concordancia de React.
Actualizar con useEffect La variante necesita información del navegador después de la hidratación. Provoca un render posterior; el cambio puede notarse y la pasada adicional puede ralentizar la hidratación.
dynamic(..., { ssr: false }) Un componente específico solo puede renderizarse en el navegador. Desactiva el prerenderizado para ese componente; no es una solución general para toda la página.
suppressHydrationWarning Una diferencia inevitable afecta a un elemento concreto. Silencia el aviso en un nivel; no corrige el contenido discrepante.

1. Haz determinista la salida inicial

Es la primera opción cuando puedes controlar los datos o el formato. Usa en el navegador el mismo snapshot de datos y estado inicial que corresponde al HTML ya generado. Evita consultar APIs del navegador para decidir qué contenido incluir en el primer JSX, y no calcules ese contenido a partir de la hora actual, un número aleatorio o un formato regional que pueda variar entre entornos.

2. Pasa la variante de navegador a un efecto

Si el contenido depende necesariamente del navegador, representa inicialmente un valor común y actualízalo en useEffect después de la hidratación. Next.js documenta esta técnica para evitar que una API del navegador cambie el primer render. Como se muestra una segunda salida, el cambio puede ser perceptible.

'use client'
import { useEffect, useState } from 'react'

export default function ClientValue() {
  const [ready, setReady] = useState(false)
  useEffect(() => setReady(true), [])
  return <span>{ready ? 'contenido del cliente' : 'contenido inicial estable'}</span>
}

El valor inicial debe ser el mismo en servidor y navegador. En App Router, añade 'use client' si el componente utiliza hooks.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

3. Desactiva el prerenderizado solo para el componente necesario

Para un widget que no puede renderizarse en servidor, Next.js documenta una importación dinámica con { ssr: false } dentro de un componente de cliente:

'use client'
import dynamic from 'next/dynamic'

const BrowserOnlyWidget = dynamic(() => import('./browser-only-widget'), {
  ssr: false,
})

Aplica esta excepción con alcance localizado; el ejemplo oficial se refiere a componentes seleccionados, no a desactivar el renderizado en servidor de toda la página como respuesta automática.

4. Reserva la supresión para una diferencia inevitable y puntual

suppressHydrationWarning={true} puede usarse en un elemento cuyo contenido necesariamente difiere, como una marca temporal. Es una salida de emergencia: solo actúa un nivel hacia abajo y React no intenta parchear el texto discrepante bajo esa supresión. No la uses para ocultar una diferencia amplia ni como primer paso de diagnóstico.

5. Desactiva la detección automática de datos de contacto de iOS, si es la causa

Next.js indica que iOS puede transformar números de teléfono, correos y otros datos de texto en enlaces. Si esa modificación causa la discrepancia, la documentación propone esta etiqueta meta:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
<meta name="format-detection" content="telephone=no, date=no, email=no, address=no" />
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Comprueba el resultado y evita los falsos arreglos

  1. Corrige primero la fuente de la diferencia que hayas encontrado: datos, estado, formato, estructura del markup o HTML transformado.
  2. Vuelve a cargar la página en el entorno donde aparece el aviso y confirma que el primer render del navegador concuerda con el HTML del servidor.
  3. Si el contenido debe variar según el navegador, mueve esa variación a un efecto o limita el renderizado en servidor al componente que no puede prerenderizarse.
  4. Comprueba cualquier ejemplo contra las versiones de Next.js y React que tengas instaladas. Las fuentes citadas documentan el comportamiento general, pero el caso concreto depende del código y el entorno.

Silenciar el aviso sin eliminar o contener la causa deja sin resolver la diferencia que React encontró. Por eso, usa suppressHydrationWarning solo cuando la discrepancia sea inevitable, localizada y conocida.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.