見出し画像

DOMツリーって何なん??

ReactやVue.jsではいずれも描画を最適化する仮想DOM(Virtual DOM)を採用しており、非常に高性能である。

DOMとは?

DOMとは、JavaScriptなどのプログラミング言語とWebページを接続するものである。Document Object Modelの略で、HTMLのドキュメントを「オブジェクトのツリー状の集合」として取り扱う。この仕組みを用いると、JavaScriptでHTML内の要素を操作して、Webページ上に表示される文字色や大きさなどを変更できる。

ブラウザはHTMLをレンダリング(画面描画)するためにDOMツリーを持っている。DOM操作が多くなるとツリーの再構築に時間がかかり、画面表示が遅くなる。仮想DOMはこの処理を効率化するための技術である。

画面アクション前後のDOMの差分を抽出し、変更部分のみ反映させるため、画面への表示が最速化できる。

createdとmounted

<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="UTF-8">
 <title>Hello, World!</title>
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
<div id="app">
 {{ message }}
</div>
<script>
 new Vue({
   el: '#app',
   data: {
     message: 'Hello World!'
   },
   created() {
     //インスタンス生成時に実行される(DOM生成前)
     console.log('created !'); 
     console.log(document.getElementById('app').textContent.trim());
   },
   mounted() {
     //インスタンス生成時に実行される(DOM生成後)
     console.log('mounted !'); 
     console.log(document.getElementById('app').textContent.trim());
   }
 })
</script>
</body>
</html>​

スクリーンショット 2020-10-15 18.18.09

created(DOM生成前のタイミング)では、Vue.jsで処理される前の{{message}}がそのまま表示される。

mounted(DOM生成後のタイミング)では、Vue.jsに処理された後の「Hello, World」が表示される。

createdとmountedではDOMの生成タイミングが異なることがわかる。

ライフサイクルダイアグラム

Vue.jsにはライフサイクルが存在する。たとえば、フックには updated(画面変更時に呼ばれるフック。仮想DOMに差分が発生した際に、差分を画面に反映する際に呼ばれる)や destroyed (Vue インスタンスが破棄された後に呼ばれるフック)などがあり、すべてのライフサイクルフックは、this (JavaScriptに最初から用意されている特別な変数)が Vue インスタンス自身を指す形で実行される。


この記事が気に入ったらサポートをしてみませんか?