Vue.js・Reactを触る際に知っておきたい仮想DOMの話

こんにちは、フロントエンドエンジニアの[てりー](https://twitter.com/teriteri_code)です。
僕の詳しいプロフィールは[こちら](https://terrblog.com/about/)

個人的には2024年現在は未経験・独学からプログラミングで稼ぐにはフロントエンド開発が1番手っ取り早いと考えています！

https://terrblog.com/programming-first-front-end/


<!-- wp:heading -->
<h2>記事の概要</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>昨今、様々なプロダクトにおいて使われているVue.jsとReact。<br>人気の理由の1つにリアクティブなブラウザの描画があげられます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ブラウザの再描画を支えている技術が「仮想DOM」なのですが、Vue.js・Reactからフロントエンドを触り始めた自分にとっては「そもそもDOMって何?」状態だったので、「仮想DOMとその背景」についての解説記事を書きました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>技術的な記事ですが、<strong>歴の浅いフロントエンドエンジニアがDOM周りについて最低限の知識を身に付けられる事</strong>を目的に大枠の理解を優先しましたので、ご了承ください。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>そもそもDOMとは</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>仮想DOMについて知る前に、そもそもDOM(仮想DOMとの区別の為、今後はリアルDOMと呼びます)とはなんなのかを知りましょう。<br>リアルDOMとは「Document Object Model」の略で、JavaScript側からHTMLを操作する事の出来る仕組みであり、実際にブラウザで描画されているものです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>リアルDOMを操作する事によって、JavaScriptからHTMLを弄れるため、web上にて見た目の変化が可能になります。</strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>リアルDOMの特徴</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>リアルDOMには以下の特徴があります。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>・HTMLを階層構造として扱う(DOMツリー)<br>・各要素はノードと呼ばれる</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>イメージとして下記のHTMLの場合</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code class="">&lt;html&gt;
 &lt;header&gt;
  &lt;h1&gt;タイトル&lt;h1&gt;
 &lt;/header&gt;
 &lt;body&gt;
  &lt;div&gt;
   &lt;p&gt;内容&lt;/p&gt;
   &lt;button&gt;送信&lt;/button&gt;
　&lt;/div&gt;
 &lt;/body&gt;
&lt;/html&gt;</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397606/53f6a84c-598c-0b8b-3b3a-0fa9b13a446c.jpeg" alt="IMG_2429.HEIC.JPG"><br>リアルDOM上ではこの様な階層構造(DOMツリー)として扱います。またこの1つ1つの要素がノードです。<br>詳しくはこちらを参考にしてください。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://kuroeveryday.blogspot.com/2018/11/difference-between-dom-and-node-and-element.html">https://kuroeveryday.blogspot.com/2018/11/difference-between-dom-and-node-and-element.html</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>リアルDOMのみの流れ</h3>
<!-- /wp:heading -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397606/b47eb5cb-664d-70aa-53e5-1e374cf23b9d.jpeg" alt="IMG_6102.JPG"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>1 HTMLドキュメント<br>2 リアルDOM(DOMツリー)<br>3 webページ<br>の順番で情報は流れていきます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>webページに変化を加えようとした際は、その都度htmlを解析して、DOMツリーを再構築します。<br>その為、<strong>webページへの変化が多いと、再描画まで時間がかかってしまいます。</strong></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>仮想DOMとは</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>その名の通り、仮のDOMです。メモリ空間などで擬似的に作ったものです。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br>今までブラウザで持っていたDOMツリーをJavaScriptのオブジェクトとして扱い、差分のみをリアルDOMに与えてくれる役割を持ちます。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>仮想DOMを用いた流れ</h3>
<!-- /wp:heading -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397606/daae7687-5b86-c40b-19ce-80f8c43f848c.jpeg" alt="IMG_6103.JPG"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>仮想DOMを用いる事により、情報の順番は<br>1 HTMLドキュメント<br>2 仮想DOM<br>3 リアルDOM<br>4 webページ</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>といった形になります。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4>仮想DOM内部の仕組み</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1 DOMツリーを新旧で2つ用意している<br>2 HTMLドキュメントが書き変わる<br>3 仮想DOMを再構築し、新旧DOMでの差分を検出する<br>4 差分のみをリアルDOMに反映する</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>仮想DOMによる恩恵</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><strong>描画のスピードです！笑</strong><br>仮想DOMの存在によって、リアルDOMでは差分のみの読み込みで描画ができる為、ブラウザの再描画のスピードが格段に早くなり、リアクティブな変化にも耐えうるようになりました。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>まとめ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Vue.js・Reactでのリアクティブな変化は仮想DOMの働きによって実現されていました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br>普段の業務でフレームワークを使う際に仮想DOMなどの様に、裏側の原理について必ずしも理解しておく必要はないと思いますが、現段階でなぜここまでVue.js・Reactが広まっているのか？を知る一端にはなりそうです。</p>
<!-- /wp:paragraph -->


## 独学でフロントエンドエンジニアを目指している人へ

フロントエンドの仕事を得るまでにどんな勉強をしたら良いのかをまとめました！！

興味ある方は是非ご覧ください。

https://terrblog.com/how-to-get-front-end-job/