注意点・落とし穴

Web 由来の感覚で書くと驚くポイントと、本番運用の前に知っておくべき RN 固有の癖をまとめる。 「Web の常識が通じない」「iOS と Android が違う」「実機でしか分からない」の3つが大きな軸。

Web との違い(よくある驚き)

iOS / Android の違い

UI 慣習

iOS は shadow*、Android は elevation両方書く必要あり。

キーボード

パーミッション

フォント

ネットワーク

状態とライフサイクルの違い

アプリの状態

AppState でアクティブ/バックグラウンドが取れる。バックグラウンドではタイマーが止まる等の挙動を意識。

import { AppState } from "react-native"

useEffect(() => {
  const sub = AppState.addEventListener("change", (state) => {
    // "active" / "background" / "inactive"
  })
  return () => sub.remove()
}, [])

画面のフォーカス

Stack ナビでは裏に隠れた画面もアンマウントされない。「画面に戻ってきた時にデータを再取得」等の挙動は useFocusEffect で:

import { useFocusEffect } from "expo-router"

useFocusEffect(
  useCallback(() => {
    refetch()
    return () => { /* 画面を離れた時 */ }
  }, [refetch]),
)

デバッグの落とし穴

Metro / キャッシュ

変な挙動の8割はキャッシュで治る:

npx expo start --clear
rm -rf node_modules && npm install
npx expo prebuild --clean    # ネイティブをまっさらにする時

「ビルドは通るのに実機で動かない」

本番でしか起きるバグ

Expo Go の限界

Expo Go はExpo SDK 内のモジュールしか含まない。 以下を入れたい時点で Expo Go は使えない、Dev Build が必要:

SDK アップグレード

Expo SDK は数ヶ月ごとにメジャーバージョンアップ。RN のバージョンや React のバージョンも一緒に上がる。

セキュリティ

Deep Link / URL Scheme

サードパーティサービス連携

App Store / Google Play 審査の罠

テスト戦略

運用

判断ガイド

状況選択
新規プロジェクトExpo + Expo Router + TypeScript + EAS
状態管理useState + Zustand + React Query
永続化SecureStore(機密)+ MMKV(普通)+ SQLite(複雑)
スタイルStyleSheet または NativeWind
ナビExpo Router
アニメReanimated + Gesture Handler
リストFlashList
画像expo-image
ビルド/配布EAS Build / Submit / Update
クラッシュ監視Sentry
学び方の道筋

公式ドキュメントを読むのが断然早い:
- Expo Docs
- React Native Docs
- React Navigation Docs
- Reanimated Docs
困ったらExpo DiscordX(旧Twitter)の #expo, #reactnative も活発。