Expo vs Bare React Native Comparaison

Framework RN managé mais réversible grâce au CNG, installable avec Node.js LTS

VS
Bare React Native

Installation React Native cœur offrant un contrôle total sur le toolchain natif

16 min de lectureCross-Platform

Verdict rapide

En 2026, la réponse par défaut est Expo + CNG : `expo prebuild` régénérant les dossiers natifs, « eject » n'est plus une porte à sens unique, le système de config plugins couvre l'essentiel de la configuration native, et le plan gratuit d'EAS Build suffit à un projet petit à moyen. Les raisons de préférer Bare React Native restent étroites mais réelles : un toolchain personnalisé non supporté par EAS, une obligation de CI on-prem, ou un SDK natif très rare. En l'absence de ces trois cas, commencez avec Expo.

ExpoBare React Native
Lire le verdict complet

Comparaison des scores

Chargement du graphique...

Notation détaillée

Notation détaillée: Expo et Bare React Native — notes sur 10, catégorie par catégorie
CatégorieExpoBare React Native
Performance
8/10
8/10
Facilité d'apprentissage
9/10
6/10
Écosystème
8/10
8/10
Communauté
8/10
8/10
Marché de l'emploi
7/10
8/10
Pérennité
8/10
7/10

Avantages & Inconvénients

Expo

Avantages

  • Seul Node.js LTS est requis pour démarrer — test instantané via Expo Go/Snack sans Xcode ni Android Studio
  • Avec le CNG (`expo prebuild`), les dossiers natifs sont régénérables — l'« eject » n'est plus une porte à sens unique
  • Le système de config plugins configure le projet natif de façon programmatique et reproductible
  • EAS Update permet une mise à jour OTA du JS instantanée, indépendante de la couche native
  • Le plan gratuit d'EAS Build inclut 15+15 builds/mois et 1 000 MAU de mises à jour — un démarrage sans coût pour un petit projet
  • EAS Workflows déclenche des builds natifs automatiques à partir de la config de l'app, sur événement GitHub ou cron
  • Monter de version est aussi simple qu'une mise à jour npm suivie de `prebuild --clean`
  • Étroite cohérence avec l'écosystème RN en tant que membre fondateur de la React Foundation

Inconvénients

  • Les SDK Expo ont un cran de retard sur le cœur RN (SDK 57 → RN 0.86, pas RN 0.87) — pas d'accès immédiat à la toute dernière fonctionnalité RN
  • Expo Go (iOS) exige une connexion terminal + application depuis le 3 septembre 2026
  • Écrire un config plugin pour un SDK natif très rare ou spécifique peut demander un effort supplémentaire
  • Au-delà du plan gratuit d'EAS, il faut passer au palier payant Starter (19 $/mois) ou Production (199 $/mois)
  • EAS étant conçu cloud-first, la compatibilité avec une obligation de CI on-prem en entreprise reste faible
  • Modifier les dossiers natifs à la main puis lancer prebuild efface silencieusement ces changements (s'ils ne sont pas passés par un config plugin)

Idéal pour

Les équipes voulant démarrer rapidement un nouveau projet React Nativeles projets de taille petite à moyenne pouvant utiliser le CI/CD cloud d'EASle développement de MVP/prototype et l'itération rapideles applications nécessitant des mises à jour OTA fréquentes, sans attendre la validation du store pour un correctif JSles projets dont les besoins natifs (caméra, notifications, localisation, etc.) sont couverts par l'écosystème standard des config plugins

Bare React Native

Avantages

  • Accès direct et illimité au projet natif (Xcode/Gradle) — aucune couche d'abstraction
  • Chaque version mineure de RN (0.85, 0.86, 0.87...) est disponible immédiatement, sans attendre le cycle des SDK Expo
  • Aucune dépendance à EAS — vous pouvez mettre en place n'importe quel service CI/CD ou pipeline on-prem de votre choix
  • Intégration directe de n'importe quel SDK natif, sans être limité à l'écosystème des config plugins
  • Communauté large et mature avec 126 507 étoiles GitHub et 25 238 forks
  • Sous licence MIT, open source, sans dépendance à un fournisseur

Inconvénients

  • L'installation exige Xcode + CocoaPods, Android Studio + SDK + Gradle — une mise en route nettement plus longue qu'avec Expo
  • Les dossiers natifs `ios`/`android` sont permanents ; chaque montée de version nécessite d'appliquer un diff manuel via Upgrade Helper
  • Aucune solution prête à l'emploi pour les mises à jour OTA — il faut intégrer `expo-updates` manuellement ou installer une alternative
  • Même en voulant utiliser EAS pour la CI/CD, il faut synchroniser manuellement les identifiants de build natifs
  • La configuration native supplémentaire (permissions Info.plist, entrées de Manifest, réglages Gradle) se fait à la main — sans la reproductibilité d'un config plugin
  • Pour un nouveau développeur, la mise en place du toolchain allonge nettement le délai avant le premier build

Idéal pour

Les projets nécessitant un toolchain ou un environnement de build particulier non pris en charge par EASles équipes soumises à une obligation de CI on-prem/auto-hébergée en entrepriseles applications nécessitant l'intégration d'un SDK natif très rare ou très spécifique, non couvert par un config pluginles grandes applications complexes nécessitant une intervention native continue et pousséeles équipes voulant utiliser la toute dernière version du cœur RN sans attendre le cycle des SDK

Comparaison de code

Expo
// Expo — ajout d'une permission native via app.config.ts + config plugin local (TypeScript)

// plugins/withCameraUsage.ts — config plugin ajoutant la permission caméra à 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 — le plugin est référencé par CHEMIN de fichier (nécessite 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 : générer les dossiers natifs (CNG) et les appliquer
// npx expo prebuild --clean

// Lancer un EAS Build et publier une mise à jour OTA
// eas build --platform all --profile production
// eas update --branch production --message "Bug fix: login crash"
Bare React Native
// Bare React Native — installation d'un package + configuration native manuelle (TypeScript)

// 1) Installer le package : l'autolinking relie, récupère les pods, recompile
// $ 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) Ajouter les permissions À LA MAIN — cette étape n'est pas couverte par l'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) Utilisation côté JS (code partagé)
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) Montée de version (0.86 -> 0.87) : il n'existe AUCUNE commande CLI pour cela
// Upgrade Helper (web) : https://react-native-community.github.io/upgrade-helper/
// -> appliquer le diff manuellement sur Podfile.lock, build.gradle, AppDelegate.swift

// 5) Votre propre pipeline CI (GitHub Actions, résumé)
// - run: npx pod-install
// - run: xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Release

Conclusion

En 2026, la réponse par défaut est Expo + CNG : `expo prebuild` régénérant les dossiers natifs, « eject » n'est plus une porte à sens unique, le système de config plugins couvre l'essentiel de la configuration native, et le plan gratuit d'EAS Build suffit à un projet petit à moyen. Les raisons de préférer Bare React Native restent étroites mais réelles : un toolchain personnalisé non supporté par EAS, une obligation de CI on-prem, ou un SDK natif très rare. En l'absence de ces trois cas, commencez avec Expo.

Obtenir une consultation gratuite
FAQ

Questions fréquentes

En 2026, la réponse par défaut est Expo + CNG : le système de config plugins couvre la plupart des modules natifs, le plan gratuit d'EAS Build (15+15 builds/mois) suffit à un projet petit à moyen, et grâce à `expo prebuild`, descendre au code natif n'est plus une décision irréversible. Les vraies raisons de choisir bare RN : un toolchain personnalisé non supporté par EAS, une obligation de CI on-prem en entreprise, ou un SDK natif très rare non couvert par un config plugin.

Articles de blog associés

Voir tous les articles

Projets associés

Voir tous les projets
Toutes les comparaisons