VirtualDOMの仕事ってなに？(Reactの表示速度がはやい理由)

最近「Reactは、はやい」という題でLTをしました。
そのときに説明した内容を文字に起こしたのがこの記事です。
LTでは何も知らない人もVirtualDOM(仮想DOM)の仕事がなんとなく分かる説明になるように心がけたので、
そこそこ噛み砕かれた内容になっているかと思います。

「もちろん、Reactは走るのが速いわけではない」のようなネタスライドも少し入っていたので、
ここではそれらは省略して説明スライドだけかいつまんで説明することにしました。
スライドは[こちら](https://speakerdeck.com/risagon/reactha-hayai)

# Reactとは
webページで私たちが見ている画面の表示に特化したJavaScriptのライブラリです。

# 今までブラウザでページを見るときどのようなことが行われていたの？

## まず、DOMについて
DOMはブラウザでページを見るときに基本的に作られるもので、これをもとにページを描画しています。
DOMを作ることでJavaScriptからHTMLのタグをいじることができますが、
今回はとりあえず「DOMとはページを見るときにつくられるもの」だと思ってもらえれば大丈夫です。

## 今までどのようなことが行われていたの?

<img width="80%" alt="スクリーンショット 2017-03-26 23.59.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/141150/01ba04f2-75da-aec2-cad5-77fc4f0643eb.png">

## 問題
実はDOMをいちからつくる作業に結構時間がかかります。

<img width="80%" alt="スクリーンショット 2017-03-27 12.50.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/141150/44341573-e784-fb29-cb91-e83ce32ca204.png">

新しい情報がやってくるたびにわたしたちはDOMがいちから作られるのを待たなければならなかったのです...

# Reactをつかうと
Reactでは情報を受け取ってもいきなりDOMをいちから作ることはしません。

![スクリーンショット 2017-03-27 0.00.00.png](https://qiita-image-store.s3.amazonaws.com/0/141150/e859efe6-71d0-b1ee-070b-734eeba96fcc.png)

まず仮想DOMを作成 し、
次に仮想DOMの内容を元にDOMを作成 し、
最後にブラウザに描画します。

## 仮想DOMとは
実際のDOMと対になるものです。その名の通り仮のDOM。
DOMより**はやく**作ることができるように設計されています。（はやくの部分が重要ポイント)
仮想DOMは新しい情報が入ってきたときに役立ちます！
（新しい情報が入ってきたときに役立つ、というのは
例えばHeaderやFooterが同じで中身の情報が新しく入ってくるときのように、
「画面の一部分を新しい情報（やデータ）に変更するとき」に役立つということです。）

## 新しい情報が入ってきたとき
新しい情報がやってくる前の状態が下の画像です。

<img width="80%" alt="スクリーンショット 2017-03-27 12.51.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/141150/bd5a8842-57ba-407a-3079-1ce90a3cbfe4.png">

新しい情報がやってくると、その情報をもとに新しい仮想DOMをいちから作ります。
赤い部分が新しい部分です。

<img width="80%" alt="スクリーンショット 2017-03-27 12.51.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/141150/7c127146-b8ca-29da-ccda-3dca81fb4452.png">

次に新しい仮想DOMともとからある古い仮想DOMを比較し、変更分をみます。

<img width="80%" alt="スクリーンショット 2017-03-27 12.51.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/141150/39124b1f-2ca4-5c4b-f9b7-e735a6f4c4bf.png">

そして変更されたところだけDOMを再構築します。
ここは変更されたところだけDOMが消えて

![スクリーンショット 2017-03-27 12.51.41.png](https://qiita-image-store.s3.amazonaws.com/0/141150/0d4fc428-f8d7-77e3-e54a-e5b2b7977214.png)

新しく生成される様子がアニメーションになっていました！

![スクリーンショット 2017-03-27 12.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/141150/0c8ff951-6702-0e79-f420-4b240c0a2356.png)

そして再構築されたDOMをもとにページが描画され、私たちは新しい情報を見ることができるのです。

どうしてReactを使うと表示速度がはやいかというと、
まず仮想DOMは作るのに時間がDOMほどかからないのではやい。
次に行われるDOMの再構築も、一部分だけなのではやい。
そのふたつの処理がはやく終わるおかげで表示速度がはやいというわけです。

![スクリーンショット 2017-03-27 12.52.03.png](https://qiita-image-store.s3.amazonaws.com/0/141150/ee911c9f-daf4-bf4e-b023-0df2387ca9c1.png)

これでReactの表示速度が速い理由の説明は終わりです。

# 比較してみよう
仮想DOMの説明をされただけだとわかりにくいので従来の表示とReactを使った表示とを比べてみました。
まず最初に同時に新しい情報が入ってきます。

![スクリーンショット 2017-03-27 12.52.10.png](https://qiita-image-store.s3.amazonaws.com/0/141150/7e50929b-7479-d11c-7f85-71cbd273c266.png)

従来の表示だとDOMをいちから再構築するのに時間がかかりすぎて、女の子も見切れてしまうほど時間がかかってしまっています。
しかしReactを使った表示では、新しい仮想DOMをいちからつくるのに時間がかからず、さらに差分だけDOMを再構築するのもそれほど時間がかからないので女の子は新しい情報にはやくありつけています。やった！

# まとめ
仮想DOMを作る時間が短く、さらに差分だけDOMを再構築するようになっているおかげで、
Reactをつかえば早く表示できる！
ということです。

# 参考にしたサイト・本

* [『WebデベロッパーのためのReact開発入門 JavaScript UIライブラリの基本と活用』
柴田文彦著](https://www.amazon.co.jp/Web%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEReact%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-JavaScript-UI%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E6%B4%BB%E7%94%A8-%E6%9F%B4%E7%94%B0-%E6%96%87%E5%BD%A6-ebook/dp/B01N1GOX62/ref=sr_1_1?ie=UTF8&qid=1490805048&sr=8-1&keywords=Web%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEReact%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80+JavaScript+UI%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E6%B4%BB%E7%94%A8)
* [ブラウザのしくみ: 最新ウェブブラウザの内部構造 - HTML5 Rocks](https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/#DOM)
* [俗人プログラマ : DOM:JavaScriptからHTMLを操作する](http://blog.livedoor.jp/yo_miz/archives/53540189.html)
* [これから始めるReact.js - React.jsとは | CodeGrid](https://app.codegrid.net/entry/react-1#toc-2)
* [JavaScriptでDOMを操作する方法【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/5638)
* [Reactとは? – React入門 - to-R Media](https://www.to-r.net/media/react-tutorial01/)