# React高速化の外注｜再レンダリング改善手順

- 公開日: 2026-08-07
- 監修: 代表取締役 兼 StockSun創業メンバー 板橋 晟星
- URL: https://www.geek-bridge.com/column/react-performance-optimization-guide

React高速化は、推測でメモ化を増やすのではなく、実ユーザー指標とReact Profilerで原因を特定し、再レンダリング、重い処理、JavaScript配信量を影響度の高い順に改善します。一般的な外注目安は、診断のみで20万〜60万円・1〜3週間、限定的な改修で50万〜150万円・1〜2か月です。

## React高速化の判断基準と費用・期間の目安

Reactアプリの性能改善では、まず「どの画面の、どの操作が、誰にとって遅いのか」を明確にします。初期表示が遅い場合と、検索や入力への反応が遅い場合では、調査対象も改善方法も異なるからです。

発注者が確認したい代表的な指標は、Core Web Vitals（＝Webページの主要な利用体験を表す指標）とReact固有の描画時間です。

| 指標 | 良好の目安 | 確認できること | 主に疑う箇所 |
|---|---:|---|---|
| LCP | 2.5秒以下 | 主要コンテンツが表示されるまでの時間 | 画像、フォント、API応答、JavaScript配信量 |
| INP | 200ミリ秒以下 | クリックや入力に対する応答性 | イベント処理、重い計算、再レンダリング |
| CLS | 0.1以下 | 表示中のレイアウトのずれ | 画像サイズ未指定、後から挿入されるUI、フォント |
| Reactのcommit時間 | 一律の基準なし | Reactが画面へ変更を反映する時間 | コンポーネント数、DOM更新量、重い子要素 |
| JavaScript配信量 | 一律の基準なし | 初期表示時に取得・解析するプログラム量 | 大型ライブラリ、コード分割不足、重複依存 |

LCP・INP・CLSは、原則として実ユーザーデータの75パーセンタイルで評価します。75パーセンタイルとは、利用者の75％がその数値以下に収まる地点です。平均値だけを見ると、低性能端末や遅い回線で困っている利用者を見落とす場合があります。

計測方法は、次の2種類を使い分けます。

- ラボ計測：通信速度や端末性能を固定したテスト環境での計測。変更前後を比較しやすい
- RUM（Real User Monitoring＝実際の利用者環境で性能を測る方法）：公開後の実態を把握しやすい

LighthouseやChrome DevToolsの結果だけで「全ユーザーが速くなった」とは判断できません。一方、利用者数が少ない業務システムでは十分なRUMデータが集まらないこともあるため、操作条件を固定したラボ計測を受け入れ基準にする方法が現実的です。

外注費用と期間は、対象画面数、原因の深さ、テスト範囲、既存コードの状態によって変わります。一般的な目安は次のとおりです。

| 依頼範囲 | 費用の目安 | 期間の目安 | 主な成果物 |
|---|---:|---:|---|
| 性能診断・改善計画のみ | 20万〜60万円 | 1〜3週間 | 計測結果、原因一覧、改善優先順位、概算見積もり |
| 1〜3画面の限定的な改善 | 50万〜150万円 | 1〜2か月 | 再レンダリング改善、コード分割、テスト、比較レポート |
| 複数画面・共通基盤の改善 | 150万〜500万円以上 | 2〜6か月 | 状態管理や画面構成の見直し、段階的改修、回帰テスト |
| 継続的な性能監視・改善 | 月額30万〜100万円程度 | 3か月〜 | 定期計測、リリース監視、改善バックログ |

これは一般的な目安であり、バックエンドやデータベース、インフラの改修まで必要になると費用は上がります。反対に、原因が特定済みで対象画面も限定されていれば、小規模な改修で改善できることがあります。

発注のご相談を受ける立場では、「Reactだから遅いので、Reactだけ直してほしい」という相談を受けることがあります。しかし、実際にはAPIの応答遅延、画像容量、外部タグ、データベース検索などが主因の場合もあります。最初からフロントエンド改修に限定せず、通信から画面描画まで調査できる範囲で見積もりを依頼することが重要です。

## 計測から改善・検収までの実践手順

React高速化は、対象操作を絞り、変更前の基準値を残してから着手します。複数の画面を同時に調べるより、利用頻度や事業影響の大きい操作から順番に検証した方が、費用対効果を判断しやすくなります。

### 1. 遅い画面と操作を具体化する

「管理画面が重い」ではなく、次のように利用場面まで指定します。

- 商品一覧を初めて開くまでに時間がかかる
- 5,000件のデータがある状態で検索条件を変更すると固まる
- 入力フォームで文字を打つたびに反応が遅れる
- グラフを含むダッシュボードの初期表示が遅い
- 低価格帯のスマートフォンでメニュー操作が遅れる

あわせて、その画面の利用頻度、離脱率、問い合わせ件数、作業時間への影響を確認します。性能上は遅くてもほとんど使われない画面より、毎日全社員が使う検索画面を優先した方が、投資効果が高いことがあります。

### 2. 再現条件と改善目標を決める

ブラウザ、画面幅、端末性能、通信条件、ログインユーザー、データ件数を固定します。開発モードは追加の検査処理によって本番環境と挙動が異なるため、最終評価には本番相当のビルドを使用します。

目標は「できるだけ速くする」ではなく、例えば次のように定義します。

- 商品一覧のINPを実ユーザー計測の75パーセンタイルで200ミリ秒以下にする
- 主要ページのLCPを2.5秒以下にする
- 検索条件変更時のReact commit時間を変更前より30％以上短縮する
- 初期表示で読み込むJavaScriptを変更前より25％削減する
- 5,000件表示時でも入力欄への文字入力を妨げない

削減率はあくまで設定例です。現状値や業務要件を確認し、開発会社と合意して決めます。

### 3. ボトルネックを切り分ける

調査では、次の順番で利用者の操作から原因へたどります。

1. Chrome DevToolsなどで通信、JavaScript実行、レイアウト処理を時系列で確認する
2. Long Task（＝メインスレッドを50ミリ秒以上占有する長い処理）の発生箇所を探す
3. React Profiler（＝コンポーネントの描画時間と更新理由を調べる公式分析機能）で再レンダリングを確認する
4. NetworkパネルでAPI、画像、フォント、外部タグの待ち時間を確認する
5. バンドル解析でJavaScriptの内訳と大型ライブラリを特定する
6. APIやデータベースが原因の場合は、サーバー側のログや処理時間まで調査する

再レンダリング回数だけで良否を判断してはいけません。短時間で終わる正常な更新を減らしても、体感速度はほとんど変わらないことがあります。時間のかかる処理、利用頻度、影響する利用者数を合わせて評価します。

なお、開発環境のStrict Modeでは問題を検出するために処理が複数回実行されたように見える場合があります。開発環境だけの現象なのか、本番でも発生する不要な更新なのかを切り分ける必要があります。

### 4. 小さく改修して同条件で再計測する

複数の施策を一度に入れると、どの変更が効いたのか分からなくなります。対象画面や改善仮説ごとに小さく変更し、同じ条件で3〜5回程度測って中央値を比較します。

検収時には、少なくとも次の資料を受け取ります。

- 変更前後の計測条件と結果
- ボトルネックの原因と採用した対策
- 採用しなかった対策とその理由
- 対象ブラウザ・端末での回帰テスト結果
- 今後の監視方法と性能が悪化した場合の判断基準

## 再レンダリングとJavaScript配信量の改善優先順位

Reactでは、再レンダリング自体は正常な仕組みです。問題になるのは、表示内容が変わらない重いコンポーネントが繰り返し更新される場合や、1回の更新で大量の計算・DOM操作が発生する場合です。

代表的な原因と対策を整理すると、次のようになります。

| 原因 | 検討する対策 | 発注・レビュー時の注意点 |
|---|---|---|
| 親の更新に伴って重い子要素も更新される | memo（＝入力が同じなら再描画を省く仕組み） | 描画が軽い場合は比較コストの方が大きくなることがある |
| 関数・配列・オブジェクトが毎回作られる | useCallback、useMemoによる参照の安定化 | 一律に追加せず、Profilerで効果を確認する |
| 共有状態が広範囲を更新する | Contextや状態管理の責務を分割する | 状態設計の変更は回帰テスト範囲が広くなりやすい |
| 入力のたびに検索・集計が走る | debounce（＝処理を一定時間まとめる方法）、遅延更新 | 入力欄そのものの反応は遅らせない |
| 数千件の要素を一括表示する | ページング、仮想スクロール | キーボード操作、読み上げ、行高の変化も確認する |
| 重い計算を画面更新のたびに実行する | 計算結果の再利用、サーバー側処理、Web Worker | データ量と処理頻度を見て配置を決める |
| 初期画面で使わない機能も読み込む | コード分割、遅延読み込み | 操作後に新たな待ち時間が生じる点を考慮する |
| APIを順番に待っている | 並列化、キャッシュ、取得設計の変更 | データの依存関係と更新整合性を確認する |

優先順位は、原則として次の考え方で決めます。

1. 不要な処理やDOMをなくす
2. 重い処理の実行回数を減らす
3. 大量データを分割・仮想化する
4. 初期表示に不要なJavaScriptを後から読み込む
5. 低優先度の更新を遅らせ、入力やクリックへの応答を守る
6. 必要に応じてレンダリング方式やアーキテクチャを見直す

useMemoやmemoを広範囲に追加するだけの提案には注意が必要です。メモ化にも値の保持や比較のコストがあり、コードの理解や保守を難しくします。計測結果に差がない場合は、導入しない、または取り外す判断も必要です。

JavaScript配信量を改善するときは、次を確認します。

- 大型のグラフ、表計算、エディタ機能を初期表示で読み込んでいないか
- 同じライブラリの複数バージョンが混在していないか
- ライブラリ全体ではなく必要な機能だけを利用できないか
- 管理画面など、利用時点が明確な機能を画面単位で分割できないか
- 外部の広告・分析タグがメインスレッドを長時間占有していないか
- LCP対象の画像に適切な寸法、圧縮、読み込み優先度が設定されているか

SSR（＝サーバーでHTMLを生成して返す方式）やSSG（＝事前にHTMLを生成する方式）は初期表示の改善候補ですが、採用すれば必ず速くなるわけではありません。ブラウザ側でReactを動かすためのJavaScript、ハイドレーション、サーバー処理、キャッシュ設計まで含めて比較します。

また、読み込み表示やスケルトン画面を追加するだけでは、実処理は速くなりません。待ち時間を分かりやすくする施策と、処理時間を短くする施策を分けて評価することが大切です。

## 外注前の準備・見積もり・開発会社の選び方

React高速化を外注する場合は、技術的な解決方法を発注者側で指定する必要はありません。ただし、対象画面、利用状況、現状値、希望する成果を整理しておくと、調査費用と見積もりのぶれを抑えられます。

### 依頼前に用意するチェックリスト

- [ ] 対象URL、画面名、操作手順
- [ ] 遅さを感じる端末、ブラウザ、時間帯
- [ ] 本番に近いデータ件数とテストアカウント
- [ ] Lighthouse、RUM、問い合わせなど既存の情報
- [ ] React、フレームワーク、主要ライブラリのバージョン
- [ ] ソースコード、テスト環境、監視ツールへのアクセス可否
- [ ] 対応ブラウザと最低端末性能
- [ ] リリースできない時期や停止可能時間
- [ ] 予算上限と希望時期
- [ ] 性能以外に変更してはいけない仕様

依頼内容を文書化する場合は、RFP（＝開発会社へ要件や提案条件を伝える依頼書）としてまとめると比較しやすくなります。作成項目は、[RFPの作り方｜システム開発の依頼準備](https://www.geek-bridge.com/column/system-development-rfp-creation-guide)も参考にしてください。

### 見積書で確認する項目

| 見積項目 | 確認したい内容 |
|---|---|
| 現状調査 | 対象画面、端末、データ量、フロント以外の調査範囲 |
| 改善設計 | 原因分析、施策の優先順位、効果予測を含むか |
| 実装 | 対象コンポーネント、共通部分、依存ライブラリ更新の有無 |
| テスト | 機能回帰、ブラウザ、端末、アクセシビリティの範囲 |
| 性能検証 | 変更前後をどの条件・指標で比較するか |
| リリース | 本番反映、監視、問題発生時の切り戻しを含むか |
| 保証・保守 | 不具合対応期間と性能悪化時の再調査条件 |

特に確認したいのは、「性能が改善した状態」の定義です。特定のLighthouse点数だけを成果条件にすると、実際の利用者環境やログイン後の操作性能を評価できない場合があります。画面、操作、端末、データ件数、指標、計測方法をセットで合意してください。

複数社を比較するときは、全社に同じ再現条件と資料を渡します。見積金額だけでなく、調査仮説、対象外事項、テスト範囲、成果物も比較しましょう。具体的な比較方法は、[システム開発の相見積もり｜取り方と比較方法](https://www.geek-bridge.com/column/system-development-quote-comparison-guide)で解説しています。

### 契約方式の考え方

原因が分からない段階から固定金額の請負契約にすると、開発会社が大きなリスク費を見込むか、調査範囲が狭くなることがあります。最初は準委任契約（＝作業時間や専門業務の遂行に対して支払う契約）で診断し、対象と受け入れ条件が固まってから請負契約（＝合意した成果物の完成を目的とする契約）へ分ける方法もあります。

例えば、次の2段階です。

1. 1〜3週間の性能診断で、現状値、原因、改善候補、概算費用を提示してもらう
2. 優先施策を選び、対象画面と検収条件を定めて改修を発注する

この進め方なら、原因が不明なまま大規模な改修を契約するリスクを抑えられます。

### 開発会社を見極める質問

- React ProfilerとブラウザのPerformance計測をどのように使い分けますか
- フロントエンド以外が原因だった場合、どこまで調査できますか
- 本番相当のデータ量と低性能端末で検証できますか
- 変更前後の結果をどの形式で報告しますか
- 機能回帰やアクセシビリティをどのように確認しますか
- 効果が小さい施策を中止する判断基準はありますか
- リリース後に性能が戻った場合、どのように検知しますか

優れた提案は、最初から特定の実装方法を断定するのではなく、計測、仮説、検証、優先順位の順序が明確です。「useMemoを入れれば解決する」「SSRへ変えれば必ず速くなる」といった単一施策だけの提案では、対象アプリの原因分析が十分か確認しましょう。

### よくある失敗と回避策

| よくある失敗 | 起きる問題 | 回避策 |
|---|---|---|
| Lighthouseの点数だけを目標にする | 実際の検索・入力操作が改善しない | RUM、INP、対象操作の時間も評価する |
| 全画面を一括で最適化する | 費用が膨らみ、効果の高い施策が不明になる | 重要画面から段階的に進める |
| 再レンダリング回数だけを減らす | コードが複雑になる一方、体感差が出ない | 描画時間と利用頻度で優先順位を決める |
| 本番より少ないデータで試験する | 公開後に大量データで再び遅くなる | 想定最大件数に近い条件を用意する |
| 性能改善と同時に大幅な機能追加をする | 改善効果と不具合原因を切り分けにくい | リリース単位を分ける |
| 公開後の監視を行わない | 機能追加で性能が徐々に悪化する | 継続計測と警告基準を設ける |

性能要件の整理、現状診断、改修範囲の切り分けから支援が必要な場合は、[開発のご相談はこちら](https://www.geek-bridge.com/#contact)をご利用ください。

## まとめ

- React高速化は、初期表示、操作応答、画面更新のどこが遅いかを最初に切り分けます
- Core Web Vitalsは、LCP 2.5秒以下、INP 200ミリ秒以下、CLS 0.1以下が良好の目安です
- 外注費用は、診断のみで20万〜60万円、限定的な改修で50万〜150万円が一般的な目安です
- 再レンダリングは回数ではなく、描画時間、利用頻度、ユーザーへの影響で評価します
- memoやuseMemoは一律に追加せず、Profilerで改善効果を確認します
- JavaScript配信量、API、画像、外部タグなど、React以外の原因も調査対象に含めます
- 見積もりでは、計測条件、対象範囲、テスト、変更前後の報告方法を確認します
- 原因が不明な場合は、診断と実装を分けて発注すると費用と範囲を管理しやすくなります

## よくある質問

### Q1. React高速化で最初に行うべきことは何ですか？

対象画面と遅い操作を一つに絞り、本番相当の環境で変更前の数値を計測します。React Profilerだけでなく、通信、API、画像、JavaScript実行時間も確認し、フロントエンド以外の原因を含めて切り分けることが重要です。

### Q2. React高速化を外注する費用はいくらですか？

一般的な目安は、性能診断のみで20万〜60万円、1〜3画面の限定的な改修で50万〜150万円、複数画面や状態管理を含む改修で150万〜500万円以上です。対象範囲、データ量、テスト端末、バックエンド改修の有無で変動します。

### Q3. useMemoやReact.memoを増やせば速くなりますか？

必ずしも速くなりません。メモ化にも比較や値を保持するコストがあり、軽いコンポーネントでは効果が出ない場合があります。重い処理が同じ入力で繰り返されていることをProfilerで確認し、変更前後を計測して採用を判断します。

### Q4. React高速化の検収条件はどう決めればよいですか？

対象画面、操作手順、端末、通信条件、データ件数、指標、目標値をセットで決めます。Core Web Vitalsに加え、検索や入力など対象操作の応答時間、Reactのcommit時間、JavaScript配信量を変更前後で比較すると判断しやすくなります。