J'utilise Nuxt.js/Vuejs pour mmy app, et je continue à faire face à cette erreur à différents endroits:
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.
Je voudrais comprendre quelle est la meilleure façon de déboguer cette erreur? Est-ce un moyen d'enregistrer/d'obtenir l'arborescence DOM virtuelle pour le client et le serveur afin de pouvoir comparer et trouver où se situe l'erreur?
Le mien est une grande application et la vérification manuelle est difficile.
Réponse partielle: avec Chrome DevTools, vous pouvez localiser le problème et voir exactement quel élément a causé le problème. Procédez comme suit (je l'ai fait avec Nuxt 5.6.0 et Chrome 64.0.3282.186)
msg
.hydrate
, la fonction appelle 4 lignes au-dessus de la ligne d'exécution dans patch
. Un lien hypertexte vers la source de hydrate
s'ouvrirait.hydrate
, déplacez environ 15 lignes depuis le début et définissez un point d'arrêt où false
est renvoyé après que assertNodeMatch
a renvoyé false
. Définissez-y le point d'arrêt et supprimez tous les autres points d'arrêt.hydrate
. Basculez vers la console DevTools et évaluez Elm
puis vnode
. Ici, Elm semble être un élément DOM rendu par le serveur tandis que vnode est un nœud DOM virtuel. L'orme est imprimé en HTML afin que vous puissiez déterminer où l'erreur s'est produite.Ce que j'ai trouvé si loin de l'observation, c'est que lorsque vous utilisez des packages tiers comme jQuery (spécialement), ils injectent parfois des balises html dans le dom. Vue/Nuxt perd donc la trace de l'arbre dom et commence à se plaindre.
J'avais le même problème et après un certain temps, j'ai supprimé tous les jQuery et remplacé la fonctionnalité jQuery par Vuejs et ces erreurs ont toutes disparu.
Voir ici pour un exemple de gestion des intégrations (par exemple, Google Analytics ou FB Pixel) qui modifient le DOM. Fondamentalement, créez un plugin et excluez-le de SSR.
Ok, ça va paraître idiot. J'ai essayé un tas de solutions différentes pendant environ 15 minutes, comme le redémarrage du serveur et la suppression du répertoire .nuxt, mais j'étais trop paresseux pour utiliser la solution big brain de @ budden73. Ce qui a fini par fonctionner pour moi était simplement redémarrage de mon ordinateur, essayez-le.