Skip to Content

Chapitre 2.1 — Node, pnpm & create-expo-app

Où on en est : début de l’installation. Ce chapitre pose la toolchain JS (que vous avez sans doute déjà) et crée un premier projet jetable pour en disséquer l’anatomie.

⏱️ TL;DR — Node LTS ≥ 20 + pnpm, puis pnpm create expo-app@latest : le template par défaut arrive en TypeScript avec Expo Router préconfiguré. On lance npx expo start, et on dissèque chaque fichier généré : app/, app.json, assets/, tsconfig.json. Rien d’exotique pour vous — c’est un projet Node avec deux fichiers de config en plus.

🎯 Objectifs

  • Vérifier/installer Node LTS et pnpm sur Windows.
  • Créer un projet Expo et comprendre chaque fichier généré.
  • Savoir ce que fait npx expo start (et ce qu’il ne fait pas).
  • Connaître la place de package.json vs app.json.

Node & pnpm

Vous les avez probablement déjà. Vérification :

# PowerShell node -v # ≥ 20 (LTS). Sinon : winget install OpenJS.NodeJS.LTS pnpm -v # ≥ 9. Sinon : npm install -g pnpm

💡 Pour un dev Next.js — pnpm fonctionne parfaitement avec Expo en 2026 (l’époque des soucis de symlinks avec Metro est révolue). On l’utilise dans tout le cours, comme dans vos projets web. Seule nuance : pour les libs natives, on passera par npx expo install (chapitre 1.4) — qui utilise votre gestionnaire détecté, donc pnpm, sous le capot.

Créer le premier projet

Créons un projet jetable (Drill officiel = chapitre 2.5) :

cd C:\Users\Alexl\Desktop pnpm create expo-app@latest hello-rn cd hello-rn

Le template par défaut (SDK 57) fournit : TypeScript configuré, Expo Router installé avec un exemple à deux onglets, ESLint, et les assets de base. Pas de question posée, pas de choix à faire — c’est le « golden path » d’Expo.

Premier lancement :

npx expo start

Metro démarre et affiche un QR code dans le terminal. Laissez-le tourner — on le scanne au chapitre suivant. Notez déjà : expo start ne compile rien de natif. Il sert votre JS, c’est tout (chapitre 1.3 : c’est Expo Go qui apporte le natif en phase d’apprentissage).

Anatomie du projet généré

hello-rn/ ├── app/ ← vos écrans (Expo Router : 1 fichier = 1 route) │ ├── (tabs)/ │ │ ├── index.tsx ← l'onglet d'accueil (route /) │ │ ├── explore.tsx ← second onglet (route /explore) │ │ └── _layout.tsx ← le layout des tabs │ └── _layout.tsx ← layout racine (≈ app/layout.tsx de Next.js) ├── assets/ ← images, polices (icône, splash…) ├── components/ ← composants réutilisables du template ├── constants/ ← couleurs, etc. ├── app.json ← ⭐ la config de L'APP (nom, icône, permissions…) ├── package.json ← deps + scripts (votre monde habituel) ├── tsconfig.json ← étend expo/tsconfig.base, strict └── expo-env.d.ts ← types générés (routes typées)

Trois observations importantes :

1. app/ vous est familier. Un fichier = une route, _layout.tsx = layout imbriqué. Expo Router est délibérément calqué sur App Router — la Partie 5 détaille les différences (pas de Server Components : tout est client, on est dans une app embarquée).

2. app.json est nouveau. C’est la carte d’identité de l’app — méconnaissez-le et rien ne se builde correctement plus tard :

// app.json (extrait du template) { "expo": { "name": "hello-rn", // nom affiché sous l'icône "slug": "hello-rn", // identifiant Expo (URLs EAS) "scheme": "hellorn", // deep links (Partie 5) "userInterfaceStyle": "automatic", // suit le dark mode système "newArchEnabled": true, // New Architecture (défaut) "android": { "adaptiveIcon": { "foregroundImage": "./assets/images/adaptive-icon.png" } // plus tard : "package": "com.alex.drill" (Partie 12) }, "plugins": ["expo-router"] // config plugins (chapitre 1.3, Partie 11) } }

Tout ce qui, sur le web, serait des métadonnées de déploiement (nom, icônes, permissions, schéma d’URL) vit ici. Les config plugins listés modifient les projets natifs au prebuild. En Partie 11 on le convertira en app.config.ts (version TypeScript, dynamique).

3. Pas de dossier android/. Rappel du chapitre 1.3 : il n’existe pas tant qu’on n’en a pas besoin — CNG le générera. Votre repo ne contient que du JS/TS et de la config.

Les scripts du quotidien

// package.json (extrait) { "scripts": { "start": "expo start", "android": "expo run:android", // build natif local + lance (Partie 11) "lint": "expo lint" } }
CommandeRôleÉquivalent mental Next.js
npx expo startMetro + QR (pas de compilation native)next dev
npx expo start -cIdem en vidant le cache Metrorm -rf .next && next dev
npx expo run:androidPrebuild + gradle + installe sur l’appareil— (n’existe pas sur le web)
npx expo install <lib>Ajout compatible SDKpnpm add (mais version pilotée)
npx expo-doctorDiagnostique le projet (versions, config)

⚠️ Piège — Le cache de Metro est la première cause de comportements fantômes (« j’ai supprimé ce fichier et il vit encore »). Réflexe pavlovien à installer dès aujourd’hui : au moindre doute, npx expo start -c. Vous venez d’économiser des heures.

✏️ Exercices

1. Créez le projet hello-rn, lancez npx expo start, et identifiez dans la sortie du terminal : l’URL de Metro et le QR code. Que se passe-t-il si vous ouvrez l’URL dans Chrome ?

✅ Solution

Metro sert sur exp://192.168.x.x:8081 (affiché sous le QR). L’URL http correspondante ouvre une page de statut/outils — pas votre app : le bundle RN n’est pas une page web. (Le template supporte aussi w pour un rendu web via react-native-web, mais ce n’est pas notre sujet.)

2. Dans app.json, changez "name" en "Coucou RN". Où ce changement sera-t-il visible, et où ne le sera-t-il PAS encore ?

✅ Solution

Visible dans Expo Go (titre du projet) et, plus tard, sous l’icône de l’app installée. PAS visible : nulle part dans le code JS (le nom n’est pas votre <Text> d’accueil), et le changement d’icône/nom d’une app déjà buildée exige un rebuild — app.json est lu au build/prebuild, pas à chaud (sauf par Expo Go).

3. Sans lancer la commande : que ferait npx expo run:android sur votre machine actuelle, et pourquoi échouerait-il probablement aujourd’hui ?

✅ Solution

Il ferait un prebuild (génération de android/) puis compilerait avec gradle et installerait l’APK sur un appareil/émulateur connecté. Il échouerait car le SDK Android / Android Studio n’est pas encore installé (chapitre 2.3) — et c’est exactement pourquoi on apprend d’abord le mode Expo Go, qui n’exige rien de tout ça.

🧠 Quiz

1. Que contient le template par défaut de create-expo-app en SDK 57 ?

Réponse

TypeScript configuré (strict, base Expo), Expo Router avec un exemple à deux onglets, ESLint, les assets de base (icône, splash) — prêt à lancer avec npx expo start.

2. Quelle est la différence de rôle entre package.json et app.json ?

Réponse

package.json = le projet Node (dépendances, scripts) — identique au web. app.json = la config de l’application (nom, slug, icône, permissions, scheme, config plugins) — lue au build/prebuild pour générer le natif.

3. npx expo start compile-t-il du code natif ?

Réponse

Non. Il lance Metro qui bundle et sert votre JS sur le réseau local. Le natif vient soit d’Expo Go (apprentissage), soit d’un development build (Partie 11).

4. Quel est le premier réflexe face à un comportement inexplicable en dev ?

Réponse

Vider le cache de Metro : npx expo start -c. (Deuxième réflexe : npx expo-doctor pour vérifier versions et config.)

5. Pourquoi le projet généré n’a-t-il pas de dossier android/ ?

Réponse

Grâce au CNG (Continuous Native Generation) : les projets natifs sont générés à la demande par expo prebuild à partir d’app.json et des config plugins. Tant qu’on développe dans Expo Go, ils sont inutiles.


👉 Chapitre suivant : 2.2 — Ton téléphone = machine de dev — on scanne ce QR code.