Conceptos básicos de Expo SDK
10 ejemplos para comenzar con paquetes de Expo SDK - 7 básicos e 3 intermedios. Cubre la instalación con npx expo install, versionado del SDK y cómo se inician los módulos nativos dentro de tu aplicación.
Busca en todas las páginas de la documentación
10 ejemplos para comenzar con paquetes de Expo SDK - 7 básicos e 3 intermedios. Cubre la instalación con npx expo install, versionado del SDK y cómo se inician los módulos nativos dentro de tu aplicación.
Crea un aplicación Expo con SDK 57 antes de agregar paquetes SDK:
npx create-expo-app@latest SdkBasics --template blank-typescript
cd SdkBasicsConfirma el pin del SDK:
{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}Herramientas: Estos ejemplos apuntan a Expo SDK 57 (
expo~57.0.4), React Native 0.86.0, y React 19.2.3.
Los paquetes de Expo SDK son módulos nativos con una API de JavaScript - cámara, sistema de archivos, notificaciones y muchas más se distribuyen como paquetes npm versionados contra una única versión de expo.
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}>Paquetes de Expo SDK</Text>
<Text style={styles.body}>
Las importaciones de JavaScript llaman código nativo compilado para SDK 57 - no polyfills del navegador.
</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-camera, expo-location, ...) es un módulo Expo con implementaciones para iOS y Androidexpo es la raíz del SDK - su versión define qué versiones de módulo son compatiblesRelacionado: ../expo-platform/expo-platform-basics/expo-platform-basics.md - descripción general de la capa de plataforma | ../expo-platform/expo-modules-core/expo-modules-core.md - bootstrap nativo
Siempre agrega módulos Expo a través de la CLI para que los rangos de semver coincidan con la matriz de compatibilidad del SDK.
# Uno o más paquetes - versiones resueltas para SDK 57
npx expo install expo-notifications expo-location
# Después de ediciones manuales de package.json o un salto de SDK
npx expo install --fix
# Verifica que no haya desajuste de versión antes de tu primera compilación nativa
npx expo doctor{
"dependencies": {
"expo": "~57.0.4",
"expo-notifications": "~0.32.0",
"expo-location": "~19.0.0"
}
}npx expo install lee tu versión de expo y elige rangos probados - npm install expo-camera@latest puede descargar código nativo incompatible con el SDK--fix reconcilia todas las dependencias de Expo después de actualizar expo en package.jsonexpo doctor señala copias duplicadas de React Native, versiones de módulo incorrectas y plugins de configuración faltantespackage-lock.json / yarn.lock para que CI instale el mismo ABI nativo que tu laptop compilóRelacionado: ./expo-notifications.md - primera instalación de notificaciones push | ./expo-location.md - permisos de ubicación
El campo expo en package.json es la única fuente de verdad que todos los demás paquetes Expo deben satisfacer.
Contrato de SDK 57
expo ~57.0.4 ← pin raíz del SDK
├── react 19.2.3 ← emparejado por create-expo-app
├── react-native 0.86.0
├── expo-camera ~17.x ← resuelto por expo install
├── expo-file-system ~19.x
└── … ← todos los módulos validados contra la matriz de SDK 57# Salto intencional del SDK - lee el registro de cambios primero
npx expo install expo@~57.0.4
npx expo install --fix
npx expo prebuild --clean # cuando existen carpetas nativasexpo SDK 57 causa errores de compilación nativa - la matriz no es aconsejable~57.0.4 permite lanzamientos de parches dentro de SDK 57 - fija intencionalmente para CI reproducible--fix antes de depurar fallos de tiempo de ejecución - el desajuste de versión a menudo surge como excepciones nativas oscurasios/, android/) deben regenerarse o reconstruirse después de cambios de SDKRelacionado: ../expo-platform/upgrading-expo-sdk-versions/upgrading-expo-sdk-versions.md - guía de actualización
Los módulos Expo exportan un espacio de nombres o clases nombradas - importa una vez, llama APIs asincrónicas desde efectos o manejadores.
npx expo install expo-hapticsimport * as Haptics from "expo-haptics";
import { Pressable, StyleSheet, Text, View } from "react-native";
export default function App() {
return (
<View style={styles.container}>
<Pressable
style={styles.button}
onPress={() => Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)}
>
<Text style={styles.label}>Toca para retroalimentación háptica</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: "center", alignItems: "center" },
button: { backgroundColor: "#2563eb", paddingHorizontal: 20, paddingVertical: 12, borderRadius: 10 },
label: { color: "#fff", fontWeight: "600" },
});@types/ para módulos Expo de primer nivelRelacionado: ../rn-fundamentals/platform-specific-code/platform-specific-code.md - guardias
Platform.OS
Muchos paquetes SDK requieren entradas de manifiesto - decláralas en app.json o app.config.ts antes de solicitar permiso en tiempo de ejecución.
npx expo install expo-camera expo-location// app.config.ts
import type { ExpoConfig } from "expo/config";
export default (): ExpoConfig => ({
name: "SdkBasics",
slug: "sdk-basics",
plugins: [
[
"expo-camera",
{
cameraPermission:
"Permite que SdkBasics tome fotos para adjuntos de órdenes de trabajo.",
microphonePermission:
"Permite que SdkBasics grabe audio con inspecciones de video.",
},
],
[
"expo-location",
{
locationAlwaysAndWhenInUsePermission:
"SdkBasics usa tu ubicación para etiquetar visitas de campo incluso cuando la aplicación está en segundo plano.",
locationWhenInUsePermission:
"SdkBasics usa tu ubicación para mostrar sitios de trabajo cercanos.",
},
],
],
});Info.plist y justificación de permisos de Android - App Review rechaza copias vagasrequestPermissionsAsyncRelacionado: ./expo-camera-and-expo-image-picker.md - permisos de captura | ./expo-location.md - strings de divulgación
Expo Go agrupa un conjunto fijo de módulos nativos. Los paquetes con código nativo personalizado o plugins no publicados necesitan un cliente dev.
npx expo install expo-dev-client
npx expo run:ios
# o cliente dev en la nube:
npx eas build --profile development --platform ios┌────────────────────┬─────────────────────┬──────────────────────────┐
│ Capacidad │ Expo Go │ Compilación de desarrollo│
├────────────────────┼─────────────────────┼──────────────────────────┤
│ expo-notifications │ Configuración de push limitada │ Push completo + iconos personalizados │
│ expo-camera │ Sí │ Sí + plugins personalizados │
│ Plugins de configuración │ Ignorado │ Aplicado en prebuild │
│ expo-updates │ Limitado │ Canal de OTA de producción │
└────────────────────┴─────────────────────┴──────────────────────────┘expo-dev-client reemplaza Go como shell nativo manteniendo Metro con actualización rápidanpx expo start abre Go pero tu característica necesita un plugin, instala dev-client antes de depurar errores nativos 'module not found'Relacionado: ../expo-platform/expo-go-vs-development-builds/expo-go-vs-development-builds.md - matriz de características
Algunos módulos requieren registro antes de que React se monte - las tareas de fondo, manejadores de notificaciones y listeners de actualización pertenecen al ámbito global.
npx expo install expo-notifications expo-task-manager// index.ts - importaciones de efectos secundarios ANTES de registerRootComponent
import "./src/notifications/notificationHandler";
import "./src/background/locationTask";
import { registerRootComponent } from "expo";
import App from "./App";
registerRootComponent(App);// src/notifications/notificationHandler.ts
import * as Notifications from "expo-notifications";
Notifications.setNotificationHandler({
handleNotification: async () => ({
shouldShowBanner: true,
shouldShowList: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});TaskManager.defineTask debe ejecutarse en el ámbito global - definirlo dentro de un componente falla en el inicio en frío del SOapp/_layout.tsx importaciones de nivel superior para los mismos efectos secundariosRelacionado: ./expo-task-manager-and-background-tasks.md - registro de tareas globales | ./expo-notifications.md - manejador de primer plano
Expo autolinking descubre módulos nativos de package.json y los conecta a proyectos ios/ y android/ generados.
npx expo prebuild
# inspecciona proyectos nativos sin abrir Xcode
ls ios/Pods 2>/dev/null || ls android/app/build.gradle{
"expo": {
"plugins": ["expo-notifications"]
}
}npx expo prebuild genera carpetas nativas de app.config + módulos instalados - CNG las mantiene fuera de git en el flujo de trabajo administradoexpo-module.config.json en cada paquete - las ediciones manuales de pod install se sobrescriben en el próximo prebuildInfo.plist editado a mano, cuando uses CNGnpx expo install para seguridad de versiones - autolinking funciona de la misma maneraRelacionado: ../cng-prebuild/prebuild-basics/prebuild-basics.md - cuándo hacer prebuild | ../native-modules/native-modules-basics/native-modules-basics.md - arquitectura de módulos
Algunos paquetes SDK se distribuyen tanto con una API moderna como con una entrada /legacy - migra deliberadamente, no en un PR.
npx expo install expo-file-system// API moderna de SDK 57 - File, Directory, Paths
import { Directory, File, Paths } from "expo-file-system";
const cacheDir = new Directory(Paths.cache, "downloads");
cacheDir.create();
const meta = new File(cacheDir, "manifest.json");
meta.create();
meta.write(JSON.stringify({ version: 1 }));
// API heredada - todavía disponible durante la migración
import * as FileSystem from "expo-file-system/legacy";
const legacyUri = meta.uri;
const text = await FileSystem.readAsStringAsync(legacyUri);File / Directory / Paths para código nuevo en SDK 57 - las rutas orientadas a objetos reducen bugs de cadenas URIexpo-file-system/legacy solo para sitios de llamadas no migrados - planifica la eliminación por versiónexpoRelacionado: ./expo-file-system.md - rutas en sandbox y descargas
Usa app.config.ts y entornos EAS para variar permisos, plugins y claves API - no forks if (__DEV__) en rutas de producción.
// app.config.ts
const IS_DEV = process.env.APP_VARIANT === "development";
export default {
name: IS_DEV ? "SdkBasics (Dev)" : "SdkBasics",
slug: "sdk-basics",
extra: {
eas: { projectId: process.env.EAS_PROJECT_ID },
pushEnabled: !IS_DEV,
},
plugins: [
...(IS_DEV ? [] : [["expo-notifications", { icon: "./assets/notification-icon.png" }]]),
],
};import Constants from "expo-constants";
const pushEnabled = Constants.expoConfig?.extra?.pushEnabled ?? false;extra está disponible en tiempo de ejecución a través de expo-constants - adecuado para banderas de características resueltas en tiempo de compilaciónEXPO_PUBLIC_* se inserta en JS - nunca pongas secretos allí; solo URLs de API cuando sea intencionalmente públicoRelacionado: ../expo-platform/app-json-and-app-config-js/app-json-and-app-config-js.md - configuración dinámica
npm install simple ignora la tabla de compatibilidad del SDK - úsalo solo para paquetes que no son de Expo (zod, @tanstack/react-query).expo-*, siempre npx expo install <package>.npx expo prebuild o una nueva compilación EAS.npx expo install expo-camera
npx expo doctorVersiones de stack: 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