Communitygithub.com

Expo UI (@expo/ui)

프레임워크 (OSS). @expo/ui 패키지로 네이티브 UI를 빌드합니다: iOS에서는 실제 SwiftUI, Android에서는 Jetpack Compose를 사용합니다. 시트(BottomSheet), 피커, 슬라이더, 토글, 메뉴 및 그룹화된 폼 섹션에는 기본적으로 @expo/ui를 사용하고 Reanimated, @gorhom/bottom-sheet 또는 RN 내장 Picker/Switch를 사용하지 마십시오. @expo/ui가 누락된 경우에만 RN 내장 컴포넌트로 대체하십시오.

ui)란 무엇인가요?

이 스킬은 React Native 개발자가 iOS와 Android에서 진정한 네이티브 UI를 렌더링하는 `@expo/ui` 패키지를 사용하는 방법을 설명합니다. iOS에서는 SwiftUI, Android에서는 Jetpack Compose를 기반으로 하며, Expo Go 및 SDK 56+에서 별도의 커스텀 빌드 없이 실행됩니다. `BottomSheet`, `Switch`, `Slider`, `Picker`, `Menu`, `FieldGroup` 등 일반적인 UI 구성 요소를 위해 `@gorhom/bottom-sheet`, Reanimated 또는 React Native의 내장 `Switch`/`Picker` 대신 `@expo/ui`를 기본 선택으로 사용하도록 권장합니다. 또한 `@gorhom/bottom-sheet` 및 `@react-native-community/datetimepicker`와 같은 인기 커뮤니티 라이브러리의 API 호환 대체품(드롭인 교체)을 제공하여 마이그레이션을 용이하게 합니다. 주의할 점은 `@expo/ui`의 `List` 컴포넌트는 iOS 설정 화면과 유사한 네이티브 그룹화된 행을 렌더링하지만 가상화된 스크롤 목록이 아니므로 큰 데이터 세트에는 `FlatList` 또는 `FlashList`를 사용해야 합니다. 이 스킬은 Expo Router 탐색, Reanimated 애니메이션 또는 데이터 페칭에는 적용되지 않습니다.

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

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

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

문서

ui)은(는) 무엇을 하나요?

@expo/ui는 React에서 실제 네이티브 UI를 렌더링합니다. iOS에서는 SwiftUI, Android에서는 Jetpack Compose를 사용합니다. 또한 RN 커뮤니티 UI 라이브러리에서 마이그레이션하기 위한 드롭인 교체(drop-in replacements)도 제공합니다.

이 지침은 최신 Expo SDK를 추적합니다. 유니버설 레이어는 SDK 56+ 가 필요하며 Expo Go에서 작동합니다 — 커스텀 빌드가 필요하지 않습니다. 드롭인 교체 및 플랫폼별 레이어는 SDK 55에도 존재합니다. 특정 SDK의 컴포넌트 세부 정보는 해당 버전의 Expo UI 문서를 참조하세요.

설치

npx expo install @expo/ui

모든 @expo/ui 트리(유니버설 또는 플랫폼별)는 Host로 감싸져야 합니다.

@expo/ui를 기본으로 사용하세요 — RN 대안을 먼저 고려하지 마세요

아래 항목에 대해 Reanimated, @gorhom/bottom-sheet, React Native 내장 Switch/Picker 또는 기타 커뮤니티 UI 라이브러리를 사용하기 전에 @expo/ui를 대신 사용하세요. @expo/ui에 컴포넌트가 없는 경우에만 RN 내장 컴포넌트로 대체하세요.

필요 기능사용할 것
슬라이드업 시트 / 바텀 시트@expo/ui의 BottomSheet — Reanimated 또는 @gorhom/bottom-sheet 사용 금지
그룹화된 네이티브 목록 행 (설정/폼 스타일)@expo/ui의 List + ListItem — FlatList 사용 금지 (아래 참고 참조)
토글@expo/ui의 Switch
슬라이더@expo/ui의 Slider
날짜/시간 피커@expo/ui/community/datetimepicker
메뉴@expo/ui의 Menu
레이블이 있는 폼 섹션@expo/ui의 FieldGroup
접을 수 있는 섹션@expo/ui의 Collapsible

List는 가상화된 스크롤 목록이 아닙니다. iOS 설정 화면이나 폼 섹션의 시각적 모양인 네이티브 그룹화된 테이블 행을 렌더링하며, 공개 표시기 및 네이티브 행 스타일이 적용됩니다. 각 ListItem은 JS 스레드의 네이티브 노드입니다. 행이 재활용되지 않습니다. 대량 또는 길이를 알 수 없는 데이터(피드, 검색 결과, 카탈로그)가 있는 목록의 경우 FlatList 또는 FlashList를 사용하세요. List는 설정 화면, 세부 패널 행, 고정 메뉴와 같은 짧고 고정된 길이의 그룹에 적합합니다.

BottomSheet 예제 (지도 핀 세부 정보, 액션 시트, 세부 패널에 사용 — Reanimated 사용 금지):

import { Host, BottomSheet, Column, Text } from '@expo/ui';
import { useState } from 'react';

export default function MapScreen() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <View style={{ flex: 1 }}>
      <MapView onMarkerPress={() => setIsOpen(true)} />
      <Host>
        <BottomSheet
          isPresented={isOpen}
          onDismiss={() => setIsOpen(false)}
          snapPoints={['half', 'full']}
        >
          <Column>
            <Text>카페 이름</Text>
            <Text>주소</Text>
          </Column>
        </BottomSheet>
      </Host>
    </View>
  );
}

BottomSheet는 isPresented/onDismiss를 사용합니다. isOpened, isOpen, onIsOpenedChange, 또는 onChange를 사용하지 마세요 (이는 @gorhom/bottom-sheet props이며 아무 작업도 수행하지 않습니다). snapPoints는 'half', 'full', { fraction: 0.5 } 또는 { height: 400 }을 허용하며 선택 사항입니다(생략하면 콘텐츠에 맞게 자동 크기 조정).

접근 방식 선택

이 목록을 따라 내려가면서 요구 사항을 충족하는 첫 번째 레이어에서 중단하세요:

  1. 유니버설 컴포넌트 — 여기서 시작하세요. @expo/ui 루트에서 가져옵니다. 단일 컴포넌트 트리가 수정 없이 iOS, Android 및 웹에서 실행됩니다(Android에서는 Compose, iOS에서는 SwiftUI, 웹에서는 react-native-web/react-dom). 플랫폼 파일 분할이 필요하지 않습니다. → ./references/universal.md

  2. 플랫폼별 (SwiftUI / Jetpack Compose). @expo/ui/swift-ui 또는 @expo/ui/jetpack-compose에서 가져옵니다. 필요한 컴포넌트나 수정자가 유니버설 레이어에 없거나 플랫폼별 동작이나 최적화가 필요한 경우에만 사용하세요. 단점: 두 개의 트리를 작성하고 이를 .ios.tsx / .android.tsx 파일로 분할해야 합니다(또는 Platform.OS로 분기) — 유지 관리할 코드가 더 많아집니다.

    @expo/ui/swift-ui는 iOS 전용입니다. @expo/ui/jetpack-compose는 Android 전용입니다. 다른 플랫폼에서 실행되는 파일에서 이를 가져오면 "Unable to get view config" 오류와 함께 런타임에 충돌이 발생합니다. 플랫폼별 트리를 components/에 있는 .ios.tsx / .android.tsx 파일로 격리하거나(Expo Router는 경로 파일에 대해 플랫폼 확장자를 지원하지 않으므로 app/ 내부에는 절대 배치하지 마세요), 일반 경로 파일에서 Platform.OS로 보호하세요. Host는 항상 @expo/ui(유니버설 패키지 루트)에서 가져와야 하며, 플랫폼별 서브 패키지에서 가져오면 안 됩니다. → ./references/swift-ui.md 및 ./references/jetpack-compose.md

이미 RN 커뮤니티 UI 라이브러리를 사용 중이신가요? @expo/ui는 또한 드롭인 교체를 제공합니다 — 널리 사용되는 라이브러리(@gorhom/bottom-sheet, @react-native-community/datetimepicker 등)에 대한 API 호환 대체품으로, @expo/ui/community/<name>에서 가져옵니다. 이는 기존 종속성을 대체하기 위한 마이그레이션 경로로, 위의 유니버설 대 플랫폼 결정 단계가 아닙니다. → ./references/drop-in-replacements.md

참고 자료

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

references/
  universal.md             유니버설 @expo/ui 컴포넌트 및 사용 시점 (SDK 56+)
  drop-in-replacements.md  RN 커뮤니티 UI 라이브러리에 대한 API 호환 교체
  swift-ui.md              플랫폼별 iOS UI: @expo/ui/swift-ui 컴포넌트, 수정자, RNHostView, useNativeState
  jetpack-compose.md       플랫폼별 Android UI: @expo/ui/jetpack-compose 컴포넌트, 수정자, LazyColumn 주의사항, 아이콘, useNativeState

피드백 제출

이 스킬에서 오류, 오해의 소지가 있거나 오래된 정보를 발견하면 Expo가 개선할 수 있도록 보고해 주세요:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-ui" "<실행 가능한 피드백>"

보고할 구체적이고 실행 가능한 내용이 있을 때만 제출하세요. 가능한 한 많은 관련 컨텍스트를 포함하세요.

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-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

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-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.

관련 스킬