Estoy usando Nuxt.js/Vuejs para mi aplicación y sigo enfrentándome a este error en diferentes lugares:
The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.Me gustaría entender cuál es la mejor manera de depurar este error. ¿Es su forma de registrar/obtener el árbol DOM virtual para el cliente y el servidor para poder comparar y encontrar dónde se encuentra el error?
La mía es una aplicación grande y la verificación manual es difícil.
Respuesta parcial: con Chrome DevTools, puede localizar el problema y ver exactamente qué elemento causó el problema. Haga lo siguiente (lo hice con Nuxt 5.6.0 y Chrome 64.0.3282.186)
msg .hydrate 4 líneas arriba de la línea de ejecución en el patch . Se abriría un hipervínculo a la fuente de hydrate .hydrate , muévase unas 15 líneas desde el principio y establezca un punto de interrupción donde se devuelva false después de assertNodeMatch devolviera false . Establezca el punto de interrupción allí y elimine todos los demás puntos de interrupción.hydrate . Cambie a la consola de DevTools y evalúe elm y luego vnode . Aquí, elm parece ser un elemento DOM renderizado por el servidor, mientras que vnode es un nodo DOM virtual. Elm se imprime como HTML para que pueda averiguar dónde ocurrió el error.Para mí, este error ocurrió porque obtuve la lista Array en AsyncData y rendericé las etiquetas <tr> por v-for , puse los códigos v-for en bloques <client-only> y el problema se resolvió
Hay muchas formas de solucionar este problema, pero la mayoría de ellas no son soluciones reales, solo curitas piratas. Para señalar algunos:
<client-only> , pero tenga cuidado con algunos detalles importantesv-show en lugar de un v-ifRecomiendo encarecidamente leer este magnífico artículo escrito por Alexander Lichter.
Él le explicará que debe diagnosticar por qué sucede esto y solucionar el problema real.
Básicamente, cada vez que algo es diferente de lo que se generó en el servidor y lo que está disponible cuando se realiza la hidratación en el cliente , se producirá este error.
Algunos de los cuales son:
<p> , lo mismo ocurre con a etiqueta anidada en otra, etc.)new Date() por ejemplo)Recomiendo encarecidamente leer el artículo para entender en las propias palabras de Alexandre cómo manejar este tipo de problema. Si tiene prisa, siempre puede usar una solución de curita, pero intente solucionar el problema para obtener el mejor rendimiento y mantener el código limpio.