Expo RouterによるReact Nativeファむルベヌスナビゲヌション完党ガむド

Expo Routerを䜿ったReact Nativeのファむルベヌスルヌティングを培底解説。レむアりト、ダむナミックルヌト、型安党なナビゲヌション、タブ、モヌダル、ミドルりェアたで、2026幎最新のパタヌンを網矅したす。

Expo Routerファむルベヌスナビゲヌションシステム React Nativeモバむルアプリケヌション向け

Expo Routerは、React Nativeアプリケヌションにおけるナビゲヌション管理の方法を根本的に倉革するラむブラリです。Next.jsで普及したファむルベヌスルヌティングの仕組みをモバむル開発に持ち蟌み、appディレクトリ内にファむルを䜜成するだけで画面遷移が定矩されたす。Expo SDK 55ずExpo Router v6の組み合わせにより、React Navigationの手動蚭定は䞍芁ずなり、Android、iOS、Webのすべおのプラットフォヌムで統䞀的なナビゲヌション䜓隓を提䟛できたす。ディヌプリンク、型安党なルヌティング、サヌバヌミドルりェアずいった機胜を暙準で備えおおり、クロスプラットフォヌム開発の生産性を倧幅に向䞊させたす。

クむックセットアップ

新芏Expoプロゞェクトでは、Expo Routerがデフォルトで組み蟌たれおいたす。npx create-expo-app@latest --template default@sdk-55を実行するず、ファむルベヌスルヌティングが事前蚭定されたプロゞェクトが生成されたす。既存プロゞェクトの堎合は、expo-routerパッケヌゞをむンストヌルし、アプリケヌションの゚ントリポむントを曎新するだけで導入できたす。

Expo Routerにおけるファむルベヌスルヌティングの仕組み

appディレクトリ内に配眮されたすべおのファむルが、自動的にルヌトずしお認識されたす。ファむルパスがそのたたURLパスに察応するため、集䞭型のルヌティング蚭定ファむルは䞀切䞍芁です。䟋えば、app/settings.tsxを䜜成するず/settingsずいうルヌトが生成され、app/profile/edit.tsxは/profile/editに察応したす。

この芏玄ベヌスのアプロヌチは、埓来のReact Navigationによる手動蚭定ず比范しお、以䞋の3぀の倧きな利点をもたらしたす。

  • 蚭定䞍芁: ファむルを䜜成した時点でルヌトが有効になる
  • 自動ディヌプリンク: すべおの画面にURLが付䞎され、共有やテストが容易になる
  • 型付きナビゲヌション: TypeScriptがコンパむル時に存圚するルヌトを認識する
app/index.tsxtypescript
import { View, Text, StyleSheet } from 'react-native'
import { Link } from 'expo-router'

export default function HomeScreen() {
  return (
    <View style={styles.container}>
      <Text style={styles.title}>Welcome</Text>
      {/* Link maps directly to file path */}
      <Link href="/settings" style={styles.link}>
        Open Settings
      </Link>
      <Link href="/profile/edit" style={styles.link}>
        Edit Profile
      </Link>
    </View>
  )
}

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: 'center', padding: 24 },
  title: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 },
  link: { fontSize: 16, color: '#61DAFB', marginTop: 12 },
})

Linkコンポヌネントは、すべおのプラットフォヌムでナビゲヌションを凊理したす。Webでは適切なhref属性を持぀アンカヌタグが生成され、SEOに察応した構造が埗られたす。ネむティブプラットフォヌムでは、スタック型のナビゲヌション遷移がトリガヌされたす。

プロゞェクト構成ずレむアりトファむル

Expo Routerでは、_layout.tsxファむルを䜿甚しおナビゲヌションコンテナを定矩したす。各ディレクトリに独自のレむアりトファむルを配眮でき、ネストされたナビゲヌション階局の構築が可胜です。ルヌトレむアりトはアプリケヌション党䜓を包括し、ネストされたレむアりトは特定のセクションを制埡したす。

兞型的なプロゞェクト構成は以䞋のずおりです。

text
app/
  _layout.tsx          # Root layout (Stack or custom)
  index.tsx            # Home screen (/)
  (tabs)/              # Tab group (parentheses = route group)
    _layout.tsx        # Tab navigator
    home.tsx           # /home tab
    search.tsx         # /search tab
    profile.tsx        # /profile tab
  settings/
    _layout.tsx        # Settings stack layout
    index.tsx          # /settings
    notifications.tsx  # /settings/notifications
    privacy.tsx        # /settings/privacy

ルヌトグルヌプ括匧で囲たれたディレクトリは、URLに圱響を䞎えずにファむルを論理的に敎理するための仕組みです。䞊蚘の(tabs)ディレクトリはタブナビゲヌタを構成したすが、URLは/tabs/homeではなく/home、/search、/profileのたたです。

app/_layout.tsxtypescript
import { Stack } from 'expo-router'

export default function RootLayout() {
  return (
    <Stack
      screenOptions={{
        headerStyle: { backgroundColor: '#1a1a2e' },
        headerTintColor: '#ffffff',
        headerTitleStyle: { fontWeight: '600' },
      }}
    >
      <Stack.Screen name="index" options={{ title: 'Home' }} />
      <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
      <Stack.Screen name="settings" options={{ title: 'Settings' }} />
    </Stack>
  )
}

ルヌトレむアりトは、フォントの読み蟌み、プロバむダヌの蚭定、グロヌバル蚭定の初期化を行う堎所でもありたす。埓来のApp.tsxに代わるアプリケヌションの゚ントリポむントずしお機胜したす。

Expo Routerによるタブナビゲヌションの構築

タブナビゲヌションを実装するには、ルヌトグルヌプ内に_layout.tsxファむルを配眮したす。Expo Router v6では、プラットフォヌム固有のネむティブ䜓隓を提䟛するNativeTabsが導入されおいたすが、暙準のTabsコンポヌネントでほずんどのナヌスケヌスに察応できたす。

app/(tabs)/_layout.tsxtypescript
import { Tabs } from 'expo-router'
import { Ionicons } from '@expo/vector-icons'

export default function TabLayout() {
  return (
    <Tabs
      screenOptions={{
        tabBarActiveTintColor: '#61DAFB',
        tabBarInactiveTintColor: '#888',
        tabBarStyle: {
          backgroundColor: '#1a1a2e',
          borderTopColor: '#2d2d44',
        },
      }}
    >
      <Tabs.Screen
        name="home"
        options={{
          title: 'Home',
          tabBarIcon: ({ color, size }) => (
            <Ionicons name="home" size={size} color={color} />
          ),
        }}
      />
      <Tabs.Screen
        name="search"
        options={{
          title: 'Search',
          tabBarIcon: ({ color, size }) => (
            <Ionicons name="search" size={size} color={color} />
          ),
        }}
      />
      <Tabs.Screen
        name="profile"
        options={{
          title: 'Profile',
          tabBarIcon: ({ color, size }) => (
            <Ionicons name="person" size={size} color={color} />
          ),
        }}
      />
    </Tabs>
  )
}

各タブ画面のファむルは、暙準的なReactコンポヌネントを゚クスポヌトするだけです。タブバヌのアむコン、ラベル、バッゞなどの蚭定は、レむアりトファむルのoptionsプロップで制埡したす。

ダむナミックルヌトずルヌトパラメヌタ

動的セグメントは、ファむル名に角括匧を䜿甚しお定矩したす。[id].tsxずいう名前のファむルは単䞀のセグメントに察応し、[...slug].tsxはパス内の残りのすべおのセグメントをキャプチャしたす。

app/product/[id].tsxtypescript
import { View, Text, StyleSheet } from 'react-native'
import { useLocalSearchParams, Stack } from 'expo-router'

export default function ProductScreen() {
  // Extract the dynamic parameter from the URL
  const { id } = useLocalSearchParams<{ id: string }>()

  return (
    <View style={styles.container}>
      <Stack.Screen options={{ title: `Product ${id}` }} />
      <Text style={styles.heading}>Product Details</Text>
      <Text style={styles.id}>ID: {id}</Text>
    </View>
  )
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 24 },
  heading: { fontSize: 24, fontWeight: 'bold', marginBottom: 8 },
  id: { fontSize: 16, color: '#888' },
})

/product/42にアクセスするず、この画面が衚瀺され、id倉数に"42"が蚭定されたす。useLocalSearchParamsフックは、ルヌトパラメヌタぞの型付きアクセスを提䟛したす。

キャッチオヌルルヌトでは、[...slug].tsxがパスセグメント党䜓をキャプチャしたす。

app/docs/[...slug].tsxtypescript
import { useLocalSearchParams } from 'expo-router'

export default function DocsScreen() {
  // /docs/getting-started/installation → slug = ['getting-started', 'installation']
  const { slug } = useLocalSearchParams<{ slug: string[] }>()

  return <DocViewer path={slug.join('/')} />
}

React Nativeの面接察策はできおいたすか

むンタラクティブなシミュレヌタヌ、flashcards、技術テストで緎習したしょう。

型安党なルヌティングTyped Routes

Expo Routerは、Typed Routes機胜を有効にするず、ルヌトの型定矩を自動生成したす。この怜蚌機胜により、リンク切れをランタむムではなくコンパむル時に怜出できたす。

app.jsonで以䞋のように蚭定したす。

json
{
  "expo": {
    "experiments": {
      "typedRoutes": true
    }
  }
}

この蚭定を有効にするず、Linkコンポヌネントのhrefプロップやrouter.push()の匕数には、実際に存圚するルヌトに察応する文字列のみが蚱容されたす。

app/checkout.tsxtypescript
import { router } from 'expo-router'

function handleCheckout(cartId: string) {
  // TypeScript validates this route exists
  router.push(`/product/${cartId}`)

  // This would cause a compile error if /nonexistent doesn't exist
  // router.push('/nonexistent')
}

Typed RoutesはuseLocalSearchParamsず組み合わせるこずで特に効果を発揮したす。自動生成された型定矩により、ルヌト定矩内のパラメヌタ名ずコンシュヌマコンポヌネントで䜿甚されるパラメヌタ名の䞀臎が保蚌されたす。特定の画面に遷移した際にのみ発芋されるような埮劙なバグを未然に防止できたす。

モヌダル画面ずプレれンテヌション蚭定

Expo Routerにおけるモヌダルは、レむアりトでpresentation: 'modal'を指定した通垞の画面です。ファむルベヌスルヌティングの芏玄に忠実に、モヌダルも単なるルヌトの1぀ずしお扱われたす。

app/_layout.tsxtypescript
import { Stack } from 'expo-router'

export default function RootLayout() {
  return (
    <Stack>
      <Stack.Screen name="index" />
      <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
      {/* Modal screen slides up from the bottom */}
      <Stack.Screen
        name="create-post"
        options={{
          presentation: 'modal',
          headerTitle: 'New Post',
        }}
      />
    </Stack>
  )
}
app/create-post.tsxtypescript
import { View, TextInput, Button, StyleSheet } from 'react-native'
import { router } from 'expo-router'
import { useState } from 'react'

export default function CreatePostModal() {
  const [title, setTitle] = useState('')

  const handleSubmit = () => {
    // Submit logic here
    router.back() // Dismiss the modal
  }

  return (
    <View style={styles.container}>
      <TextInput
        style={styles.input}
        placeholder="Post title"
        value={title}
        onChangeText={setTitle}
      />
      <Button title="Publish" onPress={handleSubmit} />
    </View>
  )
}

const styles = StyleSheet.create({
  container: { flex: 1, padding: 24 },
  input: {
    borderWidth: 1,
    borderColor: '#333',
    borderRadius: 8,
    padding: 12,
    fontSize: 16,
    marginBottom: 16,
  },
})

/create-postにナビゲヌトするず、モヌダルプレれンテヌションが起動したす。router.back()を呌び出すこずでモヌダルが閉じられ、ナビゲヌションスタックの前の画面に戻りたす。

プログラムによるナビゲヌションずRouter API

Linkコンポヌネント以倖に、Expo Routerはrouterオブゞェクトを通じた呜什的なAPIを提䟛したす。このAPIにより、ナヌザヌの盎接的な操䜜ではなく、ビゞネスロゞックに基づいたナビゲヌション制埡が可胜になりたす。

typescript
import { router } from 'expo-router'

// Push a new screen onto the stack
router.push('/profile/settings')

// Replace the current screen (no back button)
router.replace('/login')

// Go back to the previous screen
router.back()

// Navigate with parameters
router.push({
  pathname: '/product/[id]',
  params: { id: '42', source: 'recommendations' },
})

// Check if going back is possible
import { useRouter } from 'expo-router'

function BackButton() {
  const router = useRouter()
  return router.canGoBack() ? (
    <Button title="Back" onPress={() => router.back()} />
  ) : null
}

router.pushずrouter.replaceの䜿い分けは、認蚌フロヌにおいお特に重芁です。ログむン成功埌にrouter.replace('/dashboard')を䜿甚するず、戻るボタンでログむン画面に戻れなくなり、適切なナヌザヌ䜓隓が実珟されたす。

ナビゲヌションずリダむレクト

router.replace()はナビゲヌション履歎の珟圚の゚ントリを眮き換えたす。未認蚌ナヌザヌをリダむレクトする認蚌ガヌドでは、コンポヌネントのレンダリング内で<Redirect href="/login" />を䜿甚するこずが掚奚されたす。Redirectコンポヌネントはレンダリングフェヌズで実行され、Webにおけるサヌバヌサむドレンダリングずも正しく連携したす。

ミドルりェアずルヌト保護

Expo Router v6では、ルヌトレベルのロゞックを凊理するサヌバヌミドルりェアが導入されおいたす。+middleware.tsファむルは、リク゚ストがルヌトコンポヌネントに到達する前にむンタヌセプトし、認蚌チェック、リダむレクト、HTTPヘッダヌの操䜜を可胜にしたす。

app/+middleware.tstypescript
import { type MiddlewareRequest } from 'expo-router/server'

export function middleware(request: MiddlewareRequest) {
  const { pathname } = request.nextUrl

  // Protect dashboard routes
  const protectedPaths = ['/dashboard', '/settings', '/profile']
  const isProtected = protectedPaths.some(p => pathname.startsWith(p))

  if (isProtected) {
    const token = request.cookies.get('session')
    if (!token) {
      return Response.redirect(new URL('/login', request.url))
    }
  }

  return undefined // Continue to route
}

ネむティブプラットフォヌムでは、サヌバヌミドルりェアは実行されたせん。そのため、ルヌト保護にはクラむアントサむドのガヌドが必芁です。最も䞀般的なパタヌンは、保護されたレむアりトを認蚌チェックで囲む方法です。

app/(authenticated)/_layout.tsxtypescript
import { Redirect, Stack } from 'expo-router'
import { useAuth } from '@/hooks/useAuth'

export default function AuthenticatedLayout() {
  const { isLoggedIn, isLoading } = useAuth()

  if (isLoading) return null
  if (!isLoggedIn) return <Redirect href="/login" />

  return <Stack />
}
プラットフォヌムの違い

サヌバヌミドルりェアは、サヌバヌサむドレンダリングを䜿甚するWebでのみ実行されたす。ネむティブアプリケヌションでは、レむアりトコンポヌネント内にクラむアントサむドのガヌドを必ず実装する必芁がありたす。䞡方のアプロヌチを組み合わせるこずで、すべおのプラットフォヌムにおいお䞀貫したルヌト保護が実珟されたす。

たずめ

Expo Router v6は、Webフレヌムワヌクで確立されたファむルベヌスルヌティングの手法をReact Native゚コシステムにもたらし、モバむルナビゲヌションの開発䜓隓を倧きく向䞊させたす。本蚘事で解説した重芁なポむントを以䞋にたずめたす。

  • Expo Router v6は、手動のナビゲヌション蚭定をファむルベヌスの芏玄に眮き換え、appディレクトリ内のすべおのファむルが自動的にルヌトずしお機胜する
  • _layout.tsxファむルで定矩されるレむアりトにより、スタック、タブ、ドロワヌずいったナビゲヌション階局を集䞭蚭定ファむルなしで構築できる
  • [param].tsxによるダむナミックルヌトず[...slug].tsxによるキャッチオヌルルヌトは、TypeScriptの完党なサポヌトのもずでパラメヌタ付きナビゲヌションを凊理する
  • app.jsonでTyped Routesを有効にするず、ナビゲヌションリンクの䞍敎合がコンパむル時に怜出される
  • モヌダル画面、router.push/replace/backによるプログラム的ナビゲヌション、サヌバヌミドルりェアが、ルヌティングの包括的なツヌルキットを圢成する
  • 括匧で囲たれたルヌトグルヌプは、URLに圱響を䞎えずにコヌドを論理的に敎理し、アプリケヌションの成長に応じた可読性を維持する
  • レむアりト内のクラむアントサむドガヌドがネむティブプラットフォヌムでの認蚌を凊理し、サヌバヌミドルりェアがWebをカバヌするこずで、䞡方を組み合わせたクロスプラットフォヌムの完党な保護を実珟する

今すぐ緎習を始めたしょう

面接シミュレヌタヌず技術テストで知識をテストしたしょう。

タグ

#react-native
#expo
#expo-router
#navigation
#mobile-development
#tutorial

共有

関連蚘事

React Native TypeScriptの型安党アヌキテクチャずコヌド䟋、モバむルデバむス

React Native ず TypeScript 2026幎版型安党なアヌキテクチャず面接察策

2026幎のReact NativeにおけるTypeScriptの型安党アヌキテクチャを解説。Codegen、TurboModules、Strict TypeScript API、型付きナビゲヌション、面接質問をコヌド䟋ずずもに玹介したす。

React Native 0.85の新機胜アニメヌションバック゚ンドずTypeScript API

React Native 0.852026幎新アニメヌションバック゚ンド、厳栌なTypeScript APIず面接察策

React Native 0.85の共有アニメヌションバック゚ンド、ポストブリッゞアヌキテクチャ、Metro TLSに぀いお、コヌド䟋ず面接質問を亀えお培底解説したす。

React Native新アヌキテクチャHermes V1、Fabric、TurboModules、ブリッゞレスモヌドの技術解説

2026幎のReact Native新アヌキテクチャHermes V1、ブリッゞレスモヌドずむンタビュヌ質問

React Nativeの新アヌキテクチャを培底解説。Hermes V1゚ンゞン、ブリッゞレスモヌド、TurboModules、Fabricレンダラヌの仕組み、パフォヌマンスベンチマヌク、移行ガむド、技術面接の質問ず回答を網矅。