レンダリングと描画の違いを整理する

2020/09/12

はじめに

レンダリングと描画を同じ意味で使っていませんか? 会話などカジュアルな場合には気にする必要はありませんが、厳密には違うので整理して理解しましょう!!

DOM の種類

DOM はリアル DOM と仮想 DOM があります。 また、そもそも DOM とは HTML を操作するための API です。 DOM の紹介

  • リアル DOM

    • 実際に表示されている DOM
    • 変更すると画面がそのまま変わる
    • 変更しようとする場合、負荷が大きい処理になる
  • VDOM

    • 単なるデータ
    • 変更しても画面が変更されない
    • 負荷が小さい処理で変更できる

レンダリングとは

state(props)変更前の VDOM と変更後の差分を比較し、差分を検知することで VDOM を再構築すること

レンダリングフロー

  1. 変更前と変更後の差分を比較するための仮想 DOM を二つ用意する
  2. 変更を反映させるため、VDOM を Javascript で操作(一般的にリアル DOM を操作するより速い)
  3. 変更前と変更後の VDOM の差分を比較
  4. 差分だけをリアル DOM に反映する

リアル DOM を操作するよりなぜ早いか

  • DOM を操作するより負荷の小さい処理だから

    • jQuery などを使用して DOM 操作を行う場合、関係のないところも再描画されるから
  • 変更前の VDOM と変更後の VDOM の差分のみを反映させるから

    • 「差分のみ」というのがキモです

描画とは

上記レンダリングフローで反映されたリアル DOM をブラウザに表示させること

再描画のタイミング

  • 関数が再生成された時
  • 変数が再生成された時
  • state の変更があった時
  • 親コンポーネントが再描画された時
  • 親コンポーネントから引き渡されている props が変化した時
  • コンポーネント内で useState で定義している変数が変化した時
  • カスタムフックより受け取っている変数が変化した時

React.memo,useCallback などを使用することで、無駄な再レンダリングを防ぐことができます。 無駄な再レンダリングを防ぐことで、パフォーマンス向上につながります。

figma のパフォーマンス向上についての記事

参考