Conceptos básicos de Expo Platform
10 ejemplos para comenzar con Expo Platform - 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para comenzar con Expo Platform - 7 básicos y 3 intermedios.
Los proyectos Expo se estructuran con create-expo-app, que fija el SDK, la configuración de Metro y el diseño predeterminado de TypeScript en un paso.
npx create-expo-app@latest MyExpoApp --template blank-typescript
cd MyExpoAppConfirma la fijación del SDK en package.json antes de instalar nada más:
{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}Inicia el servidor de desarrollo y abre la aplicación en un dispositivo o simulador:
npx expo startPresiona i para el Simulador de iOS, a para Android, o escanea el código QR con Expo Go. Cada ejemplo ejecutable a continuación puede reemplazar App.tsx en el proyecto que acabas de crear.
Herramientas: Estos ejemplos se dirigen a Expo SDK 57 (
expo~57.0.4), React Native 0.86.0 y React 19.2.3.
Expo envuelve React Native con herramientas, un conjunto de módulos seleccionados y un proyecto nativo administrado - tu código de interfaz de usuario sigue siendo RN estándar.
import { StatusBar } from "expo-status-bar";
import { StyleSheet, Text, View } from "react-native";
export default function App() {
return (
<View style={styles.container}>
<Text style={styles.title}>Expo + React Native</Text>
<Text style={styles.body}>
Same View/Text primitives - Expo supplies the dev server, config, and
native bootstrap.
</Text>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", padding: 24, gap: 8 },
title: { fontSize: 22, fontWeight: "700" },
body: { fontSize: 15, color: "#4b5563", lineHeight: 22 },
});expo-status-bar se distribuyen como módulos Expo con código nativo precompilado para el SDKios/ y android/ a través de prebuild a menos que expulses o ejecutes bareRelacionado: create-expo-app Quickstart - plantillas y verificación de primera ejecución | Expo Modules Core - cómo se inician los módulos nativos
Una aplicación Expo nueva es un árbol pequeño y predecible - aprende estos archivos antes de agregar características.
MyExpoApp/
├── App.tsx # Componente raíz (interfaz de usuario de entrada)
├── app.json # Manifiesto estático (o app.config.ts)
├── package.json # Dependencias y scripts fijados por SDK
├── tsconfig.json
├── assets/ # Iconos, splash, imágenes incluidas en tiempo de compilación
└── node_modules/App.tsx es la raíz predeterminada - los proyectos de Expo Router lo cambian por un directorio app/ en su lugarapp.json (o app.config.ts) es la única fuente de verdad para la identidad de la aplicación, iconos y permisos nativosassets/ se hace referencia por URI en la configuración (icon, splash) e importados en componentesios/ o android/ aún en modo administrado puro - aparecen después de npx expo prebuild o una compilación EASRelacionado: create-expo-app Quickstart - opciones de plantilla y referencia de script
La versión del paquete expo es el contrato que cada otro módulo Expo debe satisfacer.
{
"name": "my-expo-app",
"main": "expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}expo ~57.0.4 bloquea el proyecto en el SDK 57 - mezclar módulos SDK 56 con expo SDK 57 causa fallos de compilación nativosmain: "expo/AppEntry.js" conecta Metro al bootstrap de Expo, que registra tu componente raízexpo start para que las banderas LAN, tunnel y dev-client se mantengan consistentes en todo el equiponpm install luego npx expo doctor para detectar desviación de versión antes de tu primera compilaciónRelacionado: Upgrading Expo SDK Versions - bumps intencionales y
expo install --fix
Estas claves de manifiesto definen cómo aparece el binario en las pantallas de inicio del dispositivo y en las tiendas de aplicaciones.
{
"expo": {
"name": "My Expo App",
"slug": "my-expo-app",
"version": "1.0.0",
"scheme": "myexpoapp",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash-icon.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"ios": {
"bundleIdentifier": "com.example.myexpoapp"
},
"android": {
"package": "com.example.myexpoapp"
}
}
}name es la etiqueta visible para el usuario; slug es el identificador de proyecto Expo seguro para URLscheme registra un esquema de URL personalizado para enlaces profundos (myexpoapp://)bundleIdentifier / package debe ser único por aplicación - cambiarlos después del lanzamiento de la tienda crea una nueva listaRelacionado: app.json & app.config.js - configuración dinámica y manifiestos multiambiente
expo start inicia Metro, imprime un código QR y recarga en caliente App.tsx al guardar.
# Predeterminado: URL de LAN para dispositivos en la misma red
npx expo start
# Borrar el caché de Metro después de cambios de dependencia o babel
npx expo start --clear
# Túnel cuando LAN/firewall bloquea dispositivo ↔ portátil (más lento, pero confiable)
npx expo start --tunnelimport { useState } from "react";
import { Pressable, StyleSheet, Text, View } from "react-native";
export default function App() {
const [count, setCount] = useState(0);
return (
<View style={styles.container}>
<Text style={styles.count}>{count}</Text>
<Pressable style={styles.button} onPress={() => setCount((c) => c + 1)}>
<Text style={styles.buttonText}>Incrementar - guardar para recargar en caliente</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", alignItems: "center", gap: 16 },
count: { fontSize: 48, fontWeight: "700" },
button: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 10 },
buttonText: { color: "#fff", fontWeight: "600" },
});--clear cuando las importaciones no se resuelvan correctamente después de agregar paquetes o cambiar babel.config.jsi / a para arrancar simuladores sin reescribir banderasRelacionado: Expo Go vs Development Builds - qué cliente se abre desde este comando
Siempre añade módulos Expo a través de la CLI para que los rangos semver coincidan con la tabla de compatibilidad del SDK.
# Añade un módulo probado contra SDK 57
npx expo install expo-camera expo-file-system
# Después de una edición manual de package.json o bump de SDK - reconcilia todas las deps de Expo
npx expo install --fixnpx expo install lee tu versión expo fijada y elige lanzamientos compatibles de módulos nativosnpm install expo-camera@latest puede extraer un módulo compilado para un SDK más nuevo y romper la compilación iOS/Android--fix es el primer comando a ejecutar después de actualizar expo en package.jsonapp.json - instalar es solo el primer pasoRelacionado: Upgrading Expo SDK Versions - doctor, changelog y alineación de RN
Expo Go es una aplicación sandbox con módulos nativos precompilados - ideal para aprender y trabajar en la interfaz de usuario sin compilar código nativo.
import { CameraView, useCameraPermissions } from "expo-camera";
import { Pressable, StyleSheet, Text, View } from "react-native";
export default function App() {
const [permission, requestPermission] = useCameraPermissions();
if (!permission?.granted) {
return (
<View style={styles.center}>
<Text style={styles.message}>Se requiere acceso a la cámara.</Text>
<Pressable style={styles.button} onPress={requestPermission}>
<Text style={styles.buttonText}>Otorgar permiso</Text>
</Pressable>
</View>
);
}
return <CameraView style={styles.camera} facing="back" />;
}
const styles = StyleSheet.create({
center: { flex: 1, justifyContent: "center", alignItems: "center", gap: 12, padding: 24 },
message: { fontSize: 16, textAlign: "center" },
button: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 10, borderRadius: 8 },
buttonText: { color: "#fff", fontWeight: "600" },
camera: { flex: 1 },
});npx expo start con Expo Go - sin Xcode ni Android Studio requerido para este ciclouseCameraPermissions) aún ejecutan avisos reales del SO dentro del shell de Expo GoRelacionado: Expo Go vs Development Builds - lista de verificación de decisión y
expo-dev-client
Reemplaza app.json estático con configuración TypeScript cuando los IDs de paquete, nombres u hosts de API difieren por entorno.
import { ExpoConfig, ConfigContext } from "expo/config";
const APP_VARIANT = process.env.APP_VARIANT ?? "development";
export default ({ config }: ConfigContext): ExpoConfig => {
const isProd = APP_VARIANT === "production";
return {
...config,
name: isProd ? "My Expo App" : "My Expo App (Dev)",
slug: "my-expo-app",
ios: {
...config.ios,
bundleIdentifier: isProd
? "com.example.myexpoapp"
: "com.example.myexpoapp.dev",
},
android: {
...config.android,
package: isProd ? "com.example.myexpoapp" : "com.example.myexpoapp.dev",
},
extra: {
apiUrl: isProd ? "https://api.example.com" : "https://staging.example.com",
appVariant: APP_VARIANT,
},
};
};APP_VARIANT=development npx expo start
APP_VARIANT=production npx eas build --profile productionapp.config.ts se evalúa en tiempo de compilación y prebuild - no en cada recarga de Metro...config para que la CLI de Expo fusione los valores predeterminados (complementos, actualizaciones) en lugar de descartarlos silenciosamenteextra - léelos con expo-constants en el código de la aplicaciónRelacionado: app.json & app.config.js - complementos de configuración y patrones seguros de secretos | Environments & EAS Environment Variables - separación dev/staging/prod
Las bibliotecas con código nativo personalizado, módulos nativos privados o complementos de configuración no en Expo Go requieren una compilación de desarrollo.
npx expo install expo-dev-client
npx expo run:ios
# o producir un cliente dev instalable a través de EAS:
npx eas build --profile development --platform ios{
"expo": {
"plugins": [
[
"expo-build-properties",
{
"ios": { "deploymentTarget": "15.1" },
"android": { "minSdkVersion": 24 }
}
]
]
}
}expo-dev-client reemplaza Expo Go como shell nativo mientras mantiene la recarga rápida de Metronpx expo run:ios / run:android genera proyectos nativos localmente a través de prebuild, luego compila un cliente devapp.config.ts y permite que EAS Build ejecute prebuild en CI en lugar de editar manualmente ios/ cuando sea posibleRelacionado: Expo Go vs Development Builds - matriz de características | Managed to Bare Migration - mantener rutas de actualización cuando existen carpetas nativas
Asociar la aplicación con un proyecto Expo desbloquea compilaciones en la nube, envío, actualizaciones y secretos limitados a la organización.
npx expo login
npx eas init{
"expo": {
"name": "My Expo App",
"slug": "my-expo-app",
"owner": "my-org",
"extra": {
"eas": {
"projectId": "00000000-0000-0000-0000-000000000000"
}
}
}
}import Constants from "expo-constants";
import { Text, View } from "react-native";
export default function App() {
const projectId = Constants.expoConfig?.extra?.eas?.projectId;
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>Proyecto EAS: {projectId ?? "no vinculado"}</Text>
</View>
);
}eas init crea o vincula un proyecto bajo tu cuenta de Expo y escribe extra.eas.projectIdowner establecido en un slug de organización enruta compilaciones y credenciales al equipo, no a una cuenta personalslugRelacionado: Expo Account, Projects & Permissions - funciones y gobernanza multiapp | Environments & EAS Environment Variables - secretos por entorno
Versiones de pila: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 16 jul 2026