The short answer
For most new React Native apps, start with Expo. It is a framework on top of React Native that handles project setup, device features, builds and over-the-air updates, and the React Native documentation now recommends starting with a framework like it. The bare React Native CLI gives full manual control of the native projects, which a few apps with unusual native needs still want. Expo can also generate the native projects when you need to customize them.
Key points
- Expo is a framework for React Native, not a different technology.
- The React Native docs recommend starting new apps with a framework such as Expo.
- Expo handles builds, updates and most device features for you.
- You can still add custom native code with Expo.
- The bare CLI suits apps with deep, unusual native requirements.
Side by side
| Expo | React Native CLI | |
|---|---|---|
| What it is | A framework built on React Native | React Native with the native projects managed by hand |
| Setup | One command, little native tooling to start | Xcode and Android Studio configured yourself |
| Device features | Many ready-made modules | Add and configure libraries yourself |
| Builds | Cloud or local build tooling provided | Your own build setup |
| Updates without store review | Supported for JavaScript changes | Add a solution yourself |
| Custom native code | Supported, through generated native projects | Full direct control |
Why Expo is the usual starting point
The React Native documentation’s getting-started guide recommends creating new apps with a framework, and names Expo. The React documentation lists Expo as the framework for native apps too. The reason is practical: much of the work in a mobile project is not the app itself but setup, builds, signing and device features, and Expo handles most of it.
- A small team spends its time on the product, not the toolchain.
- Test builds can reach phones quickly during development.
- Fixes in JavaScript can be shipped as updates, within the stores’ rules.
- Upgrading React Native versions is more manageable.
When the bare CLI still makes sense
- The app depends heavily on custom native code or an unusual SDK.
- You are adding React Native screens to an existing native iOS or Android app.
- Your team has strong native experience and wants direct control of the projects.
Even here, Expo’s prebuild approach, which generates the native projects from configuration, covers more cases than it once did. Check before assuming you need the bare setup.
How to decide
- List the device features and SDKs the app needs.
- Check each is supported by an Expo module or a compatible library.
- If all are, start with Expo.
- If one is not, see whether a custom native module within Expo would cover it before going bare.
React Native against Flutter is a separate decision, covered in React Native vs Flutter. Store publishing is in How to publish an app on Google Play and App Store rejection reasons. We build iPhone and Android apps from one React Native codebase in mobile app development.
Sources
Checked when this guide was written.