26.02.10
React Nativeのパフォーマンス改善:現場で効く10施策(計測→原因特定→改善の実務ガイド)
React Nativeのパフォーマンス問題は、「 React Native だから遅い」「端末が悪い」で片付けられがちですが、現場で実際に遅くなる理由はもっと具体的です。
多くの場合、ボトルネックは①JSスレッド(ロジックや再レンダー)、②UIスレッド(レイアウトや描画)、③ブリッジ/通信(大量イベントやデータ転送)、④画像・アニメーション、⑤起動〜初期表示、⑥ナビゲーションや画面遷移、に分かれます。
つまり改善の正解は「とりあえず最適化」ではなく、まず遅さの種類を分け、次に計測で原因を特定し、最後に最小の変更で効果が出る順に打つことです。
本記事では、検索意図として多い「何から見ればいい?」「何を直せば体感が変わる?」「現場で使える具体策は?」に答えるために、計測の型→原因分類→10施策→よくある罠→チェックリストまで、実務に落とした形で整理します。
読むだけで終わらせないために、各施策は“症状”“確認方法”“打ち手”“副作用/注意点”の観点で解説します。
React Nativeの改善は、正しくやれば短期間で体感を変えられます。
目次
まず結論:パフォーマンス改善は「体感の優先順位」を決めると失敗しない
最初にやるべき“計測”と原因切り分けの基本
よくある症状別に「原因候補→当たり」を当てる早見表
よくある“逆効果”の最適化と落とし穴(やりがちだけど効かない)
現場で使える“改善の進め方”テンプレ(1〜2週間で体感を変える)
まとめ:RN改善は「計測→原因分類→10施策の優先適用」で短期に体感が変わる
React Native の改善でありがちな失敗は、数字を追うことが目的化し、ユーザー体験に効かない最適化を続けてしまうことです。
たとえば、CPU使用率を少し下げても、スクロールのカクつきが残るならユーザーは離脱します。
逆に、アニメーションが滑らかになり、初回表示が1秒短縮され、入力遅延が消えるなら、多少の内部指標が悪くても体感は良くなります。
そこで最初に決めるべきは、体感の優先順位です。
多くのプロダクトでは、
①起動/初期表示
②一覧スクロール
③画面遷移
④入力(タイピングやタップ反応)
⑤画像表示
の順で体感に効きます。
これを決めたうえで、改善対象を絞り、計測→改善→再計測のサイクルを回します。
特に React Nativeでは、1つの根本原因が複数症状(スクロール、遷移、入力遅延)に波及することがあるため、「どの体感を改善するか」を明確にするほど、最短で成果が出ます。
本記事の10施策は、現場で効果が出やすい順と、頻出の原因に基づいて並べています。
改善の前に計測が必要なのは、最適化が「推測」になった瞬間に工数が溶けるからです。
React Nativeの計測は難しそうに見えますが、現場でまず押さえるべきはシンプルです。
第一に、遅さが「JS起因」か「UI起因」かを分けます。
JS起因は、イベント処理や状態更新が重く、JSスレッドが詰まって反応が遅くなるタイプです。
UI起因は、レイアウト計算や描画・アニメーションでUI側が詰まり、スクロールや遷移がカクつくタイプです。
第二に、症状が出る操作(例:一覧を速くスクロール、フィルタ切替、検索入力、画面遷移)を“再現手順”として固定します。
第三に、ReactのProfiler(コンポーネント再レンダー)と、JSフレーム/UIフレームの落ち込み(FPSの低下)を見て、どちらが先に崩れているかを確認します。
ここまでできれば、対策の方向性が定まります。
例えば再レンダーが多いならメモ化・状態分割へ、UIフレームが落ちるならアニメーションの実装や画像・影・透明度など描画コストへ、ブリッジが詰まるならイベント回数削減やデータ転送の見直しへ、という具合です。
計測は“完璧”でなくてよく、方向性が定まる最低限で十分です。
読者が一番知りたいのは「で、私のアプリは何が原因っぽいの?」という実務の当たり付けです。
症状別に当たりやすい原因候補を整理します。
①一覧スクロールがカクつく:FlatListの設定不備、行コンポーネントの再レンダー過多、画像のデコード/サイズ過大、影や透明度など描画コスト、onScrollイベントの過剰処理。
②入力が遅れる(文字が遅れて出る):JSスレッド詰まり(重い計算、頻繁なsetState、デバウンス不足)、フォームの再レンダー地獄。
③画面遷移が重い:初期ロードが重い(大きいJSバンドル)、画面コンポーネントが一気に描画、画像やAPI待ちのブロック、ナビゲーションの設定やアニメーション負荷。
④起動が遅い:Hermes未導入、初期化処理の集中、不要な同期I/O、巨大依存の読み込み、初回フォント/画像準備。
⑤特定端末だけ遅い:Androidの画像/影/オーバードロー、低メモリ端末でのGC、iOSの大きいblur/透明、など。
原因候補が見えると、10施策のうち何から当てるべきかが決まります。
以降は、現場で再現性が高い改善施策を、優先度の高いものから提示します。
RNの体感劣化で最頻出なのが「不要な再レンダー」です。
一覧やフォーム、複雑な画面で、状態が変わるたびに大量のコンポーネントが再レンダーされると、JSスレッドが詰まり、スクロールや入力が重くなります。
まずやるべきは、どのコンポーネントが頻繁に再レンダーしているかを可視化し、再レンダーの伝播を止めることです。
実務では、
(1)propsが変わらないのに再レンダーする部品をReact.memoで抑える
(2)配列やオブジェクトを毎回新規生成してpropsが変わってしまう箇所をuseMemoで安定化する
(3)イベントハンドラの参照が毎回変わることで子が再レンダーする場合はuseCallbackで固定する
(4)巨大なstateを1つに持たず、必要な粒度で分割して影響範囲を狭める
が鉄板です。
注意点として、メモ化は万能ではなく、むやみに増やすと可読性が落ちたり、逆に比較コストで遅くなることもあります。
まずは“レンダー回数が多い/重い部品”から限定的に適用するのが安全です。体感としては、入力遅延やタップ反応の改善に直結しやすい施策です。
一覧スクロールのカクつきは、RN改善の中でも最もROIが高い領域です。
理由は、ユーザーが最も長く触れる操作がスクロールであり、体感差が顕著だからです。
まず、FlatListを「正しくウィンドウ化」できているかを見ます。
行のkeyExtractorが安定していない、renderItemが毎回新規関数で作られている、extraDataの扱いで不要な再レンダーが起きる、などは典型的な落とし穴です。
さらに、getItemLayoutが設定できる場合(固定高に近い場合)は積極的に使うと、スクロール時のレイアウト計算が減り効果が出ます。
WindowSizeやinitialNumToRender、maxToRenderPerBatch、updateCellsBatchingPeriodなどは、端末スペックとUI設計に依存しますが、基本方針は「初期は必要最低限、スクロールに合わせて段階描画」です。
画像を多用する一覧は、行コンポーネントの軽量化(メモ化・分割)とセットでやると効きます。
注意点として、描画を絞りすぎると“白い空白”が出るなどUXが悪化するため、端末別に体感を確認しながら調整します。
FlatListのチューニングは、改善効果が分かりやすく、支援価値を示しやすい施策です。
入力遅延やタップ反応の悪さは、ほとんどの場合JSスレッドの詰まりが原因です。
典型は、
(1)入力のたびにAPIを叩く/フィルタを走らせる
(2)巨大な配列操作(ソート/フィルタ/集計)をメインスレッドで実行
(3)アニメーション中に高頻度で状態更新
(4)onScrollなど高頻度イベントで重い処理
です。
対策は、まず“回数を減らす”。
入力はデバウンス/スロットルを入れて、必要なタイミングでだけ処理します。
次に“処理を小さくする”。
一度に全部計算せず、分割やキャッシュで繰り返し計算を減らします。
さらに“処理の場所を変える”。場合によってはネイティブ側へ寄せたり、バックエンドで処理し結果だけ受け取るほうが良いこともあります。
React Nativeの改善で効くのは「JSで頑張りすぎない」設計です。
注意点として、デバウンスを強くしすぎると操作レスポンスが悪化するため、ユーザーの期待に合わせて適切な遅延を選びます。
JSスレッドの詰まりを解消できると、アプリ全体が“軽くなった”感を出しやすいです。
ReactNativeの現場で“地味に効く”のが画像最適化です。
一覧のサムネイル、商品画像、ユーザーアイコンなど、画像が多い画面ほどパフォーマンスが落ちやすく、しかも原因に気づきにくいからです。
改善の第一歩は「表示サイズに対して画像が大きすぎないか」を確認することです。
デコードやリサイズの負荷は端末側に乗るため、必要以上の解像度画像をそのまま出すとスクロールがカクつきます。
次にフォーマット。
透過や写真の特性に合わせ、圧縮率・容量を最適化します。
さらに、表示の仕方。プレースホルダーを出して先にレイアウトを安定させ、画像ロードを非同期で流すことで体感が良くなります。
キャッシュ戦略も重要で、同じ画像を何度も取りに行かない設計にするとネットワーク起因の“遅い”が減ります。
注意点として、過度な圧縮は画質劣化でUXが下がるため、ユーザー価値の高い画像は品質を守り、一覧などは軽さを優先するなどメリハリを付けます。
画像最適化は、スクロール・初期表示の両方に効く“二刀流”の施策です。
アニメーションのカクつきは、UIスレッド側の負荷か、JS駆動アニメーションによる詰まりが原因になります。
現場では「動いてはいるが滑らかではない」「スクロール中にアニメが引っかかる」といった症状で現れます。
基本戦略は、アニメーションを“UI側で完結”させ、JSスレッドの影響を受けにくくすることです。
特に、スクロールに連動するアニメーションや頻繁に更新される値は、JSで毎フレーム処理するのではなく、UI側の仕組みを使う方が体感が安定します。
また、影(shadow)、透明度(opacity)の重ねすぎ、blur、巨大な画像の拡大縮小など、描画コストの高い表現は端末によって大きく差が出るため、UIデザインの段階で“軽い表現”へ寄せるのも強力な改善です。
注意点として、見た目のリッチさを落とす決断が必要な場合があるため、プロダクトの価値とトレードオフを整理して合意形成することが大切です。
アニメ改善は、評価が「体感」なので、改善前後を動画比較すると関係者が納得しやすいです。
画面遷移が重いと、ユーザーは「固まった」と感じ、離脱や低評価につながります。遷移が重い原因は、遷移そのものより「遷移先で一気にやりすぎる」ことが多いです。
例えば、画面表示の瞬間に大量のコンポーネントを描画し、同時にAPIを複数叩き、画像を読み込み、状態管理も更新…という状態です。
対策は、初期描画を軽くして“まず画面を出す”こと。
ファーストビューに必要な要素だけを先に描画し、下部や非表示領域は後から描画する、APIも重要度順に読み込む、ローディングやスケルトンを適切に使って体感を良くする、といった設計が効きます。
さらに、画面単位の遅延ロード(必要になってから読み込む)を使うと、初期のJSバンドルを軽くでき、遷移も起動も改善します。
注意点として、遅延ロードは分割の設計が必要で、エラー処理や通信失敗時のUXも合わせて設計しないと不安定になるため、運用まで含めて整えます。
RNアプリで「起動が遅い」は、ユーザー体験の最初で失点するため致命的です。
起動が遅くなる主因は、アプリ起動時に大量の初期化を詰め込みすぎることです。
分析SDK、広告SDK、ログイン状態チェック、設定読み込み、キャッシュ初期化、フォント読み込みなどを一気に走らせると、初期表示が遅れます。
改善の基本は「起動時にやることを減らす」こと。
初期表示に不要な処理は後回しにし、ユーザーが操作できる状態を先に作ります。
次に、同期処理を減らし、非同期化や遅延実行を活用します。
さらに、初回表示に必要なデータはキャッシュやプリフェッチで先に準備し、ネットワーク待ちの体感を減らします。
注意点として、初期化を遅らせすぎると後で突然重くなることがあるため、どのタイミングで走らせるか(バックグラウンド、画面表示後、アイドル時)を設計します。
起動改善は、ストア評価や継続率に影響しやすく、投資対効果が大きい領域です。
「しばらく使うとどんどん重くなる」「特定操作で突然落ちる」といった症状は、メモリ消費やリークが疑われます。
ReactNativeはJSとネイティブが絡むため、画像の保持、イベントリスナー解除漏れ、タイマーのクリア漏れ、画面遷移で破棄されない参照などが積み重なると、メモリが増え続け、GCが頻発してカクつき、最悪クラッシュします。
対策は、コンポーネントのライフサイクルで購読(subscribe)したものを確実に解除し、不要な参照を残さないこと。大きい配列や画像データをstateに保持し続けないこと。
さらに、画面離脱時にキャッシュすべきものと破棄すべきものを分ける設計も重要です。
注意点として、キャッシュは効く一方でメモリを食うため、低スペック端末を想定するなら上限や破棄戦略を設けます。
メモリ問題は見えにくいので、再現手順を固め、操作を繰り返して増え続けないかを見るのが実務的です。
パフォーマンスはCPUや描画だけでなく、ネットワーク待ちや状態更新の設計でも大きく変わります。
例えば、画面遷移のたびに同じデータを再取得している、フィルタ変更で全データを再取得している、キャッシュが効かず毎回ロードしている、取得後に巨大なstateを更新して画面全体が再レンダーする、といったケースです。
対策は、データ取得の責務を整理し、キャッシュや再取得条件を明確にすること。
状態管理は、巨大なグローバルstateに寄せすぎると更新範囲が広がり、再レンダーが増えがちです。
必要な範囲だけ更新し、セレクタやメモ化で再レンダー範囲を絞る設計が効きます。
注意点として、キャッシュ戦略はデータ鮮度とのトレードオフがあるため、「いつ更新するか」「バックグラウンド更新するか」「ユーザー操作で更新するか」をプロダクト要件と合わせます。
ネットワーク起因の遅さは、UIで“待たせ方”を工夫するだけでも体感が変わるため、技術とUXの両面で設計します。
ReactNativeのパフォーマンス改善は、一度直して終わりではありません。
機能追加やデザイン変更で簡単に回帰(再び遅くなる)します。
そこで最後に重要なのが、改善を継続できる仕組みです。
実務で効くのは「性能予算(Performance Budget)」という考え方で、例えば“初期表示はX秒以内”“一覧スクロールはY fpsを維持”“画面遷移はZ ms以内”“クラッシュ率は一定以下”など、守るべき基準を決めます。
次に、計測を定期運用に組み込みます。
リリース前に特定の画面だけ簡易チェックする、重大変更が入ったらプロファイルする、というだけでも回帰を減らせます。
さらに、CIで最低限の品質ゲート(Lint、型、簡易テスト、バンドルサイズ監視など)を入れると、性能劣化の芽を早期に摘めます。
注意点として、性能の自動計測はコストがかかるので、最初は“回帰しやすい箇所”に絞るのが現実的です。
最終的に、性能改善が「個人の頑張り」ではなく「チームの運用」に乗ったとき、継続的に速いReactNativeアプリを維持できます。
改善を急ぐ現場ほど、やりがちな落とし穴があります。
代表例は「メモ化を闇雲に増やす」です。どこが遅いかを見ずにReact.memoやuseMemoを乱用すると、コードが読みにくくなるうえ、比較コストで逆に遅くなることもあります。
次に「計測せずにライブラリを入れ替える」。アニメーションや画像ライブラリの変更は効果が出ることもありますが、根本原因が再レンダーや設計不備にある場合、入れ替え工数の割に改善しません。
さらに「バンドルサイズだけ小さくして満足する」。サイズは重要ですが、体感は初期化や描画が支配するケースも多く、サイズ削減が直結しないことがあります。
また「端末ごとの最適化を後回しにする」も危険です。
高スペック端末では気づかないカクつきが、低スペック端末で顕在化し、レビューで炎上します。
最後に「全部を同時に直す」。施策を同時に入れると、どれが効いたか分からず回帰も増えます。
改善は、計測→1施策→再計測、の単位で進めるのが最短です。
「10施策は分かったが、実際どう進める?」という検索意図に対して、現場で使える進め方テンプレを提示します。
まずDay1〜2で、遅い画面を3つに絞り、再現手順を固定し、計測の最低ライン(再レンダー、JS/UIのどちらが落ちるか)を取ります。
Day3〜5で、原因分類に沿って上位2〜3施策に絞り込み、最小の変更で改善します(例:FlatListのチューニング、行コンポーネントのメモ化、入力のデバウンス)。
Day6〜7で、改善前後を動画と数値で比較し、関係者に“体感差”を見せて合意を取り、次の改善対象を決めます。
2週目は、起動・遷移・画像・アニメなど、より大きな改善に着手します。
ここで重要なのは、改善を“実装タスク”ではなく“体感の成果物”として扱うことです。
例えば「一覧のカクつきが消える」「入力遅延がなくなる」「初期表示が1秒短縮する」など、ユーザー視点の成果を定義すると、チームの優先順位が揃い、改善が続きます。
パフォーマンス改善は、技術だけでなく進め方が成果を左右します。
React Nativeのパフォーマンス改善は、闇雲な最適化では成果が出ません。
まず遅さをJS/UI/ブリッジ/画像/起動/遷移に分け、計測で当たりを付け、効果が出やすい順に施策を適用することが重要です。
本記事で紹介した10施策は、現場で頻出の原因に対して再現性が高い打ち手をまとめたものです。
特に、再レンダー削減、FlatListチューニング、JSスレッド詰まり解消、画像最適化は、体感改善に直結しやすい“即効性の高い領域”です。
最後に、改善を継続する仕組み(性能予算・回帰防止)を置けば、リリースを重ねても速さを維持できます。
ReactNativeの性能改善は、正しい手順でやれば、短期間で「軽くなった」を実現できます。
インプルでは、React NativeやFlutterなどの先進技術を駆使した豊富なアプリ開発実績を多数誇ります。
「ReactNativeを活用した開発に不安がある」、「相談しながら進めたい」
そんな方は、ぜひお気軽にインプルへご相談ください。
ReactNativeに関する無料相談は下記までお願いします。
株式会社インプル
BizDevG ディレクター 加藤 一輝
kato.kazuki@impl.co.jp
多くの場合、ボトルネックは①JSスレッド(ロジックや再レンダー)、②UIスレッド(レイアウトや描画)、③ブリッジ/通信(大量イベントやデータ転送)、④画像・アニメーション、⑤起動〜初期表示、⑥ナビゲーションや画面遷移、に分かれます。
つまり改善の正解は「とりあえず最適化」ではなく、まず遅さの種類を分け、次に計測で原因を特定し、最後に最小の変更で効果が出る順に打つことです。
本記事では、検索意図として多い「何から見ればいい?」「何を直せば体感が変わる?」「現場で使える具体策は?」に答えるために、計測の型→原因分類→10施策→よくある罠→チェックリストまで、実務に落とした形で整理します。
読むだけで終わらせないために、各施策は“症状”“確認方法”“打ち手”“副作用/注意点”の観点で解説します。
React Nativeの改善は、正しくやれば短期間で体感を変えられます。
目次
まず結論:パフォーマンス改善は「体感の優先順位」を決めると失敗しない
最初にやるべき“計測”と原因切り分けの基本
よくある症状別に「原因候補→当たり」を当てる早見表
よくある“逆効果”の最適化と落とし穴(やりがちだけど効かない)
現場で使える“改善の進め方”テンプレ(1〜2週間で体感を変える)
まとめ:RN改善は「計測→原因分類→10施策の優先適用」で短期に体感が変わる
まず結論:パフォーマンス改善は「体感の優先順位」を決めると失敗しない
React Native の改善でありがちな失敗は、数字を追うことが目的化し、ユーザー体験に効かない最適化を続けてしまうことです。
たとえば、CPU使用率を少し下げても、スクロールのカクつきが残るならユーザーは離脱します。
逆に、アニメーションが滑らかになり、初回表示が1秒短縮され、入力遅延が消えるなら、多少の内部指標が悪くても体感は良くなります。
そこで最初に決めるべきは、体感の優先順位です。
多くのプロダクトでは、
①起動/初期表示
②一覧スクロール
③画面遷移
④入力(タイピングやタップ反応)
⑤画像表示
の順で体感に効きます。
これを決めたうえで、改善対象を絞り、計測→改善→再計測のサイクルを回します。
特に React Nativeでは、1つの根本原因が複数症状(スクロール、遷移、入力遅延)に波及することがあるため、「どの体感を改善するか」を明確にするほど、最短で成果が出ます。
本記事の10施策は、現場で効果が出やすい順と、頻出の原因に基づいて並べています。
最初にやるべき“計測”と原因切り分けの基本
改善の前に計測が必要なのは、最適化が「推測」になった瞬間に工数が溶けるからです。
React Nativeの計測は難しそうに見えますが、現場でまず押さえるべきはシンプルです。
第一に、遅さが「JS起因」か「UI起因」かを分けます。
JS起因は、イベント処理や状態更新が重く、JSスレッドが詰まって反応が遅くなるタイプです。
UI起因は、レイアウト計算や描画・アニメーションでUI側が詰まり、スクロールや遷移がカクつくタイプです。
第二に、症状が出る操作(例:一覧を速くスクロール、フィルタ切替、検索入力、画面遷移)を“再現手順”として固定します。
第三に、ReactのProfiler(コンポーネント再レンダー)と、JSフレーム/UIフレームの落ち込み(FPSの低下)を見て、どちらが先に崩れているかを確認します。
ここまでできれば、対策の方向性が定まります。
例えば再レンダーが多いならメモ化・状態分割へ、UIフレームが落ちるならアニメーションの実装や画像・影・透明度など描画コストへ、ブリッジが詰まるならイベント回数削減やデータ転送の見直しへ、という具合です。
計測は“完璧”でなくてよく、方向性が定まる最低限で十分です。
よくある症状別に「原因候補→当たり」を当てる早見表
読者が一番知りたいのは「で、私のアプリは何が原因っぽいの?」という実務の当たり付けです。
症状別に当たりやすい原因候補を整理します。
①一覧スクロールがカクつく:FlatListの設定不備、行コンポーネントの再レンダー過多、画像のデコード/サイズ過大、影や透明度など描画コスト、onScrollイベントの過剰処理。
②入力が遅れる(文字が遅れて出る):JSスレッド詰まり(重い計算、頻繁なsetState、デバウンス不足)、フォームの再レンダー地獄。
③画面遷移が重い:初期ロードが重い(大きいJSバンドル)、画面コンポーネントが一気に描画、画像やAPI待ちのブロック、ナビゲーションの設定やアニメーション負荷。
④起動が遅い:Hermes未導入、初期化処理の集中、不要な同期I/O、巨大依存の読み込み、初回フォント/画像準備。
⑤特定端末だけ遅い:Androidの画像/影/オーバードロー、低メモリ端末でのGC、iOSの大きいblur/透明、など。
原因候補が見えると、10施策のうち何から当てるべきかが決まります。
以降は、現場で再現性が高い改善施策を、優先度の高いものから提示します。
施策1:再レンダーを減らす(React.memo / useMemo / useCallback / state分割)
RNの体感劣化で最頻出なのが「不要な再レンダー」です。
一覧やフォーム、複雑な画面で、状態が変わるたびに大量のコンポーネントが再レンダーされると、JSスレッドが詰まり、スクロールや入力が重くなります。
まずやるべきは、どのコンポーネントが頻繁に再レンダーしているかを可視化し、再レンダーの伝播を止めることです。
実務では、
(1)propsが変わらないのに再レンダーする部品をReact.memoで抑える
(2)配列やオブジェクトを毎回新規生成してpropsが変わってしまう箇所をuseMemoで安定化する
(3)イベントハンドラの参照が毎回変わることで子が再レンダーする場合はuseCallbackで固定する
(4)巨大なstateを1つに持たず、必要な粒度で分割して影響範囲を狭める
が鉄板です。
注意点として、メモ化は万能ではなく、むやみに増やすと可読性が落ちたり、逆に比較コストで遅くなることもあります。
まずは“レンダー回数が多い/重い部品”から限定的に適用するのが安全です。体感としては、入力遅延やタップ反応の改善に直結しやすい施策です。
施策2:FlatList/SectionListを正しくチューニングする(ウィンドウ化・キー・行の高さ)
一覧スクロールのカクつきは、RN改善の中でも最もROIが高い領域です。
理由は、ユーザーが最も長く触れる操作がスクロールであり、体感差が顕著だからです。
まず、FlatListを「正しくウィンドウ化」できているかを見ます。
行のkeyExtractorが安定していない、renderItemが毎回新規関数で作られている、extraDataの扱いで不要な再レンダーが起きる、などは典型的な落とし穴です。
さらに、getItemLayoutが設定できる場合(固定高に近い場合)は積極的に使うと、スクロール時のレイアウト計算が減り効果が出ます。
WindowSizeやinitialNumToRender、maxToRenderPerBatch、updateCellsBatchingPeriodなどは、端末スペックとUI設計に依存しますが、基本方針は「初期は必要最低限、スクロールに合わせて段階描画」です。
画像を多用する一覧は、行コンポーネントの軽量化(メモ化・分割)とセットでやると効きます。
注意点として、描画を絞りすぎると“白い空白”が出るなどUXが悪化するため、端末別に体感を確認しながら調整します。
FlatListのチューニングは、改善効果が分かりやすく、支援価値を示しやすい施策です。
施策3:JSスレッドを詰まらせない(重い処理の移動・分割・デバウンス)
入力遅延やタップ反応の悪さは、ほとんどの場合JSスレッドの詰まりが原因です。
典型は、
(1)入力のたびにAPIを叩く/フィルタを走らせる
(2)巨大な配列操作(ソート/フィルタ/集計)をメインスレッドで実行
(3)アニメーション中に高頻度で状態更新
(4)onScrollなど高頻度イベントで重い処理
です。
対策は、まず“回数を減らす”。
入力はデバウンス/スロットルを入れて、必要なタイミングでだけ処理します。
次に“処理を小さくする”。
一度に全部計算せず、分割やキャッシュで繰り返し計算を減らします。
さらに“処理の場所を変える”。場合によってはネイティブ側へ寄せたり、バックエンドで処理し結果だけ受け取るほうが良いこともあります。
React Nativeの改善で効くのは「JSで頑張りすぎない」設計です。
注意点として、デバウンスを強くしすぎると操作レスポンスが悪化するため、ユーザーの期待に合わせて適切な遅延を選びます。
JSスレッドの詰まりを解消できると、アプリ全体が“軽くなった”感を出しやすいです。
施策4:画像を最適化する(サイズ・フォーマット・プリロード・キャッシュ)
ReactNativeの現場で“地味に効く”のが画像最適化です。
一覧のサムネイル、商品画像、ユーザーアイコンなど、画像が多い画面ほどパフォーマンスが落ちやすく、しかも原因に気づきにくいからです。
改善の第一歩は「表示サイズに対して画像が大きすぎないか」を確認することです。
デコードやリサイズの負荷は端末側に乗るため、必要以上の解像度画像をそのまま出すとスクロールがカクつきます。
次にフォーマット。
透過や写真の特性に合わせ、圧縮率・容量を最適化します。
さらに、表示の仕方。プレースホルダーを出して先にレイアウトを安定させ、画像ロードを非同期で流すことで体感が良くなります。
キャッシュ戦略も重要で、同じ画像を何度も取りに行かない設計にするとネットワーク起因の“遅い”が減ります。
注意点として、過度な圧縮は画質劣化でUXが下がるため、ユーザー価値の高い画像は品質を守り、一覧などは軽さを優先するなどメリハリを付けます。
画像最適化は、スクロール・初期表示の両方に効く“二刀流”の施策です。
施策5:アニメーションをUI側で滑らかに(JS駆動を避け、負荷の高い表現を控える)
アニメーションのカクつきは、UIスレッド側の負荷か、JS駆動アニメーションによる詰まりが原因になります。
現場では「動いてはいるが滑らかではない」「スクロール中にアニメが引っかかる」といった症状で現れます。
基本戦略は、アニメーションを“UI側で完結”させ、JSスレッドの影響を受けにくくすることです。
特に、スクロールに連動するアニメーションや頻繁に更新される値は、JSで毎フレーム処理するのではなく、UI側の仕組みを使う方が体感が安定します。
また、影(shadow)、透明度(opacity)の重ねすぎ、blur、巨大な画像の拡大縮小など、描画コストの高い表現は端末によって大きく差が出るため、UIデザインの段階で“軽い表現”へ寄せるのも強力な改善です。
注意点として、見た目のリッチさを落とす決断が必要な場合があるため、プロダクトの価値とトレードオフを整理して合意形成することが大切です。
アニメ改善は、評価が「体感」なので、改善前後を動画比較すると関係者が納得しやすいです。
施策6:ナビゲーションと画面遷移を軽くする(初期描画の分割・遅延ロード)
画面遷移が重いと、ユーザーは「固まった」と感じ、離脱や低評価につながります。遷移が重い原因は、遷移そのものより「遷移先で一気にやりすぎる」ことが多いです。
例えば、画面表示の瞬間に大量のコンポーネントを描画し、同時にAPIを複数叩き、画像を読み込み、状態管理も更新…という状態です。
対策は、初期描画を軽くして“まず画面を出す”こと。
ファーストビューに必要な要素だけを先に描画し、下部や非表示領域は後から描画する、APIも重要度順に読み込む、ローディングやスケルトンを適切に使って体感を良くする、といった設計が効きます。
さらに、画面単位の遅延ロード(必要になってから読み込む)を使うと、初期のJSバンドルを軽くでき、遷移も起動も改善します。
注意点として、遅延ロードは分割の設計が必要で、エラー処理や通信失敗時のUXも合わせて設計しないと不安定になるため、運用まで含めて整えます。
施策7:起動・初期表示を速くする(初期化の見直し/不要な同期処理の排除)
RNアプリで「起動が遅い」は、ユーザー体験の最初で失点するため致命的です。
起動が遅くなる主因は、アプリ起動時に大量の初期化を詰め込みすぎることです。
分析SDK、広告SDK、ログイン状態チェック、設定読み込み、キャッシュ初期化、フォント読み込みなどを一気に走らせると、初期表示が遅れます。
改善の基本は「起動時にやることを減らす」こと。
初期表示に不要な処理は後回しにし、ユーザーが操作できる状態を先に作ります。
次に、同期処理を減らし、非同期化や遅延実行を活用します。
さらに、初回表示に必要なデータはキャッシュやプリフェッチで先に準備し、ネットワーク待ちの体感を減らします。
注意点として、初期化を遅らせすぎると後で突然重くなることがあるため、どのタイミングで走らせるか(バックグラウンド、画面表示後、アイドル時)を設計します。
起動改善は、ストア評価や継続率に影響しやすく、投資対効果が大きい領域です。
施策8:メモリとGC(ガベージコレクション)に配慮する(リークの芽を潰す)
「しばらく使うとどんどん重くなる」「特定操作で突然落ちる」といった症状は、メモリ消費やリークが疑われます。
ReactNativeはJSとネイティブが絡むため、画像の保持、イベントリスナー解除漏れ、タイマーのクリア漏れ、画面遷移で破棄されない参照などが積み重なると、メモリが増え続け、GCが頻発してカクつき、最悪クラッシュします。
対策は、コンポーネントのライフサイクルで購読(subscribe)したものを確実に解除し、不要な参照を残さないこと。大きい配列や画像データをstateに保持し続けないこと。
さらに、画面離脱時にキャッシュすべきものと破棄すべきものを分ける設計も重要です。
注意点として、キャッシュは効く一方でメモリを食うため、低スペック端末を想定するなら上限や破棄戦略を設けます。
メモリ問題は見えにくいので、再現手順を固め、操作を繰り返して増え続けないかを見るのが実務的です。
施策9:ネットワークと状態管理を整理する(過剰な再取得・無駄な更新を減らす)
パフォーマンスはCPUや描画だけでなく、ネットワーク待ちや状態更新の設計でも大きく変わります。
例えば、画面遷移のたびに同じデータを再取得している、フィルタ変更で全データを再取得している、キャッシュが効かず毎回ロードしている、取得後に巨大なstateを更新して画面全体が再レンダーする、といったケースです。
対策は、データ取得の責務を整理し、キャッシュや再取得条件を明確にすること。
状態管理は、巨大なグローバルstateに寄せすぎると更新範囲が広がり、再レンダーが増えがちです。
必要な範囲だけ更新し、セレクタやメモ化で再レンダー範囲を絞る設計が効きます。
注意点として、キャッシュ戦略はデータ鮮度とのトレードオフがあるため、「いつ更新するか」「バックグラウンド更新するか」「ユーザー操作で更新するか」をプロダクト要件と合わせます。
ネットワーク起因の遅さは、UIで“待たせ方”を工夫するだけでも体感が変わるため、技術とUXの両面で設計します。
施策10:改善を継続できる仕組みを作る(性能予算・回帰防止・CIでの検知)
ReactNativeのパフォーマンス改善は、一度直して終わりではありません。
機能追加やデザイン変更で簡単に回帰(再び遅くなる)します。
そこで最後に重要なのが、改善を継続できる仕組みです。
実務で効くのは「性能予算(Performance Budget)」という考え方で、例えば“初期表示はX秒以内”“一覧スクロールはY fpsを維持”“画面遷移はZ ms以内”“クラッシュ率は一定以下”など、守るべき基準を決めます。
次に、計測を定期運用に組み込みます。
リリース前に特定の画面だけ簡易チェックする、重大変更が入ったらプロファイルする、というだけでも回帰を減らせます。
さらに、CIで最低限の品質ゲート(Lint、型、簡易テスト、バンドルサイズ監視など)を入れると、性能劣化の芽を早期に摘めます。
注意点として、性能の自動計測はコストがかかるので、最初は“回帰しやすい箇所”に絞るのが現実的です。
最終的に、性能改善が「個人の頑張り」ではなく「チームの運用」に乗ったとき、継続的に速いReactNativeアプリを維持できます。
よくある“逆効果”の最適化と落とし穴(やりがちだけど効かない)
改善を急ぐ現場ほど、やりがちな落とし穴があります。
代表例は「メモ化を闇雲に増やす」です。どこが遅いかを見ずにReact.memoやuseMemoを乱用すると、コードが読みにくくなるうえ、比較コストで逆に遅くなることもあります。
次に「計測せずにライブラリを入れ替える」。アニメーションや画像ライブラリの変更は効果が出ることもありますが、根本原因が再レンダーや設計不備にある場合、入れ替え工数の割に改善しません。
さらに「バンドルサイズだけ小さくして満足する」。サイズは重要ですが、体感は初期化や描画が支配するケースも多く、サイズ削減が直結しないことがあります。
また「端末ごとの最適化を後回しにする」も危険です。
高スペック端末では気づかないカクつきが、低スペック端末で顕在化し、レビューで炎上します。
最後に「全部を同時に直す」。施策を同時に入れると、どれが効いたか分からず回帰も増えます。
改善は、計測→1施策→再計測、の単位で進めるのが最短です。
現場で使える“改善の進め方”テンプレ(1〜2週間で体感を変える)
「10施策は分かったが、実際どう進める?」という検索意図に対して、現場で使える進め方テンプレを提示します。
まずDay1〜2で、遅い画面を3つに絞り、再現手順を固定し、計測の最低ライン(再レンダー、JS/UIのどちらが落ちるか)を取ります。
Day3〜5で、原因分類に沿って上位2〜3施策に絞り込み、最小の変更で改善します(例:FlatListのチューニング、行コンポーネントのメモ化、入力のデバウンス)。
Day6〜7で、改善前後を動画と数値で比較し、関係者に“体感差”を見せて合意を取り、次の改善対象を決めます。
2週目は、起動・遷移・画像・アニメなど、より大きな改善に着手します。
ここで重要なのは、改善を“実装タスク”ではなく“体感の成果物”として扱うことです。
例えば「一覧のカクつきが消える」「入力遅延がなくなる」「初期表示が1秒短縮する」など、ユーザー視点の成果を定義すると、チームの優先順位が揃い、改善が続きます。
パフォーマンス改善は、技術だけでなく進め方が成果を左右します。
まとめ:RN改善は「計測→原因分類→10施策の優先適用」で短期に体感が変わる
React Nativeのパフォーマンス改善は、闇雲な最適化では成果が出ません。
まず遅さをJS/UI/ブリッジ/画像/起動/遷移に分け、計測で当たりを付け、効果が出やすい順に施策を適用することが重要です。
本記事で紹介した10施策は、現場で頻出の原因に対して再現性が高い打ち手をまとめたものです。
特に、再レンダー削減、FlatListチューニング、JSスレッド詰まり解消、画像最適化は、体感改善に直結しやすい“即効性の高い領域”です。
最後に、改善を継続する仕組み(性能予算・回帰防止)を置けば、リリースを重ねても速さを維持できます。
ReactNativeの性能改善は、正しい手順でやれば、短期間で「軽くなった」を実現できます。
インプルでは、React NativeやFlutterなどの先進技術を駆使した豊富なアプリ開発実績を多数誇ります。
「ReactNativeを活用した開発に不安がある」、「相談しながら進めたい」
そんな方は、ぜひお気軽にインプルへご相談ください。
ReactNativeに関する無料相談は下記までお願いします。
株式会社インプル
BizDevG ディレクター 加藤 一輝
kato.kazuki@impl.co.jp

Contact
お問い合わせ
システム開発、ニアショア・ラボ開発、各種サービスについてお問い合わせがございましたら、お問い合わせフォームまたはお電話にてお気軽にご連絡ください。
-
メールでのお問い合わせ
※Webフォームにてご連絡承ります -
電話でのお問い合わせ
※平日 10:00~17:00
Recruit
採用情報
上場への体制強化に向けてさまざまなポジションを募集しております。

