mcpField
R
react-native-best-practices

react-native-best-practices

github.com/callstackincubator開発1.7k30.5k 回インストール3 週間前に更新
リポジトリ

react-native-best-practices について

React Native アプリの性能を調査・改善する開発者向けガイドです。JavaScript、ネイティブコード、バンドルを対象に、測定に基づく対策を優先度順に整理しています。

主な機能

  1. 01FPS と再レンダリングの分析
  2. 02バンドルとアプリサイズの分析
  3. 03起動時間と TTI の改善指針
  4. 04JavaScript とネイティブのメモリ確認
  5. 05ネイティブ性能とモジュールの指針

活用シーン

  1. 01UI のカクつきやアニメーションのフレーム落ちの調査
  2. 02アプリの起動時間短縮やバンドル縮小
  3. 03JavaScript またはネイティブのメモリリーク追跡
  4. 04測定結果に基づく性能変更のレビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/callstackincubator/agent-skills --skill react-native-best-practices

インストール後、Claude Code で/react-native-best-practicesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

POWER.md
agents/
openai.yaml
references/
bundle-analyze-app.md
bundle-analyze-js.md
bundle-barrel-exports.md
bundle-code-splitting.md
bundle-hermes-mmap.md
bundle-library-size.md
bundle-native-assets.md
bundle-r8-android.md
bundle-tree-shaking.md
js-animations-reanimated.md
js-atomic-state.md
js-bottomsheet.md
js-concurrent-react.md
js-lists-flatlist-flashlist.md
js-measure-fps.md
js-memory-leaks.md
js-profile-react.md
js-react-compiler.md
js-uncontrolled-components.md
native-android-16kb-alignment.md
native-measure-tti.md
native-memory-leaks.md
native-memory-patterns.md
native-platform-setup.md
native-profiling.md
native-sdks-over-polyfills.md
native-threading-model.md
native-turbo-modules.md

詳細

React Native のベストプラクティス

概要

JavaScript/React、ネイティブ(iOS/Android)、バンドルの最適化を扱う、React Native アプリケーションのパフォーマンス最適化ガイドです。Callstack の「Ultimate Guide to React Native Optimization」に基づいています。

適用するタイミング

次のような場合に、これらのガイドラインを参照してください。

  • 動作が遅い、またはカクつく UI やアニメーションのデバッグ
  • メモリリーク(JS またはネイティブ)の調査
  • アプリの起動時間(TTI)の最適化
  • バンドルまたはアプリのサイズの削減
  • ネイティブモジュール(Turbo Modules)の作成
  • React Native のパフォーマンスのプロファイリング
  • パフォーマンスを目的とした React Native コードのレビュー

セキュリティに関する注意事項

  • これらのリファレンスに記載されているシェルコマンドは、ローカルでの開発作業として扱ってください。実行前に内容を確認し、バージョンを固定したツールを優先するとともに、リモートスクリプトをシェルに直接パイプで渡すことは避けてください。
  • サードパーティのライブラリやプラグインは、通常のサプライチェーン管理が引き続き必要な依存関係として扱ってください。バージョンを固定し、出所を確認したうえで、標準のレビュー手順に従って更新してください。
  • リモートチャンクの読み込みは、ファーストパーティのアーティファクト配信に限ってください。アプリに同梱するチャンク、または署名済みの CI リリースマニフェストを優先してください。ホストされたチャンクは、管理下にある信頼できる HTTPS オリジンから取得し、現在のアプリリリースに固定する必要があります。

優先度順のガイドライン

優先度カテゴリ影響度プレフィックス
1FPS と再レンダー重大js-*
2バンドルサイズ重大bundle-*
3TTI の最適化高native-*, bundle-*
4ネイティブパフォーマンス高native-*
5メモリ管理中~高js-*, native-*
6アニメーション中js-*

影響度のラベルはトリアージの目安です。まず重大、次に高、証拠が示す場合は中の順に対応してください。

クイックリファレンス

最適化ワークフロー

パフォーマンスの問題には、次のサイクルに従ってください。測定 → 最適化 → 再測定 → 検証

  1. 測定:変更前にベースラインのメトリクスを記録します。実行時の問題では、利用可能な場合、コミットタイムライン、再レンダー回数、遅いコンポーネント、最も負荷の高いコミットの内訳、起動時間/TTI を優先してください。コンポーネントツリーの深さや数は補足情報として任意であり、これらの代わりにはなりません。測定によってレンダーまたは FPS の問題が確認されていない場合は、メモ化、アトミックな状態管理、コンパイラーの変更を推奨しないでください。
  2. 最適化:該当するリファレンスにある、対象を絞った修正を適用します。
  3. 再測定:同じ測定を行い、更新後のメトリクスを取得します。
  4. 検証:改善を確認します(例:FPS が 45→60、TTI が 3.2s→1.8s、バンドルが 2.1MB→1.6MB)。

メトリクスが改善しなかった場合は、変更を元に戻して、次に推奨される修正を試してください。

レビュー時のガードレール
  • API 固有の修正を提案する前に、ライブラリのバージョンを確認してください。例:FlashList v2 では estimatedItemSize は非推奨のため、存在しないことを指摘しないでください。
  • 動作に明らかな誤りがある場合、またはプロファイリングでその値に関連する無駄な処理が確認された場合を除き、useMemo や useCallback の依存関係の変更を提案しないでください。
  • 古いクロージャーを憶測で報告しないでください。問題として指摘する前に、古い値の読み取り経路、再現手順、またはプロファイラーの証拠を示してください。
  • フローをプロファイリングする際は、対象のインタラクション自体を測定してください。コンポーネントツリーの深さやコンポーネント数を、主なパフォーマンスの根拠として扱わないでください。
重要:FPS と再レンダリング

まずプロファイルを取得します:

agent-device react-devtools status
agent-device react-devtools wait --connected
agent-device react-devtools profile start
agent-device react-devtools profile stop
agent-device react-devtools profile slow --limit 5
agent-device react-devtools profile rerenders --limit 5
agent-device react-devtools profile timeline --limit 20

profile start と profile stop の間に、通常の agent-device コマンドを使って対象の操作を実行します。

agent-device が使用できない場合の手動での代替手段:Metro(j)または Dev Menu から React Native DevTools を開き、Profiler タブを使って、同じ操作を記録します。

リリースビルドで React コンポーネントをプロファイリングするには、まず @callstack/inspector を接続して、React DevTools がリリースアプリにアタッチできるようにしてから、上記の agent-device react-devtools の手順を実行します。

一般的な修正方法:

  • 長いリストでは、ScrollView を FlatList/FlashList/Legend List に置き換えます
  • プロファイリングで連鎖的な再レンダリングが確認された場合は、React Compiler を使って自動メモ化します
  • プロファイリングでストア/コンテキストの広範な更新が確認された場合は、アトミックな状態管理(Jotai/Zustand)を使って再レンダリングを減らします
  • コストの高い計算には useDeferredValue を使います
重要:バンドルサイズ

バンドルを分析します:

npx react-native bundle \
  --entry-file index.js \
  --bundle-output output.js \
  --platform ios \
  --sourcemap-output output.js.map \
  --dev false --minify true

npx source-map-explorer output.js --no-border-checks

最適化後の改善を確認します:

# Record baseline size before changes
ls -lh output.js  # e.g., Before: 2.1 MB

# After applying fixes, re-bundle and compare
npx react-native bundle --entry-file index.js --bundle-output output.js \
  --platform ios --dev false --minify true
ls -lh output.js  # e.g., After: 1.6 MB  (24% reduction)

一般的な修正方法:

  • バレルインポートを避けます(ソースから直接インポートします)
  • Hermes API とメソッドの対応状況を確認してから、不要な Intl ポリフィルのみを削除します
  • ツリーシェイキングを評価します(Expo SDK 52 以降の実験的な未使用インポート/エクスポートの削除、または、すでに設定済みの場合に限り Re.Pack を使用します)
  • Android のネイティブコードの縮小には R8 を有効にします
高:TTI の最適化

TTI を測定します:

  • マーカーには react-native-performance を使います
  • コールドスタートのみを測定します(ウォーム/ホット/事前ウォームアップは除外します)

一般的な修正方法:

  • React Native 0.78 以前では、Hermes の mmap を有効にするため、Android の JS バンドル圧縮を無効にします
  • ネイティブナビゲーション(react-native-screens)を使います
  • よく使う、コストの高い画面を、遷移前にプリロードします
高:ネイティブパフォーマンス

ネイティブをプロファイルします:

  • iOS:Xcode Instruments → Time Profiler
  • Android:Android Studio → CPU Profiler

一般的な修正方法:

  • 負荷の高いネイティブ処理にはバックグラウンドスレッドを使います
  • Turbo Module のメソッドは同期より非同期を優先します
  • クロスプラットフォームでパフォーマンスが重要なコードには C++ を使います

参考資料

コード例を含む詳細なドキュメントは references/ にあります:

JavaScript/React(js-*)
ファイル影響度説明
js-lists-flatlist-flashlist.mdCRITICALScrollView を仮想化リストに置き換えます
js-profile-react.mdMEDIUMagent-device react-devtools によるプロファイリング
js-measure-fps.mdHIGHFPS の監視と測定
js-memory-leaks.mdMEDIUMJS メモリリークの調査
js-atomic-state.mdHIGHJotai/Zustand のパターン
js-concurrent-react.mdHIGHuseDeferredValue、useTransition
js-react-compiler.mdHIGH自動メモ化
js-animations-reanimated.mdMEDIUMReanimated のワークレット
js-bottomsheet.mdHIGHボトムシートの最適化
js-uncontrolled-components.mdHIGHTextInput の最適化
ネイティブ(native-*)
ファイル影響度説明
native-turbo-modules.mdHIGH高速なネイティブモジュールの構築
native-sdks-over-polyfills.mdHIGHネイティブライブラリと JS ライブラリの比較
native-measure-tti.mdHIGHTTI 測定のセットアップ
native-threading-model.mdHIGHTurbo Module のスレッド
native-profiling.mdMEDIUMXcode/Android Studio でのプロファイリング
native-platform-setup.mdMEDIUMiOS/Android ツールガイド
native-view-flattening.mdMEDIUMビューヒエラルキーのデバッグ
native-memory-patterns.mdMEDIUMC++/Swift/Kotlin のメモリ
native-memory-leaks.mdMEDIUMネイティブメモリリークの調査
native-android-16kb-alignment.mdCRITICALGoogle Play 向けサードパーティライブラリのアライメント
バンドル(bundle-*)
ファイル影響度説明
bundle-barrel-exports.mdCRITICALバレルインポートを避ける
bundle-analyze-js.mdCRITICALJS バンドルの可視化
bundle-tree-shaking.mdHIGHデッドコードの除去
bundle-analyze-app.mdHIGHアプリサイズの分析
bundle-r8-android.mdHIGHAndroid コードの縮小
bundle-hermes-mmap.mdHIGHバンドル圧縮を無効化
bundle-native-assets.mdHIGHアセットカタログのセットアップ
bundle-library-size.mdMEDIUM依存関係の評価
bundle-code-splitting.mdMEDIUMリモートチャンク読み込みの保護策

問題 → スキルの対応表

問題まず試すもの
アプリの動作が遅い/ぎこちないjs-measure-fps.md → js-profile-react.md
再レンダリングが多すぎるjs-profile-react.md → js-react-compiler.md
起動が遅い(TTI)native-measure-tti.md → bundle-analyze-js.md
アプリのサイズが大きいbundle-analyze-app.md → bundle-r8-android.md
メモリ使用量が増え続けるjs-memory-leaks.md または native-memory-leaks.md
アニメーションでフレーム落ちが発生するjs-animations-reanimated.md
ボトムシートの動作がぎこちない/再レンダリングが発生するjs-bottomsheet.md → js-animations-reanimated.md
リストのスクロールがぎこちないjs-lists-flatlist-flashlist.md
TextInput の入力が遅れるjs-uncontrolled-components.md
ネイティブモジュールの動作が遅いnative-turbo-modules.md → native-threading-model.md
ネイティブライブラリのアラインメントに問題があるnative-android-16kb-alignment.md

クレジット

Callstack による「The Ultimate Guide to React Native Optimization」に基づいています。

コメント