Expo Go es un entorno rápido con una superficie nativa fija. Un development build es tu propio binario de depuración con expo-dev-client, que lleva cada módulo nativo que tu proyecto instala - el entorno desde el cual se construyen realmente las aplicaciones de producción.
Tarjeta de referencia rápida - lista para copiar y pegar.
# ¿Aún prototipando solo con módulos Expo SDK? Expo Go es suficiente:npx expo start# Escanea el código QR con Expo Go (simulador/emulador o dispositivo con SDK coincidente)# ¿Necesitas código nativo personalizado? Agrega el dev client y crea un development build:npx expo install expo-dev-clienteas build --profile development --platform ios# Instala el .ipa/.apk, luego:npx expo start --dev-client
Cuándo usar esto:
Decidir si Expo Go es suficiente desde el primer día para tu prototipo SDK 57.
Encontrarte con Native module cannot be null después de hacer npm install de una librería no incluida en Expo Go.
Probar notificaciones push, enlaces app/universal, o comportamiento de splash/icono personalizado de forma realista.
Incorporar compañeros de equipo que confunden las limitaciones de Expo Go con las limitaciones de la plataforma Expo.
# 2. Construye e instala (ejemplo de simulador)eas build --profile development --platform ios# Descarga/instala la compilación, luego inicia Metro para dev-client:npx expo start --dev-client
// App.tsx - detecta el tiempo de ejecución para diagnósticos condicionalesimport { 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}>Prueba de tiempo de ejecución</Text> <Text>expo-dev-client: {Constants.expoConfig?.plugins?.includes("expo-dev-client") ? "configurado" : "n/d"}</Text> <Text>Ejecutándose en Expo Go: {inGo === null ? "…" : inGo ? "sí" : "no"}</Text> <Text style={styles.hint}> Los development builds cargan tus módulos nativos. Expo Go solo carga módulos incluidos en Expo Go. </Text> <Button title="Recargar" 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 },});
Lo que esto demuestra:
expo-dev-client convierte tu aplicación en un cliente de desarrollo con una interfaz de launcher e inspector de red.
eas build --profile development produce un binario instalable con tu gráfico de dependencias nativas.
npx expo start --dev-client sirve JS al binario personalizado en lugar de Expo Go.
Expo.isRunningInExpoGo() ramifica diagnósticos o compuertas de características durante la migración.
Binario en el dispositivo (Expo Go o tu development build)
Nuevo módulo nativo, icono, derechos, actualización de SDK
Paquete JavaScript
Salida de Metro desde npx expo start
Cada Fast Refresh / recarga
Tu JS solo puede llamar a APIs nativas que existen en la aplicación nativa instalada. Instalar react-native-foo agrega stubs JS a node_modules, pero hasta que el código nativo se compile en tu binario, las llamadas fallan en tiempo de ejecución.
npx expo install expo-dev-client# Asegúrate de que plugins incluya expo-dev-client (agregado automáticamente por install)eas build:configure # si falta eas.jsoneas build --profile development --platform all# Bucle diario después de instalar:npx expo start --dev-client
Alternativa local cuando tienes Xcode/Android Studio:
npx expo run:iosnpx expo run:android
Estos compilan un binario de depuración con expo-dev-client incrustado.
import * as Expo from "expo";export function RuntimeBanner() { if (Expo.isRunningInExpoGo()) { return <Text>Expo Go - algunas características nativas deshabilitadas</Text>; } return <Text>Binario nativo de desarrollo / producción</Text>;}
Usa la detección de tiempo de ejecución solo para diagnósticos - no bifurques la lógica del producto permanentemente en isRunningInExpoGo() a menos que la característica genuinamente no esté disponible.
Instalar una librería nativa y esperar que Expo Go funcione - Las instalaciones de JS tienen éxito pero las llamadas nativas lanzan error. Solución:npx expo install expo-dev-client y crea un development build.
Probar notificaciones push en Expo Go - Push remoto requiere tus certificados en tu binario. Solución: Development build con credenciales push configuradas.
Asumir que los cambios de splash/icono aparecen en Expo Go - Expo Go muestra su propio shell; tu marca se envía con compilaciones nativas. Solución: Valida activos en una compilación de desarrollo o vista previa.
Olvidar la bandera --dev-client - Metro predeterminado al flujo de código QR de Expo Go; tu binario personalizado no se conectará correctamente. Solución:npx expo start --dev-client después de instalar un dev build.
Dispositivo iOS atrapado en Expo Go de SDK incorrecto - App Store solo ofrece el último Expo Go. Solución: Development build, o usa simulador con una compilación descargable de Expo Go desde expo.dev/go.
Reconstruir para cada cambio de JS - Innecesario. Las recompilaciones nativas son solo para cambios de dependencia nativa o plugin de configuración. Solución: Mantén Metro ejecutándose; recarga JS para ediciones de componentes.
Enviar expo-dev-client a tiendas de producción - El cliente dev pertenece a perfiles de depuración/internos. Solución: Separa perfiles de development y production en EAS; producción omite la interfaz del launcher dev-client.
Expo Go es una aplicación de playground Expo precompilada de las tiendas de aplicaciones. Carga tu paquete JavaScript sobre la red para que puedas previsualizar la UI rápidamente sin compilar código nativo tú mismo.
¿Qué es un development build?
Un development build es una versión de depuración de tu aplicación con la librería expo-dev-client instalada. Incluye tus dependencias nativas y se conecta a Metro para hot reload de JavaScript - la misma arquitectura que usa la producción, menos las optimizaciones de lanzamiento.
¿Cuándo Expo Go es suficiente?
Cuando solo usas módulos nativos ya incluidos en Expo Go (la mayoría de paquetes SDK expo-*), estás aprendiendo RN, o estás construyendo UI que no depende de código nativo personalizado, push, o enlaces de aplicación.
¿Cuándo debo cambiar a un development build?
Antes de integrar librerías con código nativo fuera del paquete de Expo Go, probar push remoto, configurar enlaces universal/app, o validar iconos reales, pantallas de splash y derechos.
¿Qué añade expo-dev-client?
Un launcher de desarrollo, URLs de Metro intercambiables, inspección de red y soporte para cargar tu gráfico de módulo nativo personalizado - capacidades que Expo Go no puede replicar porque su binario nativo es fijo.
¿Cómo creo un development build en EAS?
npx expo install expo-dev-clienteas build --profile development --platform ios
Establece "developmentClient": true en el perfil de EAS. Instala el artefacto, luego ejecuta npx expo start --dev-client.
¿Necesito reconstruir para cada cambio de código?
No. Los cambios de JavaScript y React se recargan en caliente a través de Metro en Expo Go y en development builds. Reconstruye cuando agregues/elimines módulos nativos o cambies plugins de configuración nativa.
Error común: ¿Por qué mi nuevo paquete nativo funciona en npm install pero se cuelga en tiempo de ejecución?
npm install agrega fuente de JavaScript y nativa a node_modules, pero el binario de Expo Go no incluye ese código nativo. Crea un development build para que el módulo nativo se compile en tu aplicación.
¿Puedo usar Expo Go con SDK 57?
Sí en simuladores/emuladores y dispositivos Android cuando las versiones de Expo Go se alinean. Los dispositivos iOS físicos deben usar la versión de App Store Expo Go compatible con SDK 57 - si no coinciden, usa un development build.
¿Qué comando inicia Metro para un development build?
npx expo start --dev-client
Sin --dev-client, el CLI optimiza para códigos QR de Expo Go.
¿Cómo detecto Expo Go en tiempo de ejecución?
import * as Expo from "expo";Expo.isRunningInExpoGo(); // boolean
Usa para diagnósticos, no como una estrategia de bandera de característica permanente.
¿Son iguales los development builds que los production builds?
Comparten módulos nativos y plugins de configuración, pero los development builds incluyen herramientas dev-client, símbolos de depuración y distribución interna. Los perfiles de producción eliminan el código solo de desarrollo y aplican firma de lanzamiento.
¿Puedo probar enlaces profundos en Expo Go?
Los esquemas de URL personalizados funcionan parcialmente, pero App Links / Universal Links necesitan asociación bidireccional integrada en tu binario nativo - imposible en Expo Go. Usa un development build.
¿Cuál es el flujo de trabajo diario después de tener un dev build instalado?
Inicia Metro una vez (npx expo start --dev-client), abre la aplicación dev client, elige tu servidor, itera sobre JS con Fast Refresh. Reconstruye nativo solo cuando cambien las dependencias nativas.
¿Se envía expo-dev-client a la App Store?
No. Mantenlo en perfiles de desarrollo/internos. Las compilaciones de tiendas de producción usan un perfil de production en EAS sin el launcher de desarrollo.