クイックスタート(Expo)

新規プロジェクトを作って実機/エミュレータで動かす最短ルート。Expo Go で始めて、必要になったら Dev Build に切り替えるのが定石。

準備

1. プロジェクト作成

# TypeScript + Expo Router の標準テンプレート
npx create-expo-app@latest my-app

cd my-app
npx expo start

起動すると QR コードがターミナルに出る。Expo Go アプリで読むと実機で動く。 同じ Wi-Fi に繋がっていることが必要(PC とスマホ)。

起動オプション

2. プロジェクト構造

create-expo-app の標準
my-app/
├── app/                    ← 画面(Expo Router)
│   ├── _layout.tsx           - 全画面共通レイアウト
│   ├── index.tsx             - "/"
│   └── (tabs)/               - タブグループ
│       ├── _layout.tsx
│       ├── index.tsx         - "/"
│       └── explore.tsx       - "/explore"
├── components/             ← 再利用コンポーネント
├── constants/              ← 色などの定数
├── assets/                 ← 画像・フォント
├── app.json                ← Expo の設定
├── package.json
└── tsconfig.json

画面は app/ 配下のファイルパスがそのまま URL/ルートになる(Expo Router)。 詳しくは ナビゲーション

3. app.json の中身

Expo プロジェクトの設定。表示名・スキーム・アイコン・スプラッシュ・iOS/Android の固有設定がここ。

{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "version": "1.0.0",
    "scheme": "myapp",
    "icon": "./assets/icon.png",
    "splash": { "image": "./assets/splash.png", "backgroundColor": "#fff" },
    "ios": {
      "bundleIdentifier": "com.example.myapp",
      "supportsTablet": true
    },
    "android": {
      "package": "com.example.myapp",
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      }
    },
    "plugins": [
      "expo-router",
      ["expo-image-picker", { "photosPermission": "写真へのアクセスを許可してください" }]
    ]
  }
}

4. Expo Go vs Dev Build

最初の選択。Expo Go は「Expo SDK に含まれるモジュールだけが使える共通アプリ」、Dev Buildそのプロジェクト専用にビルドされた開発用アプリ

Expo GoDev Build
導入コスト0(ストアから DL)EAS Build で 1 回ビルド
使えるモジュールExpo SDK 内のみ任意のネイティブモジュール(react-native-mmkv 等)
カスタムネイティブコード×
勉強・プロトタイプ
本格開発足りないことが多い

判断基準: 追加で react-native-* ネイティブモジュールを入れたくなった瞬間に Dev Build に移行。 Expo SDK だけで足りているなら Expo Go のままで OK。

Dev Build の作り方(後述の EAS でも詳しく)

npm install -g eas-cli
eas login
eas build:configure         # eas.json を作る
eas build --profile development --platform ios     # iOS 開発ビルド
eas build --profile development --platform android # Android 開発ビルド

5. ホットリロード(Fast Refresh)

6. デバッグ

7. 既存パッケージを足す

Expo SDK のものは expo install、それ以外は npm install

# Expo SDK モジュール(バージョン互換が自動で揃う)
npx expo install expo-image expo-camera expo-location

# 通常の npm パッケージ
npm install zustand @tanstack/react-query

# ネイティブモジュール(Dev Build が必要になる場合あり)
npx expo install react-native-mmkv  # expo install で自動的に prebuild 実行

expo install を使う理由: その Expo SDK バージョンと互換のパッケージバージョンを自動選択してくれる。 単に npm install expo-camera すると最新が入って互換性が崩れることがある。

8. プラットフォーム固有のコード

iOS / Android で挙動を変えたい時:

import { Platform } from "react-native"

const padding = Platform.OS === "ios" ? 20 : 16

// プラットフォーム別ファイル: Foo.ios.tsx / Foo.android.tsx を作ると自動で選択される
import Foo from "./Foo" // 拡張子なしで OK

9. Web 出力(オプション)

npx expo start --web または w で Web ビルドが見られる。Expo Router は Web もサポート。 ただし使っているネイティブ専用モジュールは Web で動かない

よくあるトラブル

最初に作るべきもの

いきなりプロダクト機能を作らず、「2画面で遷移する」「ボタンで色が変わる」「テキスト入力できる」くらいの最小アプリをEAS Build まで通す
開発・実機テスト・ビルド・配布のループが一回でも回せれば、後の作業が圧倒的に楽になる。