【かそうどむ】

仮想DOM とは?

💡 本番の舞台に出る前に「リハーサル」する仕組み
📌 このページのポイント
仮想DOMの差分検知(Diffing) ① 旧 仮想DOM ② 新 仮想DOM ③ 実DOM更新 <div> <h1>A <p>B <div> <h1>A <p>C 変更! <div> <h1>A <p>C 更新! Diff Patch 仮想DOMの仕組み 状態変更 setState等 新仮想DOM生成 JSオブジェクト 差分検出 Diffアルゴリズム 最小更新 実DOM反映 変更のあった箇所だけを実DOMに反映するため高速 React・Vueなどのフレームワークで採用
仮想DOMは差分のみを実DOMに反映し、効率的にUIを更新する
ひよこ ひよこ

なんでわざわざコピーを作るの?

ペンギン先生 ペンギン先生

DOMの操作は描画の再計算を伴うのでコストが高い。仮想DOMはただのJavaScriptオブジェクトなので高速に比較できる。「どこが変わったか」を軽いオブジェクト同士で見つけてから、必要な部分だけ実DOMを触る。

ひよこ ひよこ

仮想DOMがあれば必ず速くなるの?

ペンギン先生 ペンギン先生

実はそうでもない。シンプルな変更なら直接DOM操作のほうが速いこともある。仮想DOMの真の価値は速度よりも「宣言的にUIを書ける」という開発体験の良さ。Svelteのように仮想DOMを使わないフレームワークも高速に動いている。

ひよこ ひよこ

Reactのre-renderと仮想DOMの関係は?

ペンギン先生 ペンギン先生

Reactコンポーネントがre-renderされると新しい仮想DOMが生成され、前回のものと差分比較される。差分があった箇所だけ実DOMが更新される。だからre-render自体は軽い処理で、実DOMの変更を最小限に抑えてくれる。

ひよこ ひよこ

Reactの仮想DOMSvelteのコンパイルアプローチ、どっちが優れているの?

ペンギン先生 ペンギン先生

一長一短だよ。仮想DOMは「ランタイムで差分計算」するから柔軟性が高く、複雑なUIの動的更新に強い。Svelteは「ビルド時にコンパイル」して直接DOM操作コードを生成するから、ランタイムオーバーヘッドがゼロに近い。小〜中規模ならSvelteの方がバンドルサイズが小さく高速、大規模でエコシステムが重要ならReactの方が選択肢が豊富だね。

ひよこ ひよこ

React Fiberって仮想DOMの進化版なの?

ペンギン先生 ペンギン先生

そうだよ。React 16で導入されたFiberアーキテクチャは仮想DOMの差分計算を「中断可能」にしたんだ。従来は差分計算が始まると完了するまでメインスレッドをブロックしていたけど、Fiberは作業を細分化してフレーム間の隙間で少しずつ処理できる。これによりユーザー入力への応答性が大幅に改善された。React 18のConcurrent Featuresもこの仕組みの上に成り立っているんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
仮想DOMって出てきたら「変更箇所だけを効率よく画面に反映する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「virtual DOM」 = 仮想的なDOM
💬 virtual は「仮想の、実体のない」という意味で、メモリ上にだけ存在するDOMのコピーを指す
← 用語集にもどる