10 exemplos para entender como selecionamos, fixamos e desativamos dependências em dispositivos móveis - 7 básicos e 3 intermediários. Estes são os padrões da equipe para aplicativos Expo SDK 57; cookbooks mais aprofundados para cada biblioteca seguem nesta seção.
Comece com um projeto SDK 57 fixado. As bibliotecas essenciais são padrões selecionados - não todo pacote npm que resolve um problema pertence a um aplicativo em produção.
Ferramentas: Estes exemplos visam o Expo SDK 57 (expo ~57.0.4), React Native 0.86.0 e React 19.2.3. Módulos nativos requerem um build de desenvolvimento ou build EAS - não apenas o Expo Go padrão quando o pacote envia código nativo personalizado.
As decisões de dependência móvel começam com que tipo de estado ou I/O você precisa - não repositórios em tendência.
┌────────────────────┬─────────────────────────┬──────────────────────────┐│ Problema │ Biblioteca Padrão │ Não usar para │├────────────────────┼─────────────────────────┼──────────────────────────┤│ Cache de API/servidor │ @tanstack/react-query │ Badge do carrinho, toggle de tema ││ UI global do cliente │ zustand │ Linhas do catálogo de produtos ││ KV local rápido │ react-native-mmkv │ Dados offline relacionais ││ Listas longas │ @shopify/flash-list │ Tela de configurações de 8 linhas ││ Gestos / movimento │ Reanimated 4 + RNGH │ Fade de 200ms de um único disparo ││ Relatório de falhas│ @sentry/react-native │ Console.log em produção │└────────────────────┴─────────────────────────┴──────────────────────────┘
Uma biblioteca por classe de problema - duas bibliotecas de lista ou duas stores globais criam dívida de migração
Prefira pacotes Expo-first - npx expo install resolve versões; menos surpresas de compilação nativa
Documente exceções em um ADR - não em um thread do Slack que ninguém encontra durante o onboarding
O Expo mantém uma matriz de compatibilidade por SDK. Fixar manualmente react-native-reanimated@latest quebra os builds EAS quando o ABI nativo não corresponde ao RN 0.86.
# Correto - resolve a versão compatível com SDK 57npx expo install react-native-reanimated react-native-gesture-handler# Arriscado para módulos nativos - pode instalar semver incompatívelnpm install react-native-reanimated
# Verifique após qualquer alteração de dependêncianpx expo-doctor
npx expo install grava o intervalo fixado com til que o Expo testou contra seu SDK
Pacotes apenas em JS (zod, @tanstack/react-query, zustand) podem usar npm install - sem ponte nativa
Execute expo-doctor em CI de lançamento e noturno - captura descompasso antes do eas build
Confirme alterações no lockfile com o PR de dependência - instalações reproduzíveis no EAS
Toda biblioteca com código nativo traz autolinking, plugins de configuração e tamanho binário de armazenamento. Leia os docs de instalação antes de mesclar.
# Após adicionar uma biblioteca candidatanpx expo install react-native-mmkvnpx expo prebuild --dry-run # expõe alterações de plugin de configuraçãonpx expo-doctor
Lista de verificação antes de mesclar:
Pergunta
Passou
Falhou → adiar ou encontrar alternativa
Funciona no fluxo gerenciado do Expo?
Sim
Requer fork bare
Precisa de plugin de configuração em app.config?
Documentado
Diferença nativa surpresa
Requer reconstrução do cliente de desenvolvimento?
Planejado na sprint
Bloqueado em QA apenas Expo Go
Duplica biblioteca existente?
Sem sobreposição
Consolidar primeiro
MMKV, FlashList, Sentry, Reanimated todos requerem um build de desenvolvimento ou binário EAS - planeje o tempo de reconstrução
expo prebuild --dry-run visualiza alterações de projeto nativo sem escrever ios/ / android/
Conte módulos nativos totais - cada um é um item de reconciliação de atualização do SDK
Fixações de lista/armazenamento nativas (@shopify/flash-list, react-native-mmkv, @react-native-community/netinfo) são escritas por npx expo install - não edite manualmente esses intervalos.
Nem todo aplicativo precisa de react-native-mmkv desde o primeiro dia. Comece com AsyncStorage; atualize quando a análise de desempenho provar que leituras síncronas importam.
Ordem de seleção de armazenamento:1. Estado do React na memória / Cache do Query → efêmero2. @react-native-async-storage/async-storage → JSON pequeno, hidratação de boot3. react-native-mmkv → leituras síncronas de caminho crítico a cada frame4. expo-sqlite → linhas relacionais, migrações, consultas5. expo-secure-store → tokens, segredos
npx expo install @react-native-async-storage/async-storage# Adicione MMKV apenas após o Profiler do React DevTools mostrar armazenamento await no caminho críticonpx expo install react-native-mmkv
AsyncStorage é assíncrono - await getItem em cada renderização causa lentidão
MMKV é síncrono - ideal para persist do Zustand e flags de recursos lidos a cada montagem
MMKV não é um banco de dados - sem SQL, sem joins; use SQLite para dados relacionais offline
MMKV requer um build de desenvolvimento - não disponível no Expo Go padrão
@shopify/flash-list é uma melhoria de desempenho - não um requisito do primeiro dia para cada tela.
// Lista de configurações curta - FlatList está bomimport { FlatList } from "react-native";// Feed pesado em imagens com lentidão de scroll no Android - migreimport { FlashList } from "@shopify/flash-list";
Lista de verificação de gatilho de migração:
O Profiler mostra quedas de frame durante scroll rápido em um dispositivo Android de gama média
A lista tem mais de 50 linhas com imagens ou conteúdo variável
A sintonia de windowSize no FlatList não corrigiu flashes em branco
npx expo install @shopify/flash-list
Não migre todas as FlatList preventivamente - o custo da sintonia estimada é alto
Desativar é uma remoção planejada - não deixar um pacote apodrecer em package.json até que a atualização exploda.
# 1. Confirme zero importaçõesnpx knipnpx depcheck# 2. Remova o pacote e a entrada do lockfilenpm uninstall legacy-state-library# 3. Remova o plugin de configuração nativo de app.config.ts, se presente# 4. Reconstrua o cliente de desenvolvimento - o autolinking deve remover o módulo nativoeas build --profile development --platform all# 5. Verifique no dispositivonpx expo-doctor
// app.config.ts - remova o stanza do plugin ao desativarexport default { plugins: [ // ["legacy-library-expo-plugin"], ← delete "expo-router", ],};
Desative em um PR dedicado - mais fácil de fazer bissecção do que em um pacote com um recurso
Execute knip antes da remoção - arquivos órfãos frequentemente escondem a última importação
Reconstrua o nativo após remover qualquer pacote com código nativo - clientes de desenvolvimento desatualizados travam misteriosamente
Documente por que foi removido na descrição do PR - evita reintrodução no próximo trimestre
Padronize as perguntas de revisão para que cada nova biblioteca receba o mesmo escrutínio.
## PR de Dependência: @shopify/flash-list- [ ] Classe de problema documentada (desempenho da lista - tela de feed)- [ ] Instalado com `npx expo install`- [ ] `npx expo-doctor` limpo- [ ] Reconstrução nativa agendada / concluída- [ ] Nenhuma biblioteca duplicada (FlatList permanece para configurações)- [ ] Impacto do bundle anotado (tamanho da fonte + nativo)- [ ] Plano de teste em dispositivo Android físico- [ ] ADR atualizado se isso alterar o padrão da equipe
# .github/workflows/pr-checks.yml - adicione em PRs com a label 'dependencies'- name: Expo doctor if: contains(github.event.pull_request.labels.*.name, 'dependencies') run: npx expo-doctor
Rotule PRs de dependência como dependencies - aciona etapas extras de CI
Bloqueie a mesclagem se expo-doctor falhar - descompasso de versão é mais barato de corrigir no PR do que na fila do EAS
Exija nota de teste em dispositivo para módulos nativos - simuladores perdem falhas de autolinking
Link para o cookbook nesta seção ao adotar uma biblioteca padrão
Os incrementos de SDK são quando bibliotecas não fixadas ou duplicadas causam mais problemas. Execute uma passagem de reconciliação antes de mesclar o PR do SDK.
# Fluxo de atualização (simplificado)npx expo install expo@~57.0.4 --fixnpx expo-doctornpx knipnpm run typecheck && npm test# Reinstale a pilha nativa essencial contra a nova matriznpx expo install react-native-reanimated react-native-gesture-handler \ react-native-mmkv @shopify/flash-list @sentry/react-nativeeas build --profile preview --platform all
Etapa
Objetivo
expo install --fix
Alinhe todos os módulos expo-* ao SDK 57
expo-doctor
Capture dependências de pares incompatíveis
knip
Remova bibliotecas que morreram durante o último ciclo de lançamento
Build EAS de pré-visualização
Valide a compilação nativa antes da tag de produção
Releia a configuração do Babel
O plugin Reanimated deve permanecer por último
Não atualize o SDK e adicione novas bibliotecas em um único PR - faça bissecção de falhas
Verifique os changelogs dos plugins de configuração - plugins Sentry e de notificações mudam entre SDKs
Reexecute Maestro smoke no binário de pré-visualização - gestos e listas quebram silenciosamente em incrementos nativos
Quais bibliotecas estão na seção Bibliotecas Essenciais?
TanStack Query, Zustand, MMKV, FlashList, Reanimated + Gesture Handler e Sentry - a pilha de produção padrão para aplicativos Expo SDK 57 neste site de documentação.
Posso usar npm install para @tanstack/react-query?
Sim - é apenas em JS, sem módulo nativo do Expo. Ainda assim, fixe um intervalo semver e confirme o lockfile. Para qualquer pacote que o Expo documente na referência do SDK, prefira npx expo install.
Quantas stores globais devo ter?
Uma store Zustand por domínio (carrinho, preferências, onboarding) - não uma mega-store. Veja zustand.
Quando preciso de um novo build EAS após adicionar uma biblioteca?
Sempre que o pacote adicionar código nativo ou um plugin de configuração - MMKV, FlashList, Sentry, Reanimated. Pacotes apenas em JS precisam apenas de reinicialização do Metro.
Como justifico uma biblioteca não padrão para a equipe?
Escreva um ADR curto: problema, alternativas consideradas, custo nativo, plano de desativação. Link para ele no PR de dependência.