Dans une vraie app
Le diagnostic commence par npm ls react react-native (ou l’équivalent pnpm/yarn) depuis l’app : deux versions de react dans l’arbre donnent le fameux « Invalid hook call », et deux copies d’un module natif cassent le build iOS ou Android. Un champ resolutions (Yarn) ou overrides (npm, pnpm) force une version unique. Les projets sur pnpm en mode isolé qui multiplient les erreurs natives peuvent passer nodeLinker: hoisted dans pnpm-workspace.yaml, ce que la doc Expo propose comme solution de repli.
Les scripts natifs sont l’autre source de pannes : un Podfile ou un build.gradle qui référence ../node_modules/react-native en chemin relatif ne trouve rien quand le package est hissé. La bonne forme utilise require.resolve depuis Node pour localiser react-native et @react-native-community/cli-platform-ios, ce que les templates Expo récents font déjà. Un metro.config.js copié d’un tutoriel avec watchFolders et disableHierarchicalLookup doit être simplifié, puis npx expo start --clear pour vider le cache.
En CI et sur EAS Build, un monorepo demande d’indiquer le dossier de l’app et de ne pas exclure la racine via .easignore. Ma règle pour les packages partagés : des sources TypeScript consommées directement (champ main vers src/index.ts), sans étape de build intermédiaire, tant que le package n’est pas publié.
Termes liés
Metro
Le bundler JavaScript de React Native : il résout, transforme et sérialise votre code en un bundle, et sert le dev server.
Autolinking
Le mécanisme qui découvre les librairies natives dans node_modules et les ajoute au Podfile et à Gradle sans édition manuelle.
Expo
Le framework open source recommandé par React Native : SDK de modules natifs, CLI, prebuild, Expo Router, et les services cloud EAS.
EAS Build
Le service de build hébergé d’Expo : des profils dans eas.json, la gestion des credentials, et des runners macOS et Linux pour iOS et Android.
Prebuild (Continuous Native Generation)
La commande Expo qui génère les dossiers android et ios à partir de app.json et des config plugins, au lieu de les maintenir à la main.