Communitygithub.com

expo/expo-upgrade

Framework (OSS). Diretrizes para atualizar versões do SDK Expo e corrigir problemas de dependência

O que é expo-upgrade?

Esta skill fornece orientações abrangentes e um processo passo a passo para atualizar o SDK do Expo, abrangendo desde SDK 53 até SDK 57 ou posterior. Ela aborda detalhadamente a verificação de mudanças críticas, a limpeza de caches, o pré-build (prebuild) para alterações nativas, e o tratamento de pacotes obsoletos, como a migração de `expo-av` para `expo-audio` e `expo-video`. A skill também cobre configurações importantes como o React Compiler, Metro, PostCSS, e o motor Hermes, alertando sobre regressões de memória conhecidas. Lida com a remoção de patches e exclusões de pacotes, e oferece um fluxo para relatar feedback. O objetivo é garantir uma atualização suave e sem erros, minimizando problemas de compatibilidade e regressões. Suporta o ecossistema Expo, incluindo Expo Go e projetos com Continuous Native Generation (CNG), e é aplicável a agentes de IA que auxiliam no desenvolvimento com Expo.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Referências

  • ./references/react-19.md -- SDK +54: Mudanças no React 19 (useContext → use, Context.Provider → Context, remoção de forwardRef)
  • ./references/new-architecture.md -- SDK +53: Guia de migração para a Nova Arquitetura
  • ./references/react-compiler.md -- SDK +54: Guia de configuração e migração do React Compiler
  • ./references/native-tabs.md -- SDK +55: Mudanças nas abas nativas (Icon/Label/Badge agora acessados via NativeTabs.Trigger.*)
  • ./references/expo-av-to-audio.md -- SDK +55: Migrar reprodução e gravação de áudio de expo-av para expo-audio
  • ./references/expo-av-to-video.md -- SDK +55: Migrar reprodução de vídeo de expo-av para expo-video
  • ./references/react-navigation-to-expo-router.md -- SDK +56: Migrar imports @react-navigation/* para pontos de entrada expo-router (codemod + mapeamento manual)

Versões Beta/Preview

Versões beta usam o sufixo .preview (ex.: 55.0.0-preview.2), publicadas sob a tag @next.

Verifique se a versão mais recente é beta: https://exp.host/--/api/v2/versions (procure por -preview em expoVersion)

npx expo install expo@next --fix  # instalar beta

Processo de Atualização Passo a Passo

Se estiver atualizando a partir do SDK 55 ou anterior, pule o SDK 56 e atualize diretamente para o SDK 57. Não use [email protected] ou versões anteriores. O SDK 55 com Hermes V1 habilitado, SDK 56 e versões antigas do SDK 57 contêm uma regressão de memória do Hermes V1 que pode aumentar drasticamente o uso de memória ao usar react-native-worklets ou react-native-reanimated.

  1. Atualize o Expo e as dependências
npx expo install expo@latest
npx expo install --fix
  1. Execute o diagnóstico: npx expo-doctor

  2. Limpe os caches e reinstale

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

Lista de Verificação de Mudanças Críticas

  • Verifique APIs removidas nas notas de lançamento
  • Atualize os caminhos de importação para módulos movidos
  • Revise as mudanças em módulos nativos que exigem prebuild
  • Teste todos os recursos de câmera, áudio e vídeo
  • Verifique se a navegação ainda funciona corretamente

Prebuild para Mudanças Nativas

Primeiro, verifique se os diretórios ios/ e android/ existem no projeto. Se nenhum dos diretórios existir, o projeto usa Continuous Native Generation (CNG) e os projetos nativos são regenerados no momento da construção — pule esta seção e a seção "Limpar caches para bare workflow" inteiramente.

Se a atualização exigir mudanças nativas:

npx expo prebuild --clean

Isso regenera os diretórios ios e android. Certifique-se de que o projeto não seja um aplicativo bare workflow antes de executar este comando.

Limpar caches para bare workflow

Estas etapas só se aplicam quando os diretórios ios/ e/ou android/ existem no projeto:

  • Limpe o cache do CocoaPods para iOS: cd ios && pod install --repo-update
  • Limpe os dados derivados do Xcode: npx expo run:ios --no-build-cache
  • Limpe o cache do Gradle para Android: cd android && ./gradlew clean

Manutenção

  • Revise as notas de lançamento da versão alvo do SDK em https://expo.dev/changelog
  • Atualize os links da documentação versionada nos arquivos de instrução do agente (AGENTS.md). O modelo padrão usa links para https://docs.expo.dev/versions/v<version>/. Procure por docs.expo.dev/versions/ e aumente cada link para a nova versão do SDK.
  • Se estiver usando Expo SDK 54 ou posterior, certifique-se de que react-native-worklets esteja instalado — isso é necessário para o funcionamento do react-native-reanimated.
  • Habilite o React Compiler no SDK 54+ adicionando "experiments": { "reactCompiler": true } ao app.json — ele é estável e recomendado
  • Exclua sdkVersion do app.json para permitir que o Expo o gerencie automaticamente
  • Revise pacotes outrora implícitos, como @babel/core, babel-preset-expo e expo-constants, individualmente, em vez de removê-los por completo. Mantenha qualquer pacote que uma dependência instalada declare como peer obrigatório.
  • Mantenha expo-constants como dependência direta sempre que expo-router estiver instalado. O Expo Router o importa e o declara como peer obrigatório; confiar em uma cópia transitória pode quebrar o autolink nativo fora do Expo Go.
  • Após remover qualquer dependência, execute imediatamente npx expo-doctor e restaure tudo o que ele relatar como peer obrigatório ausente.
  • Se o babel.config.js contiver apenas 'babel-preset-expo', exclua o arquivo
  • Se o metro.config.js contiver apenas os padrões do Expo, exclua o arquivo

Pacotes Obsoletos

Pacote AntigoSubstituição
expo-avexpo-audio e expo-video
expo-permissionsAPIs de permissão de pacotes individuais
@expo/vector-iconsexpo-symbols (para SF Symbols)
AsyncStorageexpo-sqlite/localStorage/install
expo-app-loadingexpo-splash-screen
expo-linear-gradientexperimental_backgroundImage + CSS gradients em View

Ao migrar pacotes obsoletos, atualize todo o código antes de remover o pacote antigo. Para expo-av, consulte as referências de migração para converter Audio.Sound para useAudioPlayer, Audio.Recording para useAudioRecorder e componentes Video para VideoView com useVideoPlayer.

expo.install.exclude

Verifique se o package.json possui pacotes excluídos:

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

As exclusões geralmente são soluções alternativas que podem não ser mais necessárias após a atualização. Revise cada uma.

Removendo patches

Verifique se há patches desatualizados no diretório patches/. Remova-os se não forem mais necessários.

Postcss

  • autoprefixer não é necessário no SDK +53. Remova-o das dependências e verifique postcss.config.js ou postcss.config.mjs para removê-lo da lista de plugins.
  • Use postcss.config.mjs no SDK +53.

Metro

Remova opções de configuração redundantes do Metro:

  • resolver.unstable_enablePackageExports está habilitado por padrão no SDK +53.
  • experimentalImportSupport está habilitado por padrão no SDK +54.
  • EXPO_USE_FAST_RESOLVER=1 foi removido no SDK +54.
  • As extensões cjs e mjs são suportadas por padrão desde o SDK +50.
  • Expo webpack está obsoleto, migre para Expo Router e Metro web.

Motor Hermes v1

Hermes V1 é o padrão no SDK 56 e posterior. Aplicativos SDK 55 que usam Hermes V1, todos os aplicativos SDK 56 e aplicativos SDK 57 anteriores a [email protected] podem encontrar uma regressão de memória ao importar react-native-worklets ou react-native-reanimated. Atualize diretamente para o SDK 57 e [email protected] ou posterior. Não recomende o Modo de Pacote Worklets como uma solução alternativa de produção; ele não é suportado, é experimental e pode não funcionar conforme o esperado.

Não oriente os usuários a optar por ativar ou desativar o Hermes V1. Alterar a versão do Hermes do padrão do SDK não é suportado e tem implicações significativas de construção e gerenciamento de dependências.

Nova Arquitetura

A nova arquitetura está habilitada por padrão; o campo "newArchEnabled": true no app.json não é mais necessário, pois é o padrão. O Expo Go só suporta a nova arquitetura a partir do SDK +53.

Enviando Feedback

Se você encontrar erros, informações enganosas ou desatualizadas nesta skill, informe para que o Expo possa melhorar:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-upgrade" "<feedback acionável>"

Envie apenas quando tiver algo específico e acionável para relatar. Inclua o máximo de contexto relevante possível. Se um agente de IA falhou repetidamente ou o usuário teve que assumir uma tarefa do Expo, carregue a skill expo-skill-feedback e siga seu fluxo eval-candidate em vez de reutilizar o comando acima.

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.

Habilidades Relacionadas