Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 217 minIntermédiaire

Installer Expo et créer ta première application React Native

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • créer un projet Expo et le lancer sur ton téléphone avec Expo Go ;
  • faire tourner l'application sur un émulateur Android ;
  • lire la structure d'un projet Expo et le TypeScript de base ;
  • choisir entre Expo Go et un development build ;
  • résoudre les erreurs de démarrage les plus courantes.

3 exercices corrigés1 schéma

Expo est le framework qui sert à créer, lancer et publier une application React Native : une commande crée le projet, une autre le lance, et l'application Expo Go l'affiche sur ton téléphone en scannant un QR code. Ce chapitre installe les outils, crée le projet AppliFrais Mobile, le lance sur un téléphone et sur un émulateur Android, et explique la structure du projet, le débogage et les erreurs de démarrage les plus courantes.

Ce qu'il te faut

OutilVersionPourquoi
Node.js24 LTS (le SDK 58 exige au moins 22.13 ou 24.3 ; pas de version impaire)Exécute les outils d'Expo et le serveur Metro
Un éditeurVS Code, avec l'extension Expo ToolsAutocomplétion de app.json, coloration, débogage
GitUne version récenteVersionner le projet dès la première minute (cours Git)
Un téléphoneAndroid ou iPhone, avec l'application Expo GoTester l'application sans rien compiler
Ou un émulateurAndroid Studio (Windows, macOS, Linux) ; le simulateur iOS demande un Mac avec XcodeTester sans téléphone, ou sur plusieurs tailles d'écran

Vérifie Node.js dans un terminal :

bash
node --version
# v24.15.0
npm --version

Créer le projet

Place-toi dans ton dossier de travail et lance :

bash
npx create-expo-app@latest applifrais-mobile
cd applifrais-mobile

La commande télécharge le modèle par défaut, installe les dépendances (quelques centaines de mégaoctets dans node_modules) et initialise un dépôt Git. Le package.json obtenu contient notamment :

json
{
  "name": "applifrais-mobile",
  "main": "expo-router/entry",
  "scripts": {
    "start": "expo start",
    "reset-project": "node ./scripts/reset-project.js",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "lint": "expo lint"
  },
  "dependencies": {
    "expo": "~58.0.22",
    "expo-router": "~58.0.29",
    "react": "19.3.0",
    "react-native": "0.88.1"
  }
}

Les numéros exacts changent à chaque mise à jour, mais la logique reste : la version d'expo fixe la version de tout le reste. Depuis 2026, les modules d'Expo portent d'ailleurs le numéro du SDK (expo-router 58.x pour le SDK 58).

Lancer l'application sur ton téléphone avec Expo Go

  1. Installe Expo Go depuis le Play Store ou l'App Store.
  2. Dans le dossier du projet, lance le serveur de développement :
bash
npx expo start
  1. Un QR code s'affiche dans le terminal. Sur Android, scanne-le depuis Expo Go ; sur iPhone, avec l'appareil photo. Sur iPhone, Expo Go et Expo CLI doivent être connectés au même compte Expo : crée un compte gratuit, puis lance npx expo login sur ton ordinateur et connecte-toi dans Expo Go.
  2. L'application s'ouvre après quelques secondes.
ton ordinateurton téléphoneVS Codetu modifies, tu enregistres1. le fichier changeMetronpx expo startassemble le code, affiche le QRExpo Goexécute le codeavec Hermeston applicationà jour en moins d'1 s4. Fast Refresh2. scan du QR code3. code JavaScriptmême réseau Wi-Fiport 8081Variante : un development buildta propre version d'Expo Go, compilée avec tes modules natifs et ta configuration,se connecte au même serveur Metro : la boucle reste la même
Tu enregistres, Metro envoie le code, le téléphone se met à jour : la boucle de développement

Le téléphone et l'ordinateur doivent être sur le même réseau Wi-Fi : le téléphone télécharge le code depuis le serveur Metro de ton ordinateur, sur le port 8081. Les réseaux d'établissement ou d'entreprise isolent souvent les appareils entre eux ; dans ce cas, lance le serveur en mode tunnel :

bash
npx expo start --tunnel

Le code passe alors par un serveur relais d'Expo sur Internet : ça marche partout, mais chaque rechargement est plus lent.

Dans le terminal du serveur, quelques touches servent en permanence :

ToucheAction
aOuvrir l'application sur l'émulateur Android
iOuvrir l'application sur le simulateur iOS (Mac seulement)
wOuvrir la version web dans le navigateur
rRecharger l'application
mOuvrir le menu développeur sur l'appareil
jOuvrir React Native DevTools, le débogueur
?Afficher toutes les commandes

Lancer l'application sur un émulateur Android

Un émulateur est un téléphone Android virtuel qui tourne sur ton ordinateur. Il te sert à tester sans téléphone, sur plusieurs tailles d'écran et plusieurs versions d'Android.

  1. Installe Android Studio et, au premier lancement, laisse-le installer le SDK Android.
  2. Dans Android Studio, ouvre Device Manager et crée un appareil virtuel : un Pixel récent, avec une image système Android récente qui contient les services Google Play (pour les notifications et la position).
  3. Démarre l'appareil, puis, dans le terminal d'Expo, appuie sur a. Expo installe Expo Go dans l'émulateur et y ouvre ton application.

L'émulateur demande de la mémoire vive : sur un ordinateur de 8 Go, ferme le navigateur pendant que tu l'utilises, ou préfère ton téléphone. Sur Mac, le simulateur iOS s'installe avec Xcode et s'ouvre avec la touche i.

La structure du projet

ÉlémentRôle
src/app/Les écrans. Chaque fichier est une route d'Expo Router (chapitre 4) ; les fichiers _layout.tsx définissent la navigation
src/components/Tes composants réutilisables (boutons, cartes, champs)
src/constants/, src/hooks/Des couleurs et des hooks du modèle d'exemple
assets/Images, icône de l'application, polices
app.jsonLa configuration de l'application : nom, icône, identifiants Android et iOS, permissions, modules
package.jsonLes dépendances et les scripts
tsconfig.jsonLa configuration de TypeScript, dont l'alias @/ qui désigne src/
scripts/reset-project.jsLe script qui vide l'exemple pour repartir d'une page blanche
AGENTS.mdDes consignes pour les assistants de programmation IA, ajoutées par le modèle depuis 2026

Il n'y a pas de dossiers android/ et ios/ : Expo les génère quand il faut compiler l'application, à partir de app.json. C'est la génération native continue : tu ne modifies jamais ces dossiers à la main, tu configures app.json.

Ton premier écran

Le modèle contient un exemple avec deux onglets. Pour partir d'une page blanche :

bash
npm run reset-project

Le script propose de déplacer l'exemple dans un dossier example/ (garde-le pour t'en inspirer) et crée un src/app/index.tsx minimal. Remplace son contenu par :

tsx
import { Text, View } from 'react-native';

export default function Accueil() {
  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text style={{ fontSize: 24, fontWeight: '700' }}>Bonjour AppliFrais</Text>
      <Text>Ton premier écran React Native.</Text>
    </View>
  );
}

Enregistre : le téléphone se met à jour en moins d'une seconde. C'est le Fast Refresh : Metro renvoie seulement le module modifié et React redessine l'écran en conservant l'état des composants. Si tu modifies un fichier qui n'exporte pas de composant, l'application se recharge entièrement.

Tu reconnais un composant React : une fonction qui renvoie du JSX, exportée par défaut. Les seules nouveautés sont View et Text, importés de react-native, et le style écrit en objet JavaScript (chapitre 3).

TypeScript en deux minutes

Le modèle d'Expo est en TypeScript : du JavaScript auquel on ajoute des types, vérifiés avant l'exécution. Les fichiers portent l'extension .ts, ou .tsx s'ils contiennent du JSX. Tout ce que tu sais de JavaScript reste valable ; il suffit de savoir lire trois notations.

ts
// 1. Annoter une variable ou un paramètre
function formatEuros(montant: number): string {
  return `${montant.toFixed(2).replace('.', ',')} €`;
}

// 2. Décrire la forme d'un objet
type ResumeFiche = { id: number; mois: string; etat: 'CR' | 'CL' | 'VA' | 'MP'; montantValide: number | null };

// 3. Préciser le type d'un état React
const [fiches, setFiches] = useState<ResumeFiche[] | null>(null);

'CR' | 'CL' | 'VA' | 'MP' est une union : l'état ne peut prendre que ces quatre valeurs. number | null veut dire « un nombre ou rien ». Si tu écris formatEuros('23,50'), l'éditeur souligne l'erreur avant même que tu lances l'application. Pour vérifier tout le projet :

bash
npx tsc --noEmit

Si tu préfères JavaScript, renomme les fichiers en .js ou .jsx et retire les annotations : Expo accepte les deux. Ce cours garde TypeScript, comme le cours React, parce que c'est ce que tu trouveras en entreprise.

Déboguer

Les messages d'erreur. Une erreur JavaScript non rattrapée affiche un écran rouge avec le message et la pile d'appels ; un avertissement s'affiche en bas de l'écran (la LogBox). Lis la première ligne de la pile qui pointe vers ton fichier : c'est presque toujours là.

La console. Les console.log() de ton code s'affichent dans le terminal où tourne npx expo start.

React Native DevTools. Appuie sur j dans le terminal : un débogueur s'ouvre dans le navigateur, avec la console, les points d'arrêt, l'inspecteur de composants React et l'onglet réseau qui liste les requêtes fetch de l'application.

Le menu développeur. Secoue le téléphone ou appuie sur m dans le terminal : il permet de recharger, d'ouvrir le débogueur, d'activer l'inspecteur d'éléments ou l'analyse des performances.

Installer une bibliothèque

Ajoute toujours une bibliothèque avec npx expo install, jamais directement avec npm install :

bash
npx expo install expo-secure-store

expo install choisit la version de la bibliothèque compatible avec ton SDK, alors que npm install prend la dernière, qui peut ne pas fonctionner. Pour vérifier l'ensemble du projet :

bash
npx expo install --check   # liste les versions incompatibles
npx expo-doctor            # diagnostique la configuration

Expo Go ou development build

Expo Go est une application fixe : elle contient un ensemble de modules natifs choisis par Expo, et rien d'autre. Tant que tu n'utilises que ces modules, tu n'as rien à compiler. Dès que tu as besoin d'autre chose, il te faut un development build : ta propre version d'Expo Go, compilée avec tes modules et ta configuration.

Expo GoDevelopment build
InstallationDepuis le Play Store ou l'App StoreCompilée par toi (en local ou avec Expo Build), installée comme une application
Modules natifsCeux d'Expo Go uniquementTous ceux de ton projet
Configuration de app.json (nom, icône, permissions)Ignorée en partieAppliquée
Notifications push sur AndroidNonOui
Face ID (biométrie sur iPhone)NonOui
SDKCelui de la version d'Expo GoCelui de ton projet

Pour AppliFrais, Expo Go suffit jusqu'au chapitre 8. Les notifications push et Face ID du chapitre 9 demandent un development build :

bash
npx expo install expo-dev-client
npx expo run:android            # compilation locale, Android Studio requis
# ou, sans Android Studio, dans le cloud d'Expo :
npx eas-cli@latest build --platform android --profile development

Les erreurs de démarrage les plus fréquentes

SymptômeCause probableSolution
Expo Go tourne longtemps puis affiche « Could not connect to the server »Le téléphone ne joint pas l'ordinateur : autre réseau, Wi-Fi d'établissement isolé, pare-feuMême réseau Wi-Fi, autoriser Node.js dans le pare-feu, ou npx expo start --tunnel
« Project is incompatible with this version of Expo Go »SDK du projet différent de celui d'Expo GoMettre à jour Expo Go ; créer le projet avec create-expo-app@latest ; ou development build
« You need to be signed in to Expo Go and Expo CLI » (iPhone)Comptes différents ou non connectésnpx expo login et connexion dans Expo Go avec le même compte
« Unable to resolve module … »Bibliothèque non installée, faute de frappe dans l'import, cacheVérifier l'import, npx expo install …, npx expo start --clear
« Text strings must be rendered within a <Text> component »Du texte posé directement dans une <View>Entourer le texte d'un <Text> (chapitre 3)
L'émulateur ne démarre pas ou rameMémoire insuffisante, virtualisation désactivée dans le BIOSFermer des applications, activer la virtualisation, ou utiliser ton téléphone

Exercice 1 sur 3 Ton premier écran Réussi À revoir

Après npm run reset-project, modifie src/app/index.tsx pour afficher, centrés, le titre « AppliFrais », ton prénom en dessous, et la date du jour sous la forme 2026-11-02. Vérifie que le Fast Refresh met à jour l'écran à chaque enregistrement.

Voir la réponseMasquer la réponse de l'exercice 1
tsx
import { Text, View } from 'react-native';

export default function Accueil() {
  const d = new Date();
  const date = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', gap: 8 }}>
      <Text style={{ fontSize: 28, fontWeight: '700' }}>AppliFrais</Text>
      <Text>Lucas</Text>
      <Text>{date}</Text>
    </View>
  );
}

La date est construite à partir de getFullYear, getMonth (qui commence à 0, d'où le + 1) et getDate, avec padStart pour obtenir deux chiffres. new Date().toISOString().slice(0, 10) serait plus court mais donne la date UTC : entre minuit et une heure du matin en hiver (deux heures en été), elle affiche la veille.

Tu avais trouvé ?

Exercice 2 sur 3 Diagnostiquer le démarrage Réussi À revoir

Pour chaque situation, donne la cause et la solution.

  1. En salle de TP, ton iPhone scanne le QR code mais reste bloqué sur « Opening project… », alors que tout marche chez toi.
  2. Après npm install expo-camera, l'application affiche une erreur de module natif introuvable.
  3. Ton camarade a créé le projet la semaine dernière ; Expo Go, mis à jour hier, refuse de l'ouvrir.
Voir la réponseMasquer la réponse de l'exercice 2
  1. Le réseau de l'établissement isole les appareils : le téléphone ne joint pas le port 8081 de l'ordinateur. Lance npx expo start --tunnel (ou utilise l'émulateur, ou un partage de connexion depuis ton téléphone).
  2. npm install a pris la dernière version de expo-camera, qui ne correspond pas au SDK du projet ni aux modules présents dans Expo Go. Désinstalle-la et ajoute-la avec npx expo install expo-camera.
  3. Expo Go est passé au SDK suivant et ne fait tourner que celui-là. Mets le projet à jour (npx expo install expo@^58.0.0 --fix, puis npx expo-doctor), ou utilise un development build, qui embarque le SDK du projet.

Tu avais trouvé ?

Exercice 3 sur 3 Expo Go ou development build ? Réussi À revoir

Pour chaque fonctionnalité, dis si Expo Go suffit : afficher une liste venue d'une API ; prendre une photo avec expo-image-picker ; recevoir une notification push sur Android ; déverrouiller avec Face ID ; utiliser une bibliothèque de lecture de cartes NFC qui n'est pas dans Expo Go.

Voir la réponseMasquer la réponse de l'exercice 3
  • Liste venue d'une API : Expo Go suffit (du JavaScript et fetch).
  • Photo avec expo-image-picker : Expo Go suffit, le module y est inclus.
  • Notification push sur Android : development build, Expo Go ne les reçoit plus depuis le SDK 53.
  • Face ID : development build, Expo Go ne déclare pas l'autorisation Face ID de ton application.
  • Bibliothèque NFC absente d'Expo Go : development build, qui compile les modules natifs de ton projet.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Composants et styles React Native : View, Text, FlexboxRevoir le sommaire du cours