O Expo Go é um playground rápido com uma superfície nativa fixa. Um build de desenvolvimento é seu próprio binário de depuração com expo-dev-client, que carrega todos os módulos nativos que seu projeto instala - o ambiente a partir do qual os aplicativos de produção são realmente construídos.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Ainda prototipando apenas com módulos do Expo SDK? Expo Go é suficiente:npx expo start# Escaneie o QR com o Expo Go (simulador/emulador ou dispositivo com SDK correspondente)# Precisa de código nativo personalizado? Adicione o cliente de desenvolvimento e crie um build de desenvolvimento:npx expo install expo-dev-clienteas build --profile development --platform ios# Instale o .ipa/.apk, então:npx expo start --dev-client
Quando usar isso:
Decidindo se o Expo Go do primeiro dia é suficiente para seu spike do SDK 57.
Encontrando Native module cannot be null após npm install de uma biblioteca não incluída no Expo Go.
Testando notificações push, links de aplicativos/universais ou comportamento realista de splash/ícone personalizado.
Integrando colegas de equipe que confundem as limitações do Expo Go com as limitações da plataforma Expo.
# 2. Construa e instale (exemplo de simulador)eas build --profile development --platform ios# Baixe/instale o build, então inicie o Metro para o dev-client:npx expo start --dev-client
// App.tsx - detecte o runtime para diagnósticos condicionaisimport { useEffect, useState } from "react";import { Button, StyleSheet, Text, View } from "react-native";import * as Expo from "expo";import Constants from "expo-constants";export default function App() { const [inGo, setInGo] = useState<boolean | null>(null); useEffect(() => { setInGo(Expo.isRunningInExpoGo()); }, []); return ( <View style={styles.container}> <Text style={styles.title}>Sonda de Runtime</Text> <Text>expo-dev-client: {Constants.expoConfig?.plugins?.includes("expo-dev-client") ? "configurado" : "n/a"}</Text> <Text>Executando no Expo Go: {inGo === null ? "…" : inGo ? "sim" : "não"}</Text> <Text style={styles.hint}> Builds de desenvolvimento carregam seus módulos nativos. Expo Go carrega apenas módulos enviados dentro do Expo Go. </Text> <Button title="Recarregar" onPress={() => Expo.reloadAppAsync("manual")} /> </View> );}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", padding: 24, gap: 8 }, title: { fontSize: 20, fontWeight: "700" }, hint: { fontSize: 14, color: "#555", marginTop: 8 },});
O que isso demonstra:
expo-dev-client transforma seu aplicativo em um cliente de desenvolvimento com uma interface de lançamento e inspetor de rede.
eas build --profile development produz um binário instalável com seu grafo de dependência nativa.
npx expo start --dev-client serve JS para o binário personalizado em vez do Expo Go.
Expo.isRunningInExpoGo() ramifica diagnósticos ou portões de recursos durante a migração.
Binário no dispositivo (Expo Go ou seu build de desenvolvimento)
Novo módulo nativo, ícone, entitlements, atualização do SDK
Bundle JavaScript
Saída do Metro de npx expo start
Cada Fast Refresh / recarga
Seu JS só pode chamar APIs nativas que existem no aplicativo nativo instalado. Instalar react-native-foo adiciona stubs JS a node_modules, mas até que o código nativo seja compilado em seu binário, as chamadas falham em tempo de execução.
npx expo install expo-dev-client# Garanta que os plugins incluam expo-dev-client (adicionado automaticamente pela instalação)eas build:configure # se eas.json estiver faltandoeas build --profile development --platform all# Loop diário após a instalação:npx expo start --dev-client
Alternativa local quando você tem Xcode/Android Studio:
npx expo run:iosnpx expo run:android
Estes compilam um binário de depuração com expo-dev-client incorporado.
import * as Expo from "expo";export function RuntimeBanner() { if (Expo.isRunningInExpoGo()) { return <Text>Expo Go - alguns recursos nativos desativados</Text>; } return <Text>Build nativo de desenvolvimento / produção</Text>;}
Use a detecção de runtime apenas para diagnósticos - não bifurque a lógica do produto permanentemente em isRunningInExpoGo() a menos que o recurso seja genuinamente indisponível.
Instalar uma biblioteca nativa e esperar que o Expo Go funcione - Instalações JS bem-sucedidas, mas chamadas nativas falham. Correção:npx expo install expo-dev-client e crie um build de desenvolvimento.
Testar notificações push no Expo Go - Push remoto requer seus certificados em seu binário. Correção: Build de desenvolvimento com credenciais de push configuradas.
Assumir que as alterações de splash/ícone aparecem no Expo Go - Expo Go mostra seu próprio shell; sua marca é enviada com builds nativos. Correção: Valide ativos em um build de desenvolvimento ou de pré-visualização.
Esquecer o sinalizador --dev-client - Metro usa o fluxo de QR code do Expo Go por padrão; seu binário personalizado não se conectará corretamente. Correção:npx expo start --dev-client após instalar um build de desenvolvimento.
Dispositivo iOS preso no Expo Go com SDK errado - A App Store oferece apenas o Expo Go mais recente. Correção: Build de desenvolvimento, ou use o simulador com um build do Expo Go para download de expo.dev/go.
Recompilar para cada alteração de JS - Desnecessário. Reconstruções nativas são apenas para alterações de dependência nativa ou de plugin de configuração. Correção: Mantenha o Metro em execução; recarregue JS para edições de componentes.
Enviar expo-dev-client para lojas de produção - O cliente de desenvolvimento pertence a perfis de depuração/internos. Correção: Perfis EAS separados de development e production; produção omite a interface do lançador do dev-client.
Expo Go é um aplicativo de playground Expo pré-construído das lojas de aplicativos. Ele carrega seu bundle JavaScript pela rede para que você possa visualizar a UI rapidamente sem compilar o código nativo você mesmo.
O que é um build de desenvolvimento?
Um build de desenvolvimento é uma versão de depuração do seu aplicativo com a biblioteca expo-dev-client instalada. Ele inclui suas dependências nativas e se conecta ao Metro para recarga rápida de JavaScript - a mesma arquitetura que a produção usa, menos otimizações de release.
Quando o Expo Go é suficiente?
Quando você usa apenas módulos nativos já incluídos no Expo Go (a maioria dos pacotes do SDK expo-*), você está aprendendo RN, ou está construindo UI que não depende de código nativo personalizado, push ou links de aplicativos.
Quando devo mudar para um build de desenvolvimento?
Antes de integrar bibliotecas com código nativo fora do bundle do Expo Go, testar push remoto, configurar links universais/de aplicativos ou validar ícones, splash screens e entitlements reais.
O que o expo-dev-client adiciona?
Um lançador de desenvolvimento, URLs Metro alternáveis, inspeção de rede e suporte para carregar seu grafo de módulos nativos personalizados - capacidades que o Expo Go não pode replicar porque seu binário nativo é fixo.
Como crio um build de desenvolvimento no EAS?
npx expo install expo-dev-clienteas build --profile development --platform ios
Defina "developmentClient": true no perfil EAS. Instale o artefato, então execute npx expo start --dev-client.
Preciso reconstruir para cada alteração de código?
Não. Alterações em JavaScript e React são recarregadas rapidamente através do Metro tanto no Expo Go quanto nos builds de desenvolvimento. Reconstrua apenas quando dependências nativas ou plugins de configuração mudarem.
Armadilha: Por que meu novo pacote nativo funciona após npm install, mas falha em tempo de execução?
npm install adiciona JavaScript e código fonte nativo a node_modules, mas o binário do Expo Go não inclui esse código nativo. Crie um build de desenvolvimento para que o módulo nativo seja compilado em seu aplicativo.
Posso usar o Expo Go com o SDK 57?
Sim, em simuladores/emuladores e dispositivos Android quando as versões do Expo Go se alinham. Dispositivos iOS físicos devem usar a versão do Expo Go da App Store compatível com o SDK 57 - se houver incompatibilidade, use um build de desenvolvimento.
Qual comando inicia o Metro para um build de desenvolvimento?
npx expo start --dev-client
Sem --dev-client, o CLI otimiza para códigos QR do Expo Go.
Como detecto o Expo Go em tempo de execução?
import * as Expo from "expo";Expo.isRunningInExpoGo(); // booleano
Use para diagnósticos, não como uma estratégia permanente de flag de recursos.
Os builds de desenvolvimento são os mesmos que os builds de produção?
Eles compartilham módulos nativos e plugins de configuração, mas os builds de desenvolvimento incluem ferramentas dev-client, símbolos de depuração e distribuição interna. Perfis de produção removem código apenas de desenvolvimento e aplicam assinatura de release.
Posso testar deep links no Expo Go?
Esquemas de URL personalizados funcionam parcialmente, mas App Links / Universal Links precisam de associação bidirecional incorporada em seu binário nativo - impossível no Expo Go. Use um build de desenvolvimento.
Qual é o fluxo de trabalho diário depois de ter um build de desenvolvimento instalado?
Inicie o Metro uma vez (npx expo start --dev-client), abra o aplicativo do cliente de desenvolvimento, escolha seu servidor, itere no JS com Fast Refresh. Reconstrua o nativo apenas quando as dependências nativas mudarem.
O expo-dev-client é enviado para a App Store?
Não. Mantenha-o em perfis de desenvolvimento/internos. Builds de lojas de produção usam um perfil EAS production sem o lançador de desenvolvimento.