expo-router について
React Native 向けに Expo Router 6.x のファイルベースナビゲーションを構築するスキルです。`app/` 内のファイルを使ったレイアウト、ルートグループ、動的パラメーター、ナビゲーションの設計を案内します。
主な機能
- 01`app/` のファイルをナビゲーション画面に対応
- 02ネストしたレイアウトとルートグループの設定
- 03動的ルートとキャッチオールルートの作成
- 04ナビゲーションとルートパラメーターの取得
- 05未定義ページと画面オプションの処理
活用シーン
- 01ルートグループ別の画面構成
- 02パラメーター付き詳細画面の追加
- 03Stack または Tab ナビゲーションの設定
- 04共有 Provider と 404 画面の設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dralgorhythm/ claude-agentic-framework --skill expo-routerインストール後、Claude Code で/expo-routerを入力して読み込まれたか確認します。
詳細
Expo Router
概要
Expo Router 6.x を使用した React Native 向けのファイルベースのルーティングです。app/ ディレクトリのファイルシステム構造をナビゲーション画面に対応付けます。Stack と Tab ナビゲーター、ルートグループ、動的パラメーター、ネストされたレイアウトをサポートします。
インストール:Expo SDK 54 以降に含まれています。依存関係に expo-router が含まれていることを確認してください。
ワークフロー
ルーティングの設定:
- ルートレイアウト(プロバイダー、グローバルな外枠)として
app/_layout.tsxを作成します - ルートグループのディレクトリを作成します:
app/(demo)/、app/(auth)/ - グループ固有のナビゲーションを設定するため、各グループに
_layout.tsxを追加します - デフォルト画面として
index.tsxを追加します - 動的ルートとして
[param].tsxを追加します - 404 の処理に
+not-found.tsxを追加します
新しい画面の追加:
- 適切なルートグループにファイルを作成します
- React コンポーネントをデフォルトエクスポートします
- 親の
_layout.tsxまたは<Stack.Screen options={...} />で画面オプションを設定します -
useRouter()または<Link>を使って遷移します
ガイダンス
ファイルの規約
| ファイル | 用途 |
|---|---|
_layout.tsx | ディレクトリのレイアウトラッパー(プロバイダー、ナビゲーター) |
index.tsx | ディレクトリのデフォルト画面 |
[param].tsx | 動的ルートセグメント |
[...catchAll].tsx | キャッチオールルート |
+not-found.tsx | 404 画面 |
(group)/ | ルートグループ(URL セグメントなし) |
ルートレイアウトのパターン
ルートの _layout.tsx はエントリーポイントです。グローバルプロバイダーに使用します:
app/_layout.tsx → GestureHandlerRootView > SafeAreaProvider > Context > Stack
ルートレイアウトは薄く保ち、タブやヘッダーなどの外枠はグループレイアウトに配置します。
ルートグループ
ルートグループ (name)/ を使うと、URL パスに影響を与えずに画面を整理できます。一般的なパターン:
app/
├── _layout.tsx # Root: providers + Stack
├── (demo)/
│ ├── _layout.tsx # Tabs or Stack for demo scenes
│ ├── index.tsx # Home screen
│ └── [id].tsx # Detail screen
└── +not-found.tsx
ナビゲーション
- プログラムによる遷移:
const router = useRouter()→router.push('/detail/123')、router.back() - 宣言的な遷移:
<Link href="/detail/123">コンポーネント - パラメーター:
const { id } = useLocalSearchParams<{ id: string }>() - リダイレクト:条件付きルーティングには
<Redirect href="/login" />
画面オプション
レイアウトまたはインラインで画面の表示方法を設定します:
- レイアウト内:
<Stack.Screen name="detail" options={{ title: 'Detail', headerShown: false }} /> - インライン:
<Stack.Screen options={{ presentation: 'modal' }} /> - 一般的なオプション:
title、headerShown、presentation('card' | 'modal')、animation
レイアウトのネスト
プロバイダーはルートに、外枠はグループにネストします:
- ルート
_layout.tsx:GestureHandlerRootView、SafeAreaProvider、テーマコンテキスト、<Stack /> - グループ
_layout.tsx:画面オプションとヘッダー設定を指定した<Tabs />または<Stack />
ベストプラクティス
- ルートファイルは薄く保ち、
/components/views/のビューコンポーネントに処理を委譲します - ルートグループを使って、URL に影響を与えずに関心事を分離します
- ジェネリクスを使ってルートパラメーターに型を指定します:
useLocalSearchParams<{ id: string }>() - カスタムヘッダーを使用する場合は
headerShown: falseを設定します - 一貫した画面遷移には
<Stack screenOptions={{ animation: 'slide_from_right' }} />を使用します - 共有プロバイダー(テーマ、データコンテキスト)はルートの
_layout.tsxに配置します - 404 を適切に処理するには
+not-found.tsxを使用します
アンチパターン
- ルートファイルにビジネスロジックを配置する(薄く保ち、コンポーネントに委譲します)
- ルートグループを 2 階層より深くネストする
- Expo Router の抽象化を使わず、React Navigation を直接使用する
- 複雑なアプリで、定数ファイルを用意せずにナビゲーションパスを文字列としてハードコードする
- ルートファイルでデフォルトエクスポートを忘れる(画面が空白になります)
- ルートレイアウトに配置すべきプロバイダーをグループレイアウトに配置する
コメント
Markdown 対応