Flutter vs React Native
Le Flutter de Google, basé sur Dart, face au React Native de Meta, basé sur JavaScript/TypeScript — comparaison sous tous les angles. Quel framework cross-platform se démarque en 2025 ?
Framework RN managé mais réversible grâce au CNG, installable avec Node.js LTS
Installation React Native cœur offrant un contrôle total sur le toolchain natif
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.
| Catégorie | Expo | Bare 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 |
// 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 — 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 ReleaseEn 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 gratuiteEn 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.