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