Open9

Reactのパフォーマンスチューニング

らんす🍐らんす🍐

Reactのパフォーマンスチューニングについて、調べたことをまとめていきます。

らんす🍐らんす🍐

パフォーマンスを意識せずに、Reactでそこそこの規模のWebアプリを作成すると、動きがもっさりする。
この主な原因としては、コンポーネントの再描画のコストが大いこと。

らんす🍐らんす🍐

コンポーネントの再描画は以下の契機で発生する。

  • 親のコンポーネントが再描画された。
    • Propsに変更がない場合でも再描画が実行される。
  • useStateuseReducerで取得したstateが更新された。
    • useStateやuseReducerを呼び出しているFCが再描画される。
  • useContextで取得したstateが更新された。
    • Provider配下全てではなく、useContextでstateを取得しているFCが再描画される。
      (当然その子孫コンポーネントも再描画される)
らんす🍐らんす🍐

パフォーマンスチューニングのアプローチは以下の通り

  • React.memo
  • memo + useCallback
  • useMemo
  • Contextの分割
らんす🍐らんす🍐

React.memo

概要

  • レンダリング結果をキャッシュする。(propsが変わった場合のみレンダリングされる)
    • 正確には第2引数で、比較関数を書ける

方針

  • 基本的に全コンポーネントに適用する(本当は乱用は避けるべき)
    • ただし以下は除外
      • 各ページのルートとなるコンポーネント
らんす🍐らんす🍐

useCallback

概要

  • 生成された関数をキャッシュする。

方針

  • 子コンポーネントにPropsでハンドラーを渡す場合に適用する。
    • = ハンドラーを即時関数で渡すことは禁止(一旦useCallbackでラップして変数代入する)
らんす🍐らんす🍐

useMemo

概要

  • 計算結果をキャッシュする。

方針

  • フロントで重い処理をする関数で利用する。
    • 配列処理で、サイズが大きくなる可能性がある部分についても予め追記しておく。
らんす🍐らんす🍐

注意

  • useCallback,useMemoの第二引数には注意する。
    • 意図したタイミングで再生成されている、されていないこと両方を確認すること