Every lesson so far assumed "a React Native project" as a given. In practice, the very first real decision is which of two genuinely different setups to start from — and switching later is real, costly work, not a quick config change.
3 min read
your-app/
├── ios/ ← a real Xcode project, yours to configure directly
├── android/ ← a real Android Studio/Gradle project, yours directly
└── App.js
Bare React Native gives you direct, unrestricted access to the actual native iOS and Android projects underneath — full control to add any native module (lesson 8), configure any native setting, or write custom native code directly, at the cost of needing to actually understand and maintain two real native build systems (Xcode/CocoaPods for iOS, Gradle for Android), including keeping up with OS-version-specific build tooling changes over time.
npx create-expo-app my-app
npx expo start # runs immediately, no Xcode/Android Studio setup requiredExpo's managed workflow hides the native projects entirely — no Xcode, no Android Studio, no native build configuration to touch directly — and provides its own curated set of native-module equivalents (camera, location, notifications) that work without ever writing or configuring native code. This is a genuinely faster, lower-friction starting point, especially for a first mobile project or one that doesn't need an exotic native capability outside Expo's own supported set.
expo prebuild: the actual escape hatch, not a one-way wallA genuinely common misconception is that choosing Expo locks a project out of ever using a native module Expo doesn't directly support — expo prebuild generates the actual native ios/ and android/ project directories from an Expo project, converting it into something closer to bare React Native while keeping everything already built. This is real, one-directional, structural work (not a toggle you flip back easily) — but it means starting with Expo isn't a permanent ceiling, just a deliberately deferred decision about when to take on native-project complexity.
Even a managed Expo project still eventually needs a real, signed build to submit to an app store (lesson 11's own territory) — EAS (Expo Application Services) Build runs the actual native build process in Expo's own cloud infrastructure, producing a real, installable app binary without the developer needing a local Xcode/Android Studio setup even at build time, not just during development. This closes the gap between "Expo hides native complexity during development" and "eventually you need a real native build," without requiring the developer to ever personally touch a native toolchain.
Starting with Expo is the right default for nearly every new React Native project today — the prebuild escape hatch genuinely removes most of the historical risk of "getting stuck" in the managed workflow. Bare React Native remains the right choice specifically when a project's requirements are already known to need something entirely outside Expo's curated native-API surface from day one, or when a team already has deep, existing native-build expertise and infrastructure that bare access integrates with more directly.
Check your understanding
A quick comprehension check — not tracked, not graded, just for you.
1. What does bare React Native give you that Expo's managed workflow doesn't, by default?
2. Why is choosing Expo not a permanent ceiling on what native capabilities a project can access?
3. What problem does EAS Build solve for a managed Expo project?
Mobile Development