태그
목차

Expo Router로 페이지 생성하기

Expo Router의 파일 기반 라우팅 규칙에 대해 알아본다.

생성일: 2024-07-28

수정일: 2024-07-28

app 디렉토리에 파일을 생성하면 자동으로 앱의 라우트가 된다. 예를 들어, 다음과 같다:

디렉토리 라우트
app/index.tsx /
app/home.tsx /home
app/[user].tsx /expo, /evanbacon 등...
app/settings/index.tsx /settings

페이지

페이지는 app 디렉토리의 파일에서 React 컴포넌트를 default로 export하여 정의한다.

파일 확장자는 .js, .jsx, .tsx, .ts 중 하나를 사용해야 한다.

예를 들어:

React Native의 <Text> 컴포넌트를 플랫폼에 관계없이 렌더링할 수 있다.

// **app/index.tsx**
import { Text } from 'react-native';

export default function Page() {
  return <Text>최상위 페이지</Text>;
}

<div> , <p> 등의 웹 전용 React Component는 네이티브 플렛폼에서는 사용할 수 없다.

// **app/index.tsx**
export default function Page() {
  return <p>Top-level page</p>;
}

위의 예제는 앱과 브라우저에서 / 경로에 매칭된다.

index 파일은 부모 디렉토리와 매칭되며 라우트 세그먼트를 추가하지 않는다.

예를 들어, app/settings/index.tsx 는 앱에서 /settings 와 매칭된다.

플랫폼별 확장자

Warning

플랫폼별 확장자는 Expo Router 3.5.x 에서 추가되었다.

이전 버전의 라이브러리를 사용 중이라면 플랫폼별 모듈 지침을 참조한다.

플랫폼별 확장자

  • .ios.tsx : iOS 전용
  • .android.tsx : Android 전용
  • .native.tsx : 모바일 플랫폼(iOS와 Android) 전용
  • .web.tsx : 웹 전용

Metro 번들러의 플랫폼별 확장자비플랫폼 버전이 존재하는 경우에만 사용할 수 있다.

비플랫폼 버전

Expo Router는 모든 플랫폼에서 동작할 수 있는 기본 버전의 파일이 필요하다. 이를 비플랫폼 버전이라고 한다. 예를 들어, about.tsx 파일이 이에 해당한다.

이는 딥 링킹을 위한 것으로 모든 플랫폼에서 라우트가 보편적으로 사용될 수 있도록 보장한다.

예를 들면 다음과 같다:

app
 ├── _layout.tsx
 ├── _layout.web.tsx
 ├── index.tsx
 ├── about.tsx
 └── about.web.tsx

위의 파일 구조에서:

Note

모든 플랫폼에 기본 구현이 있음을 보장하기 위해 플랫폼별 확장자가 없는 라우트 파일을 제공해야 한다.

동적 라우트

동적 라우트는 URL의 특정 부분이 변할 수 있도록 만든 경로다. 이는 하나의 파일로 여러 가지 비슷한 페이지를 처리할 수 있게 해준다.

즉 URL의 특정 위치에서 고정된 이름의 파일이 없을 때, 동적 라우트 파일이 사용된다.

라우트 매칭된 URL
app/blog/[slug].tsx /blog/123
app/blog/[...rest].tsx /blog/123/settings

동적 세그먼트는 페이지 컴포넌트에서 라우트 파라미터로 접근할 수 있다.

// app/blog/[slug].tsx
import { useLocalSearchParams } from 'expo-router';
import { Text } from 'react-native';

export default function Page() {
  const { slug } = useLocalSearchParams();

  return <Text>블로그 포스트: {slug}</Text>;
}