【かそうどむ】

仮想DOM とは?

最終更新:
💡 本番の舞台に出る前に「リハーサル」する仕組み

表示したいUIをメモリ上のオブジェクトなどで表し、更新前後を比較して必要な変更を実DOMに反映する仕組み。実DOMを丸ごと複製するものではない。

📌 このページのポイント
UIの表現を比べてDOMを更新 更新前のUI表現 更新後のUI表現 div h1: A p: B div h1: A p: C 比較・計算 B → C A C 実DOMへ必要な変更を反映 比較やUIの計算にもコストがある
見出しAは同じまま、文章BをCへ変える例。矢印は比較と反映の流れで、実DOMの複製ではない。DOMの更新後にブラウザーが描画する。
ひよこ ひよこ
なんでUIの表現を別に持つの?
ペンギン先生 ペンギン先生
開発者が「今の状態ならこのUI」と書くと、レンダラーが実DOMへの反映を担当できるからだよ。たとえば見出しAと文章Bを表す木と、文章だけCに変えた木を比較して、必要なDOM操作を計算するんだ。
ひよこ ひよこ
仮想DOMがあれば必ず速くなるの?
ペンギン先生 ペンギン先生
必ずではないよ。UIの表現を作る処理と比較にもコストがある。DOMへの不要な変更を減らすことと、処理全体が速いことは別なんだ。遅さが気になるときは、実際の画面でどの計算や描画に時間がかかっているかを調べるよ。
ひよこ ひよこ
Reactのre-renderとはどう違うの?
ペンギン先生 ペンギン先生
Reactのレンダリングは、コンポーネントを呼んで表示内容を計算する段階だよ。その後のコミットで、必要な変更をDOMへ反映する。結果が前回と同じならDOMを変えないこともある。再レンダリング自体が常に軽いとは限らないんだ。
ひよこ ひよこ
仮想DOMとコンパイルは対立する方式なの?
ペンギン先生 ペンギン先生
両方を組み合わせる実装もあるよ。Vueはテンプレートをコンパイルし、静的な部分の再利用や変更箇所の情報で仮想DOMの比較を減らしている。方式の名前だけで速度や適したアプリの規模を決めることはできないね。
ひよこ ひよこ
ReactのConcurrent Renderingとは関係があるの?
ペンギン先生 ペンギン先生
UIを計算する作業を途中で止めたり、後で再開したりできる仕組みだよ。React 18の説明では、対応する機能を使う部分でこの動作が有効になり、DOMへの反映は計算が整ってから行う。仮想DOMを使うだけで、すべての処理が中断可能になるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「仮想DOM」って出てきたら「UIの表現を比較して必要な変更をDOMに反映する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「virtual DOM」 = 仮想的なDOM
💬 virtualは仮想的という意味。表示したい要素や属性をメモリ上に表し、実DOMと対応させる考え方だよ。ブラウザーのDOMをそのまま複製するわけではないんだ

参考資料

← 用語集にもどる