パフォーマンス

RN は2つのスレッド(JS と UI)の上で動く。JS スレッドが詰まるとアニメが落ちるのが基本構造。 実機(特にローエンド Android)でテストし、JS スレッドを軽く保つことが要。

2 つのスレッド

重い計算を JS スレッドで回すと、UI スレッドへの指示が遅れてカクつく。 Reanimated や Animated(useNativeDriver)が有効な場合は、UI スレッド単独でアニメが続くので JS スレッドが詰まっても止まらない。

JS エンジン: Hermes

Facebook 製の RN 専用 JS エンジン。2026 現在は Expo / RN ともにデフォルト。 起動時間とメモリで JSC(旧来の JavaScriptCore)より優位。

New Architecture(Fabric / TurboModules)

RN の刷新された内部アーキテクチャ。2026 現在は Expo / RN のデフォルト

既存の古いライブラリは New Architecture 非対応の可能性あり。新規ライブラリは原則対応しているかをチェック。

FlatList の最適化

リストはパフォーマンスの最大の悩みどころ。

必須プロパティ

<FlatList
  data={items}
  keyExtractor={(item) => item.id}
  renderItem={renderItem}
  getItemLayout={(data, index) => ({
    length: ITEM_HEIGHT,
    offset: ITEM_HEIGHT * index,
    index,
  })}
/>

調整 props

各セルの最適化

FlashList(Shopify)

FlatList より遥かに速い代替実装。estimatedItemSize を渡すだけ。

import { FlashList } from "@shopify/flash-list"

<FlashList
  data={items}
  estimatedItemSize={64}
  renderItem={renderItem}
  keyExtractor={(item) => item.id}
/>

画像

React の最適化

不要な再レンダーを抑える

React Compiler

React 19 系から導入された自動メモ化コンパイラ。手書きの memo / useCallback / useMemo がほぼ不要になる。 Expo Router の最新テンプレートでは段階的に導入されている。

大きな state を分割する

1つの巨大 Context や Zustand store にすべて入れると、1 箇所の変更で全体が再レンダーされる。 セレクタや atom 単位の管理(Jotai / Zustand selector)で局所化する。

アニメーションを UI スレッドで動かす

JS スレッドが詰まっても、ネイティブ駆動のアニメは止まらない。ローディング中もスムーズな見た目を保てる。

起動時間

メモリ

ネットワーク

プロファイリングツール

標準

サードパーティ

iOS の Instruments / Android の Profiler

ネイティブレイヤーの調査には Xcode / Android Studio の付属プロファイラ。JS で対処できない問題を追う時に。

計測の手順

  1. 実機(できればローエンド Android)でテスト。シミュレータは速すぎてあてにならない。
  2. 本番ビルド(npx expo run:ios --configuration Release 等)で計測。dev は遅い。
  3. Performance Monitor を ON、操作中に FPS が落ちる場面を特定。
  4. その場面の JS スレッド負荷を Hermes Profiler でサンプリング。
  5. 怪しいコンポーネントを React DevTools Profiler でレンダー回数チェック。
  6. 問題箇所を memo / useCallback / リスト最適化 / native driver で改善。

本番でのモニタリング

判断ガイド

症状疑うべき原因
リストが重い・カクつくFlatList → FlashList、getItemLayout、セルの memo
アニメがガタつくuseNativeDriver または Reanimated に
起動が遅い初期化処理が重い、画像が大きすぎる、フォントが多い
メモリ警告画像キャッシュ、FlatList 設定、メディア解放忘れ
JS スレッド詰まり無駄な再レンダー、重い計算が同期実行
最低ライン

✓ Hermes ON(既定)
✓ New Architecture ON(既定)
✓ FlatList → FlashList 検討
✓ Reanimated でアニメ
expo-image + 適切な解像度
✓ 実機(ローエンド Android)で本番ビルドを確認