Expo vs Bare React Native Comparación

Framework RN gestionado que se instala con Node.js LTS y es reversible gracias a CNG

VS
Bare React Native

Instalación núcleo de React Native que da control total sobre el toolchain nativo

16 min de lecturaCross-Platform

Veredicto rápido

En 2026, la respuesta predeterminada es Expo + CNG: como `expo prebuild` regenera las carpetas nativas, el "eject" dejó de ser una puerta de un solo sentido, el sistema de config plugins cubre la mayor parte de la configuración nativa y el plan gratuito de EAS Build es suficiente para proyectos pequeños-medianos. Las razones que justifican Bare React Native son limitadas pero reales: un toolchain personalizado no soportado por EAS, la obligatoriedad de un CI on-prem o un SDK nativo muy poco común. Si ninguna de las tres aplica, empieza con Expo.

ExpoBare React Native
Leer el veredicto completo

Comparación de puntuaciones

Cargando gráfico...

Puntuación detallada

Puntuación detallada: Expo y Bare React Native — puntuaciones por categoría sobre 10
CategoríaExpoBare React Native
Rendimiento
8/10
8/10
Facilidad de aprendizaje
9/10
6/10
Ecosistema
8/10
8/10
Comunidad
8/10
8/10
Mercado laboral
7/10
8/10
A prueba de futuro
8/10
7/10

Pros y contras

Expo

Pros

  • Para la instalación solo hace falta Node.js LTS — pruebas instantáneas con Expo Go/Snack sin Xcode/Android Studio
  • Con CNG (`expo prebuild`) las carpetas nativas se pueden regenerar — el "eject" ya no es una puerta de un solo sentido
  • El sistema de config plugins configura el proyecto nativo de forma programática y repetible
  • Con EAS Update, actualizaciones OTA de JS instantáneas, separadas de la capa nativa
  • El plan Free de EAS Build incluye 15+15 builds al mes y updates para 1.000 MAU — un comienzo sin costo para proyectos pequeños
  • Con EAS Workflows, builds nativos automáticos a partir de la app config, disparados por eventos de GitHub o cron
  • Actualizar de versión es tan simple como actualizar la dependencia npm + `prebuild --clean`
  • Como miembro fundador de React Foundation, mantiene una estrecha alineación con el ecosistema RN

Contras

  • Los SDK de Expo van una versión por detrás del núcleo de RN (SDK 57 → RN 0.86, no RN 0.87) — no tienes acceso inmediato a la función más reciente de RN
  • Expo Go (iOS) requiere inicio de sesión tanto en la terminal como en la app desde el 3 de septiembre de 2026
  • Escribir un config plugin para SDKs nativos muy poco comunes o específicos puede requerir esfuerzo adicional
  • Al superar el plan Free de EAS hay que pasar a un nivel de pago, Starter ($19/mes) o Production ($199/mes)
  • Como EAS está diseñado con prioridad en la nube, se adapta mal a la obligatoriedad de un CI on-prem corporativo
  • Tocar las carpetas nativas a mano y luego ejecutar prebuild borra los cambios silenciosamente (si no se trasladaron a un config plugin)

Ideal para

Equipos que quieren empezar rápido con nuevos proyectos de React NativeProyectos pequeños-medianos que pueden usar el CI/CD en la nube de EASDesarrollo de MVP/prototipos e iteración rápidaApps con gran necesidad de actualizaciones OTA que quieren enviar correcciones de JS sin esperar la aprobación de la tiendaProyectos cuyas necesidades nativas se cubren con el ecosistema estándar de config plugins (cámara, notificaciones, ubicación, etc.)

Bare React Native

Pros

  • Acceso directo e ilimitado al proyecto nativo (Xcode/Gradle) — sin ninguna capa de abstracción
  • Puedes adoptar cada versión menor de RN (0.85, 0.86, 0.87...) de inmediato, sin esperar el ciclo del SDK de Expo
  • No dependes de EAS en absoluto — puedes montar cualquier servicio de CI/CD o pipeline on-prem que quieras
  • Puedes integrar directamente cualquier SDK nativo, sin quedar limitado al ecosistema de config plugins
  • Amplio y maduro soporte de la comunidad, con 126.507 estrellas y 25.238 forks en GitHub
  • Licencia MIT, código abierto, sin dependencia de un vendor

Contras

  • La instalación exige Xcode + CocoaPods, Android Studio + SDK + Gradle — una configuración inicial notablemente más larga que la de Expo
  • Las carpetas nativas `ios`/`android` son permanentes; cada actualización de versión exige aplicar el diff a mano con Upgrade Helper
  • No hay una solución lista para actualizaciones OTA — hay que integrar `expo-updates` manualmente o montar una alternativa
  • Aunque quieras usar CI/CD (incluido EAS), debes sincronizar a mano las credenciales de build nativas
  • La configuración adicional de los paquetes nativos (permisos de Info.plist, entradas del Manifest, ajustes de Gradle) se hace a mano — no existe la repetibilidad de un config plugin
  • Para un desarrollador nuevo en el equipo, configurar el toolchain alarga notablemente el tiempo hasta el primer build

Ideal para

Proyectos que requieren un toolchain o entorno de build personalizado que EAS no soportaEquipos con la obligación corporativa de un CI on-prem/self-hostedApps que requieren integrar un SDK nativo muy poco común o muy específico que no puede cubrirse con un config pluginApps grandes y complejas que necesitan intervenir en el código nativo de forma constante y profundaEquipos que quieren usar la versión más reciente del núcleo de RN sin esperar el ciclo del SDK

Comparación de código

Expo
// Expo — agregar un permiso nativo con app.config.ts + un config plugin local (TypeScript)

// plugins/withCameraUsage.ts — config plugin que añade el permiso de cámara a Info.plist
import { ConfigPlugin, withInfoPlist } from "expo/config-plugins";

const withCameraUsage: ConfigPlugin = (config) =>
  withInfoPlist(config, (config) => {
    config.modResults.NSCameraUsageDescription =
      "Profil fotoğrafı çekmek için kameraya erişim gerekiyor";
    return config;
  });

export default withCameraUsage;

// app.config.ts — el plugin se referencia por RUTA de archivo (requiere npm i -D tsx)
import "tsx/cjs";
import { ExpoConfig, ConfigContext } from "expo/config";

export default ({ config }: ConfigContext): ExpoConfig => ({
  ...config,
  name: "MyApp",
  slug: "my-app",
  version: "1.0.0",
  plugins: [["./plugins/withCameraUsage.ts"], "expo-router", "expo-updates"],
  updates: { url: "https://u.expo.dev/your-project-id" },
  runtimeVersion: { policy: "appVersion" },
});

// Terminal: genera las carpetas nativas (CNG) y aplícalas
// npx expo prebuild --clean

// Ejecuta EAS Build y publica la actualización OTA
// eas build --platform all --profile production
// eas update --branch production --message "Bug fix: login crash"
Bare React Native
// Bare React Native — instalación de un paquete + configuración nativa a mano (TypeScript)

// 1) Instala el paquete: autolinking lo enlaza, descarga los pods, recompila
// $ npm install react-native-vision-camera react-native-nitro-modules react-native-nitro-image
// $ npx pod-install
// $ npm run ios     # Android: npm run android

// 2) Añade los permisos A MANO — este paso no está incluido en el autolinking
// ios/MyApp/Info.plist:
// <key>NSCameraUsageDescription</key>
// <string>Profil fotoğrafı çekmek için kameraya erişim gerekiyor</string>
// android/app/src/main/AndroidManifest.xml:
// <uses-permission android:name="android.permission.CAMERA" />

// 3) Uso en el lado de JS (código compartido)
import React, { useEffect } from "react";
import { Camera, useCameraPermission } from "react-native-vision-camera";

function ProfileCamera() {
  const { hasPermission, requestPermission } = useCameraPermission();

  useEffect(() => {
    if (!hasPermission) requestPermission();
  }, [hasPermission, requestPermission]);

  return <Camera style={{ flex: 1 }} isActive={true} device="back" />;
}

export default ProfileCamera;

// 4) Actualización de versión (0.86 -> 0.87): esto NO tiene un comando de CLI
// Upgrade Helper (web): https://react-native-community.github.io/upgrade-helper/
// -> aplica el diff a mano en Podfile.lock, build.gradle, AppDelegate.swift

// 5) Tu propio pipeline de CI (GitHub Actions, resumen)
// - run: npx pod-install
// - run: xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Release

Conclusión

En 2026, la respuesta predeterminada es Expo + CNG: como `expo prebuild` regenera las carpetas nativas, el "eject" dejó de ser una puerta de un solo sentido, el sistema de config plugins cubre la mayor parte de la configuración nativa y el plan gratuito de EAS Build es suficiente para proyectos pequeños-medianos. Las razones que justifican Bare React Native son limitadas pero reales: un toolchain personalizado no soportado por EAS, la obligatoriedad de un CI on-prem o un SDK nativo muy poco común. Si ninguna de las tres aplica, empieza con Expo.

Solicita una consultoría gratuita
FAQ

Preguntas frecuentes

En 2026, la respuesta predeterminada es Expo + CNG: el sistema de config plugins cubre la mayoría de los módulos nativos, el plan gratuito de EAS Build (15+15 builds/mes) es suficiente para proyectos pequeños-medianos, y gracias a `expo prebuild` bajar a código nativo ya no es una decisión irreversible. Las razones reales que justifican bare RN: un toolchain personalizado no soportado por EAS, la obligatoriedad de un CI on-prem corporativo, o un SDK nativo muy poco común que no puede cubrirse con un config plugin.

Artículos de blog relacionados

Ver todos los artículos

Proyectos relacionados

Ver todos los proyectos
Todas las comparaciones