アプリで Nuxt.js/Vuejs を使用していますが、さまざまな場所でこのエラーが発生し続けます:
クライアント側でレンダリングされた仮想 DOM ツリーが、サーバーでレンダリングされたコンテンツと一致しません。 これは、不正な HTML マークアップ (たとえば、内にブロックレベル要素がネストされているか、
が欠落しているなど) が原因である可能性があります。 ハイドレーションをベイルし、完全なクライアント側レンダリングを実行します。このエラーをデバッグする最善の方法を知りたいのですが?これは、クライアントとサーバーの仮想 DOM ツリーをログに記録/取得して、どこでエラーが発生しているかを比較して見つけることができる方法ですか?
アプリケーションの規模が大きいため、手動で検証するのは困難です。
私の場合、このエラーは、
AsyncData
で配列リストを取得し、v-for
経由でタグをレンダリングするときに、 > を入力したために発生しました。
の v-for コードをブロックし、問題を解決します
部分的な回答: Chrome DevTools を使用すると、問題を特定し、どの要素が原因となっているかを正確に確認できます。次の手順を実行します (Nuxt 5.6.0 と Chrome 64.0.3282.186 を使用してこれを実行しています)
msg
変数の上にマウスを移動すると、メッセージが表示されます。patch
の実行行の 4 行上にあるHydro
関数呼び出しにマウスを置きます。Hydrate
のソースへのハイパーリンクが開きます。関数で、先頭から約 15 行に移動し、
assertNodeMatchが ## を返した後に
falsefalse# を返すブレークポイントを設定します。 。そこにブレークポイントを設定し、他のすべてのブレークポイントを削除します。
同じ警告が再度発行されます。これで、ブレークポイントにヒットすると、
elm
、次にvnode
を評価します。ここで、elm はサーバーによってレンダリングされた DOM 要素であるように見え、vnode は仮想 DOM ノードです。 Elm は HTML に出力するので、エラーが発生した場所を特定できます。