React.js

React コンポーネントのパフォーマンス最適化5ステップ

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

React コンポーネント パフォーマンス最適化方法を実践する5つのステップ

Reactアプリケーションの動作速度を改善したいと考えている開発者にとって、コンポーネントのパフォーマンス最適化は避けて通れない課題です。特にユーザーが操作するたびに再レンダリングが発生し、リストや表形式のデータ表示でメモリ使用量が増加するケースは、プロジェクト全体の効率に大きく影響します。本記事では、コンポーネント分割からプロファイリングツール活用まで、実際の開発現場でも使える最適化手法を体系的に解説し、読者の方がプロジェクトで即座に導入できるよう具体的なコード例も掲載します。


コンポーネント分割による再レンダリング範囲の制限

Reactアプリケーションにおけるパフォーマンス改善の第一ステップは、コンポーネントを責任範囲に応じて適切に分割することです。親コンポーネントが変更されたとき、子コンポーネントが不要に再レンダリングしてしまうケースが多く見られますが、この問題は責務分離の徹底で解消可能です。

コンポーネント分割の基本原則

  • 単一責任の原則(Single Responsibility Principle)を意識し、1つのコンポーネントが担当する業務領域を明確にする
  • 状態管理の最適化:useReducerやContext APIを活用して、複数の子コンポーネントに共通するロジックを集中管理
  • propsの最小限化:必要なデータのみを渡すことで、不要な再レンダリングを抑える

再レンダリング範囲を制限する実装例

以下は、親コンポーネントと子コンポーネントを分割し、再レンダリングの範囲を限定するコード例です。

このように分割することで、ItemListコンポーネントが更新されたときにも、Appコンポーネント全体が再レンダリングする必要がなくなるため、パフォーマンス向上につながります。


不要なレンダリングの防止: React.memoとshouldComponentUpdate

Reactでは、コンポーネントのpropsやstateに変化がない場合でも、デフォルトで再レンダリングが発生します。これを抑えるためにReact.memoshouldComponentUpdateといったメモ化技術を活用する必要があります。

メモ化の仕組みと適用タイミング

  • React.memo: 関数コンポーネントに適用し、propsの差分比較により再レンダリングを防ぐ
  • shouldComponentUpdate: クラスコンポーネントで使用するライフサイクルメソッドで、更新条件を自定义可能

⚠️ 注意点:propsがオブジェクトや配列など深さのあるデータ構造の場合は、shallow comparison(浅い比較)では正確な判定ができず、誤ったメモ化になる可能性があります

shallow comparisonの代替手段

適用シナリオ 解決策 補足
オブジェクト/配列の比較 deep-equalライブラリ JSON.stringifyによる比較は非推奨(パフォーマンス劣化)
状態変更を監視する必要がある場合 immerproduce 不変性を保ちつつ、深く状態を更新可能
プロファイリングツールによる検証 Lighthouse, React DevTools 比較の適切さを可視化で確認

以下はReact.memoを使ったコード例です。


リスト描画のバーチャル化: react-windowやreact-virtualizedの活用

1000アイテム以上のリストを表示する場合、すべてのデータを一度に描画してしまうとメモリ使用量が急増し、パフォーマンス低下やクラッシュの原因となることがあります。このようなケースでは、react-windowやreact-virtualizedといったバーチャルスクロールライブラリを活用するのが効果的です。

バーチャルスクロールの必要性

状況 通常のリスト表示 バーチャルスクロール
描画されるアイテム数 全て(1000項目) 見える範囲だけ(50項目)
メモリ使用量 高い 低い
スクロール時のパフォーマンス ヘビー ラク

実装時のパフォーマンス比較

以下はreact-windowのWindowedListコンポーネントを使ったコード例です。

このように実装すると、描画されるアイテム数が劇的に減り、スクロールもスムーズになります


計算結果キャッシュ: useMemoとuseCallbackの活用

関数コンポーネント内で計算やコールバックを頻繁に実行してしまうと、不必要な再レンダリングやメモリリークの原因になることがあります。これを防ぐために、useMemoとuseCallbackを活用して計算結果をキャッシュする必要があります。

メモ化対象となる処理の判定基準

  • 副作用が発生しない純粋な関数:例:データ整形、値の変換
  • 依存配列に明示された変数が変更されるたびに再実行

依存配列の最適な指定方法

ケース 推奨方法
配列の中身が変化するとき useMemo(..., [JSON.stringify(array)]) を使う
コールバック関数をpropsとして渡すとき useCallbackを使用し、依存配列に注意

⚠️ エラーの例:依存配列に記載していない変数を使うと、メモ化された値が古くなり、意図しない動作になる可能性があります。


プロファイリングツールでのパフォーマンス測定方法

パフォーマンス改善を進めるには、現在の状況を正確に把握するプロファイリングツールの活用が不可欠です。Chrome DevToolsやReact Developer Toolsを使って、レンダリング時間やメモリ使用量を可視化することで、最適化の優先順位を判断できます。

Chrome DevToolsの使用手順

  1. Performanceタブを開く
  2. 「Record」ボタンをクリックして記録開始
  3. 代表的な操作(例:リストスクロール)を行う
  4. 「Stop」ボタンで記録終了

プロファイル結果の分析ポイント

指標 解釈
Rendering Time 1フレームあたりのレンダリング時間(16ms未満が理想)
JS Heap Memory メモリ使用量の変化を確認し、リークの有無をチェック

React Developer Toolsのプロファイリング機能では、各コンポーネントごとのレンダリング回数や時間分布も視覚的に確認できます。


実践する準備を整えましょう

記事で紹介した手法をプロジェクトに適用する際には、導入前のチェックリストを作成し、段階的に実施することが重要です。以下は具体的なステップバイステップガイドです。

導入前のパフォーマンスチェックリスト

  1. コンポーネント分割の有無を確認:再レンダリング範囲が広くないか調査
  2. メモ化対象コンポーネントの選定:React.memoやuseMemoの適用可能性を検討
  3. リスト描画の最適化:react-windowなどのバーチャルライブラリの導入検討
  4. プロファイリングツールでの測定:改善前後のパフォーマンス差を定量的に把握

まとめ

  • コンポーネント分割で再レンダリング範囲を制限する
  • React.memoとshouldComponentUpdateで不要なレンダリング防止を行う
  • react-windowやreact-virtualizedでリスト描画の最適化を実施
  • useMemo/useCallbackで計算結果キャッシュを活用
  • Chrome DevToolsやReact Developer Toolsでパフォーマンス測定・分析

これらのステップを意識しながらプロジェクトに導入することで、Reactアプリケーションの動作速度改善が期待できます。記事で紹介した手法を実際に試してみてください。


スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-React.js