Communitygithub.com

expo/expo-upgrade

Expo SDK 버전 업그레이드 및 종속성 문제 해결을 위한 프레임워크(OSS) 가이드라인입니다.

expo-upgrade란 무엇인가요?

이 스킬은 Expo SDK 버전을 업그레이드하고 관련 종속성 문제를 해결하는 데 필요한 포괄적인 가이드라인을 제공합니다. 개발자가 SDK 53 이상으로 업그레이드할 때 발생할 수 있는 다양한 변경 사항(React 19 변경 사항, New Architecture 마이그레이션, React Compiler 설정, 네이티브 탭 변경 등)을 참조 문서를 통해 단계별로 안내합니다. 특히 SDK 56 이하에서 SDK 57로 직접 업그레이드하도록 권장하며, Hermes V1 메모리 회귀 문제와 같은 알려진 문제를 피할 수 있도록 경고합니다. 주요 기능으로는 `npx expo install expo@latest` 명령어를 통한 업그레이드, `npx expo-doctor` 진단, 캐시 정리, 네이티브 변경 사항에 대한 `npx expo prebuild --clean` 실행, 그리고 `expo-av`와 같은 deprecated 패키지를 `expo-audio`/`expo-video`로 마이그레이션하는 방법을 포함합니다. 또한, 패키지 제외 설정(install.exclude), 패치 파일 정리, PostCSS 및 Metro 설정 최적화에 대한 조언도 제공하여 원활한 업그레이드 경험을 보장합니다.

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

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

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

문서

참조

  • ./references/react-19.md -- SDK +54: React 19 변경 사항 (useContext → use, Context.Provider → Context, forwardRef 제거)
  • ./references/new-architecture.md -- SDK +53: New Architecture 마이그레이션 가이드
  • ./references/react-compiler.md -- SDK +54: React Compiler 설정 및 마이그레이션 가이드
  • ./references/native-tabs.md -- SDK +55: 네이티브 탭 변경 사항 (Icon/Label/Badge 이제 NativeTabs.Trigger.*를 통해 접근)
  • ./references/expo-av-to-audio.md -- SDK +55: expo-av에서 expo-audio로 오디오 재생 및 녹음 마이그레이션
  • ./references/expo-av-to-video.md -- SDK +55: expo-av에서 expo-video로 비디오 재생 마이그레이션
  • ./references/react-navigation-to-expo-router.md -- SDK +56: @react-navigation/* 임포트를 expo-router 진입점으로 마이그레이션 (codemod + 수동 매핑)

베타/프리뷰 릴리스

베타 버전은 .preview 접미사를 사용합니다 (예: 55.0.0-preview.2). @next 태그로 게시됩니다.

최신 버전이 베타인지 확인: https://exp.host/--/api/v2/versions (expoVersion에서 -preview 확인)

npx expo install expo@next --fix  # 베타 설치

단계별 업그레이드 프로세스

SDK 55 이하에서 업그레이드하는 경우, SDK 56을 건너뛰고 SDK 57로 직접 업그레이드하세요. [email protected] 이하 버전을 사용하지 마세요. Hermes V1이 활성화된 SDK 55, SDK 56, 그리고 이전 SDK 57 릴리스에는 react-native-worklets 또는 react-native-reanimated를 사용할 때 메모리 사용량을 급격히 증가시킬 수 있는 Hermes V1 메모리 회귀 문제가 있습니다.

  1. Expo 및 종속성 업그레이드
npx expo install expo@latest
npx expo install --fix
  1. 진단 실행: npx expo-doctor

  2. 캐시 지우기 및 재설치

npx expo export -p ios --clear
rm -rf node_modules .expo
watchman watch-del-all

호환성을 깨는 변경 사항 체크리스트

  • 릴리스 노트에서 제거된 API 확인
  • 이동된 모듈의 임포트 경로 업데이트
  • prebuild가 필요한 네이티브 모듈 변경 사항 검토
  • 모든 카메라, 오디오, 비디오 기능 테스트
  • 내비게이션이 여전히 올바르게 작동하는지 확인

네이티브 변경 사항을 위한 Prebuild

먼저 프로젝트에 ios/ 및 android/ 디렉토리가 있는지 확인하세요. 두 디렉토리 모두 존재하지 않으면 프로젝트가 CNG(Continuous Native Generation)를 사용하며 네이티브 프로젝트는 빌드 시 재생성됩니다. 이 섹션과 "Bare 워크플로우를 위한 캐시 지우기"를 완전히 건너뛰세요.

업그레이드에 네이티브 변경이 필요한 경우:

npx expo prebuild --clean

이 명령은 ios 및 android 디렉토리를 다시 생성합니다. 이 명령을 실행하기 전에 프로젝트가 bare 워크플로우 앱이 아닌지 확인하세요.

Bare 워크플로우를 위한 캐시 지우기

이 단계는 프로젝트에 ios/ 및/또는 android/ 디렉토리가 존재하는 경우에만 적용됩니다:

  • iOS용 CocoaPods 캐시 지우기: cd ios && pod install --repo-update
  • Xcode용 Derived Data 지우기: npx expo run:ios --no-build-cache
  • Android용 Gradle 캐시 지우기: cd android && ./gradlew clean

유지 관리

  • 대상 SDK 버전의 릴리스 노트를 https://expo.dev/changelog 에서 검토하세요.
  • 에이전트 명령 파일(AGENTS.md)에서 버전별 문서 링크를 업데이트하세요. 기본 템플릿은 https://docs.expo.dev/versions/v<version>/ 링크를 사용합니다. docs.expo.dev/versions/를 검색하고 각 링크를 새 SDK 버전으로 변경하세요.
  • Expo SDK 54 이상을 사용하는 경우 react-native-worklets가 설치되어 있는지 확인하세요. 이는 react-native-reanimated 작동에 필요합니다.
  • SDK 54+에서 React Compiler를 활성화하려면 app.json에 "experiments": { "reactCompiler": true }를 추가하세요. 안정적이며 권장됩니다.
  • app.json에서 sdkVersion을 삭제하여 Expo가 자동으로 관리하도록 하세요.
  • @babel/core, babel-preset-expo, expo-constants와 같은 이전에는 암시적이었던 패키지를 일괄 제거하지 말고 개별적으로 검토하세요. 설치된 종속성이 필수 피어로 선언하는 패키지는 유지하세요.
  • expo-router가 설치된 경우 expo-constants를 직접 종속성으로 유지하세요. Expo Router는 이를 가져와 필수 피어로 선언합니다. 전이적 복사본에 의존하면 Expo Go 외부에서 네이티브 자동 링킹이 손상될 수 있습니다.
  • 종속성을 제거한 후 즉시 npx expo-doctor를 실행하고, 누락된 필수 피어로 보고되는 항목을 복원하세요.
  • babel.config.js에 'babel-preset-expo'만 포함되어 있으면 파일을 삭제하세요.
  • metro.config.js에 Expo 기본값만 포함되어 있으면 파일을 삭제하세요.

Deprecated 패키지

이전 패키지대체 패키지
expo-avexpo-audio 및 expo-video
expo-permissions개별 패키지 권한 API
@expo/vector-iconsexpo-symbols (SF Symbols용)
AsyncStorageexpo-sqlite/localStorage/install
expo-app-loadingexpo-splash-screen
expo-linear-gradientexperimental_backgroundImage + View의 CSS 그라데이션

deprecated 패키지를 마이그레이션할 때는 이전 패키지를 제거하기 전에 모든 코드 사용을 업데이트하세요. expo-av의 경우 마이그레이션 참조를 참조하여 Audio.Sound를 useAudioPlayer로, Audio.Recording을 useAudioRecorder로, Video 컴포넌트를 useVideoPlayer가 포함된 VideoView로 변환하세요.

expo.install.exclude

package.json에 제외된 패키지가 있는지 확인하세요:

{
  "expo": { "install": { "exclude": ["react-native-reanimated"] } }
}

제외 항목은 종종 업그레이드 후 더 이상 필요하지 않을 수 있는 해결 방법입니다. 각 항목을 검토하세요.

패치 제거

patches/ 디렉토리에 오래된 패치가 있는지 확인하세요. 더 이상 필요하지 않으면 제거하세요.

PostCSS

  • autoprefixer는 SDK +53에서 필요하지 않습니다. 종속성에서 제거하고 postcss.config.js 또는 postcss.config.mjs를 확인하여 플러그인 목록에서 제거하세요.
  • SDK +53에서는 postcss.config.mjs를 사용하세요.

Metro

중복된 Metro 구성 옵션을 제거하세요:

  • resolver.unstable_enablePackageExports는 SDK +53에서 기본적으로 활성화됩니다.
  • experimentalImportSupport는 SDK +54에서 기본적으로 활성화됩니다.
  • EXPO_USE_FAST_RESOLVER=1은 SDK +54에서 제거되었습니다.
  • cjs 및 mjs 확장자는 SDK +50에서 기본적으로 지원됩니다.
  • Expo webpack은 deprecated되었습니다. Expo Router 및 Metro 웹으로 마이그레이션하세요.

Hermes 엔진 v1

Hermes V1은 SDK 56 이상에서 기본값입니다. Hermes V1을 사용하는 SDK 55 앱, 모든 SDK 56 앱, [email protected] 이전의 SDK 57 앱은 react-native-worklets 또는 react-native-reanimated를 가져올 때 메모리 회귀가 발생할 수 있습니다. SDK 57 및 [email protected] 이상으로 직접 업그레이드하세요. 프로덕션 해결 방법으로 Worklets Bundle Mode를 권장하지 마세요. 지원되지 않고 실험적이며 예상대로 작동하지 않을 수 있습니다.

사용자가 Hermes V1을 선택하거나 선택 해제하도록 안내하지 마세요. SDK 기본값에서 Hermes 버전을 변경하는 것은 지원되지 않으며 상당한 빌드 및 종속성 관리 주의 사항이 있습니다.

New Architecture

New Architecture는 기본적으로 활성화되어 있습니다. app.json 필드 "newArchEnabled": true는 기본값이므로 더 이상 필요하지 않습니다. Expo Go는 SDK +53부터 New Architecture만 지원합니다.

피드백 제출

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

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

구체적이고 실행 가능한 보고 사항이 있을 때만 제출하세요. 가능한 한 많은 관련 컨텍스트를 포함하세요. 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

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

Deploy Expo websites and Expo Router API routes to EAS Hosting - export the web bundle, run eas deploy for production and PR preview URLs, manage environment secrets and custom domains, and work within the Cloudflare Workers runtime. Also covers authoring API routes (+api.ts handlers, HTTP methods, request handling, CORS). Use when deploying an Expo web app or API routes, setting up EAS Hosting, or configuring hosting environments and domains. Not for native builds or store releases - use the eas-app-stores skill for those.

관련 스킬