🗂
DOMってなに?仮想DOMってなに?
モダンJavaScriptの理解にはこの「DOM」の理解が必須だとか。
そこで今回はDOMについて学んでいきたいと思います。
DOM(Document Object Model)と仮想DOM
1. DOM(Document Object Model)とは
DOMは、HTMLやXMLドキュメントをプログラムから操作するためのインターフェースです。
主な特徴
- ウェブページの構造を木構造で表現
- JavaScriptを使って動的に操作可能
- ブラウザが直接解釈して画面に表示
具体例
<div id="app">
<h1>こんにちは</h1>
<p>これはDOMの例です</p>
</div>
このHTMLは、DOMツリーとして以下のように表現されます
document
└── div#app
├── h1
│ └── "こんにちは"
└── p
└── "これはDOMの例です"
2. 仮想DOM(Virtual DOM)とは
仮想DOMは、実際のDOMの軽量なコピーをメモリ上に保持し、変更を効率的に行うための技術です。
主な特徴
- メモリ上にDOMの複製を作成
- 変更を仮想DOM上で先に適用
- 実際のDOMとの差分のみを更新
仮想DOMの利点
- パフォーマンスの向上
- クロスプラットフォーム対応
- 開発効率の向上
具体例(React使用時)
function App() {
return (
<div>
<h1>こんにちは</h1>
<p>これは仮想DOMの例です</p>
</div>
);
}
このコードは、仮想DOM上で変更が行われ、最終的に実際のDOMに反映されます。
仮想DOMのプロセス
-
初期レンダリング
- アプリケーションが最初にロードされるとき、Reactなどのフレームワークはコンポーネントから仮想DOMを生成し、それを使って実際のDOMを構築します。
-
状態の更新
- アプリケーションの状態が変更されると、新しい仮想DOMが生成されます。
-
差分計算(Diffing)
- 古い仮想DOMと新しい仮想DOMを比較し、変更があった部分(差分)を特定します。
-
効率的な更新
- 差分のみを取り出し、それを使って実際のDOMを更新します。これにより、必要最小限のDOM操作で済み、パフォーマンスが向上します。
図解
[コンポーネント] → [仮想DOMの生成] → [実際のDOMへの反映]
↓
[状態変更]
↓
[新しい仮想DOMの生成]
↓
[古い仮想DOMとの比較]
↓
[差分の特定]
↓
[実際のDOMの効率的な更新]
具体例
例えば、以下のようなコンポーネントがあるとします。
function Counter({ count }) {
return (
<div>
<h1>カウント: {count}</h1>
<button>増加</button>
</div>
);
}
-
初期状態
-
count
が0
のときの仮想DOMが生成され、実際のDOMに反映されます。
-
-
ボタンクリックによる状態更新
-
count
が1
に更新されると、新しい仮想DOMが生成されます。
-
-
差分の計算
- 古い仮想DOMと新しい仮想DOMを比較し、
<h1>
タグ内のテキストが0
から1
に変わったことが特定されます。
- 古い仮想DOMと新しい仮想DOMを比較し、
-
DOMの更新
- 実際のDOMでは、
<h1>
タグ内のテキストだけが"カウント: 1"
に更新されます。
- 実際のDOMでは、
このプロセスにより、全体の再描画を避けて効率的にDOM更新が行われ、パフォーマンスが向上します。
まとめ
- DOMは、ウェブページの構造を表現し、直接操作できるインターフェース
- 仮想DOMは、DOMの軽量なコピーを使用して効率的に更新を行う技術
- 仮想DOMは、大規模なアプリケーションでのパフォーマンス向上に有効
- ReactやVue.jsなどの現代的なフレームワークは仮想DOMを採用している
これらの概念を理解することで、より効率的なウェブアプリケーション開発が可能になります。
Discussion