Community코딩 & 개발github.com

expo/expo-router

프레임워크 (OSS). Expo Router의 네비게이션 및 라우팅 기능을 다룹니다. 파일 기반 라우트, 그룹 및 동적 라우트, 폴더 구조, 미리보기 및 컨텍스트 메뉴가 있는 Link, 네이티브 Stack, 페이지 제목, 모달 및 폼 시트, NativeTabs, 헤더 및 툴바, 헤더 검색창을 포함합니다.

expo-router란 무엇인가요?

이 스킬은 Expo Router 애플리케이션에서 네비게이션과 라우팅을 구현하는 방법을 설명합니다. 파일 기반 라우팅, 동적 라우트, 그룹 라우트, 폴더 구성을 포함한 전체 라우트 구조를 다루며, `Link` 컴포넌트를 통한 페이지 간 이동, 미리보기 및 컨텍스트 메뉴 추가 방법을 제시합니다. 또한 네이티브 Stack 네비게이션, 모달 및 폼 시트, NativeTabs와 같은 고급 UI 패턴을 구현하는 방법을 제공하며, 헤더 스타일링, 검색창 추가, 페이지 제목 설정 등을 포함합니다. iOS 18 이상에서 Apple Zoom과 같은 최신 기능과 SDK 56+의 변경 사항을 반영하여 최신 Expo 생태계에 맞춰 설계되었습니다. Expo Router, React Native, iOS, Android 환경에서 사용 가능하며, 네이티브 성능과 일관된 사용자 경험을 제공합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-router

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Expo Router 네비게이션

Expo Router 앱을 위한 네비게이션 및 라우팅입니다. 화면 스타일링, 색상, 컨트롤, 미디어 및 시각 효과는 expo-native-ui 스킬을 사용하고, 모션 및 제스처는 expo-animation 스킬을 사용하세요.

참고 자료

필요에 따라 다음 자료를 참조하세요:

references/
  route-structure.md     라우트 규칙, 동적 라우트, 그룹, 폴더 구조
  tabs.md                NativeTabs, JS 탭에서 마이그레이션, iOS 26 기능
  toolbar-and-headers.md Stack 헤더 및 툴바 버튼, 메뉴, iOS 검색
  form-sheet.md          expo-router의 폼 시트: 설정, 푸터 및 배경 상호작용
  search.md              검색창과 헤더, useSearch 훅, 필터링 패턴
  zoom-transitions.md    Apple Zoom: Link.AppleZoom을 사용한 부드러운 줌 전환 (iOS 18+)

코드 스타일

  • 파일 이름은 항상 케밥 케이스(kebab-case)를 사용하세요. 예: comment-card.tsx
  • 네비게이션을 이동하거나 재구성할 때는 항상 이전 라우트 파일을 제거하세요.
  • 파일 이름에 특수 문자를 사용하지 마세요.
  • tsconfig.json에 경로 별칭을 구성하고, 리팩터링 시 상대 경로 import보다 별칭을 선호하세요.

라우트

자세한 라우트 규칙은 ./references/route-structure.md를 참조하세요.

  • 라우트는 app 디렉터리에 속합니다.
  • 컴포넌트, 타입, 유틸리티를 app 디렉터리에 함께 배치하지 마세요. 이는 안티패턴입니다.
  • 앱은 항상 "/"와 일치하는 라우트를 가지고 있어야 하며, 그룹 라우트 내부에 있을 수 있습니다.

라이브러리 선호도

  • expo-router의 Color를 네이티브 시맨틱 색상에 사용하세요. 원시 PlatformColor 대신 사용합니다 (타입 안전, 라이트/다크 자동 적응). 전체 색상 팔레트 패턴은 expo-native-ui를 참조하세요.
  • SDK 56 이상에서는 @react-navigation/*에서 직접 import하지 말고 expo-router/react-navigation을 사용하세요 (@react-navigation/native, /core, /elements, /routers 포함).

동작

  • 화면에 검색창을 추가하려면 Stack.SearchBar를 선호하세요.

네비게이션

Link

라우트 간 네비게이션을 위해 expo-router에서 <Link href="/path" />를 사용하세요.

import { Link } from 'expo-router';

// 기본 링크
<Link href="/path" />

// 커스텀 컴포넌트 감싸기
<Link href="/path" asChild>
  <Pressable>...</Pressable>
</Link>

가능하면 iOS 규칙을 따르기 위해 <Link.Preview>를 포함하세요. 네비게이션 향상을 위해 컨텍스트 메뉴와 미리보기를 자주 추가하세요.

Stack

  • 스택을 정의하려면 항상 _layout.tsx 파일을 사용하세요.
  • 네이티브 네비게이션 스택을 위해 expo-router/stack에서 Stack을 사용하세요.

페이지 제목

Stack.Title로 페이지 제목을 설정하세요:

<Stack.Title>홈</Stack.Title>

컨텍스트 메뉴

Link 컴포넌트에 길게 누르기 컨텍스트 메뉴를 추가하세요:

import { Link } from "expo-router";

<Link href="/settings" asChild>
  <Link.Trigger>
    <Pressable>
      <Card />
    </Pressable>
  </Link.Trigger>
  <Link.Menu>
    <Link.MenuAction
      title="공유"
      icon="square.and.arrow.up"
      onPress={handleSharePress}
    />
    <Link.MenuAction
      title="차단"
      icon="nosign"
      destructive
      onPress={handleBlockPress}
    />
    <Link.Menu title="더 보기" icon="ellipsis">
      <Link.MenuAction title="복사" icon="doc.on.doc" onPress={() => {}} />
      <Link.MenuAction
        title="삭제"
        icon="trash"
        destructive
        onPress={() => {}}
      />
    </Link.Menu>
  </Link.Menu>
</Link>;

Link 미리보기

네비게이션을 향상시키기 위해 링크 미리보기를 자주 사용하세요:

<Link href="/settings">
  <Link.Trigger>
    <Pressable>
      <Card />
    </Pressable>
  </Link.Trigger>
  <Link.Preview />
</Link>

링크 미리보기는 컨텍스트 메뉴와 함께 사용할 수 있습니다.

모달

화면을 모달로 표시하세요:

<Stack.Screen name="modal" options={{ presentation: "modal" }} />

커스텀 모달 컴포넌트를 만드는 것보다 이 방법을 선호하세요.

시트

화면을 동적 폼 시트로 표시하세요:

<Stack.Screen
  name="sheet"
  options={{
    presentation: "formSheet",
    sheetGrabberVisible: true,
    sheetAllowedDetents: [0.5, 1.0],
    contentStyle: { backgroundColor: "transparent" },
  }}
/>
  • contentStyle: { backgroundColor: "transparent" }를 사용하면 iOS 26 이상에서 배경이 액체 유리 효과가 됩니다.

일반적인 라우트 구조

각 탭 안에 탭과 스택이 있는 표준 앱 레이아웃:

app/
  _layout.tsx — <NativeTabs />
  (index,search)/
    _layout.tsx — <Stack />
    index.tsx — 메인 목록
    search.tsx — 검색 뷰
// app/_layout.tsx
import { NativeTabs } from "expo-router/unstable-native-tabs";
import { ThemeProvider, DarkTheme, DefaultTheme } from "expo-router/react-navigation";
import { useColorScheme } from "react-native";

export default function Layout() {
  const colorScheme = useColorScheme();
  return (
    <ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
      <NativeTabs>
        <NativeTabs.Trigger name="(index)">
          <NativeTabs.Trigger.Icon sf="list.dash" md="list" />
          <NativeTabs.Trigger.Label>항목</NativeTabs.Trigger.Label>
        </NativeTabs.Trigger>
        <NativeTabs.Trigger name="(search)" role="search" />
      </NativeTabs>
    </ThemeProvider>
  );
}

두 탭이 공통 화면을 푸시할 수 있도록 공유 그룹 라우트를 만드세요:

// app/(index,search)/_layout.tsx
import { Stack } from "expo-router/stack";
import { colors } from "@/theme/colors";

export default function Layout({ segment }) {
  const screen = segment.match(/\((.*)\)/)?.[1]!;
  const titles: Record<string, string> = { index: "항목", search: "검색" };

  return (
    <Stack
      screenOptions={{
        headerTransparent: true,
        headerShadowVisible: false,
        headerLargeTitleShadowVisible: false,
        headerLargeStyle: { backgroundColor: "transparent" },
        headerTitleStyle: { color: colors.label },
        headerLargeTitleEnabled: true,
        headerBlurEffect: "none",
        headerBackButtonDisplayMode: "minimal",
      }}
    >
      <Stack.Screen name={screen} options={{ title: titles[screen] }} />
      <Stack.Screen name="i/[id]" options={{ headerLargeTitleEnabled: false }} />
    </Stack>
  );
}

headerLargeTitleEnabled는 SDK 56 이상의 옵션 이름입니다. 이전 SDK에서는 상위에서 더 이상 사용되지 않는 headerLargeTitle를 사용합니다.

피드백 제출

오류, 잘못된 정보 또는 오래된 정보가 발견되면 Expo가 개선할 수 있도록 보고하세요:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-router" "<구체적인 피드백>"

구체적이고 실행 가능한 보고 내용이 있을 때만 제출하세요. 가능한 한 많은 관련 컨텍스트를 포함하세요. AI 에이전트가 반복적으로 실패하거나 사용자가 Expo 작업을 대신 수행해야 했다면, 위 명령어를 재사용하는 대신 expo-skill-feedback 스킬을 로드하고 eval-candidate 흐름을 따르세요.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-skill-eval

Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional). Use when the user wants to eval an Expo skill, test that a skill produces working code, benchmark a skill with device screenshots, or verify a skill's output renders correctly.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui

Framework (OSS). Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

관련 스킬