When you write code in Expo you are writing React Native code. Expo has two main pieces:

  1. Expo CLI (expo-cli): a developer tool for creating projects, viewing logs, opening on your device, publishing, etc.

  2. Expo client: an app on your phone that lets you open your projects while you're working on them, without needing to go through XCode or Android Studio, and also lets other people view them too! And if you publish it through expo-cli, people can access it at any time through the Expo client on Android or on iOS if signed in to the same account it was published with. Lastly, we also make it possible to build standalone apps so people don't have to use the Expo client to open it, and you can distribute to the app store and play store if you like.

So Expo is a set of tools built on top of React Native. These tools depend on one key belief held at Expo: it's possible to build most apps without ever needing to write native code, provided that you have a comprehensive set of APIs exposed to JavaScript.

This is important because with React Native you can always drop down to native code. This is incredibly helpful sometimes but it comes at a cost: you need to send people your binaries if you want them to test them, someone on the other side of the world can't just tap a link to open it while you're working on it and you can't just publish it with one click for someone to access it similar to how you would in a browser.

With Expo, we suggest that try to avoid dropping down to native code, if you can. As I mentioned above, we think that with a comprehensive set of APIs available to JavaScript, this shouldn't be necessary for most apps. So, we aim to provide this comprehensive set of APIs, and then build all of the awesome tooling that can exist in a world where the native runtime is shared.

However, if you must find that you want to drop down to native, you can use eject and continue using the native APIs that Expo gives you while having the same level of control as you would in any native project.

Read more about ejecting

Answer from brentvatne on Stack Overflow
Top answer
1 of 14
327

When you write code in Expo you are writing React Native code. Expo has two main pieces:

  1. Expo CLI (expo-cli): a developer tool for creating projects, viewing logs, opening on your device, publishing, etc.

  2. Expo client: an app on your phone that lets you open your projects while you're working on them, without needing to go through XCode or Android Studio, and also lets other people view them too! And if you publish it through expo-cli, people can access it at any time through the Expo client on Android or on iOS if signed in to the same account it was published with. Lastly, we also make it possible to build standalone apps so people don't have to use the Expo client to open it, and you can distribute to the app store and play store if you like.

So Expo is a set of tools built on top of React Native. These tools depend on one key belief held at Expo: it's possible to build most apps without ever needing to write native code, provided that you have a comprehensive set of APIs exposed to JavaScript.

This is important because with React Native you can always drop down to native code. This is incredibly helpful sometimes but it comes at a cost: you need to send people your binaries if you want them to test them, someone on the other side of the world can't just tap a link to open it while you're working on it and you can't just publish it with one click for someone to access it similar to how you would in a browser.

With Expo, we suggest that try to avoid dropping down to native code, if you can. As I mentioned above, we think that with a comprehensive set of APIs available to JavaScript, this shouldn't be necessary for most apps. So, we aim to provide this comprehensive set of APIs, and then build all of the awesome tooling that can exist in a world where the native runtime is shared.

However, if you must find that you want to drop down to native, you can use eject and continue using the native APIs that Expo gives you while having the same level of control as you would in any native project.

Read more about ejecting

2 of 14
202

A summary of the documentation and answers from Expo employees:

React Native init:

Advantages

  • You can add native modules written in Java or Objective-C (probably the only but the strongest one)

Disadvantages

  • Needs Android Studio and Xcode to run the projects
  • You can't develop for iOS without having a Mac
  • Device has to be connected via USB to use it for testing
  • Fonts need to be imported manually in Xcode
  • If you want to share the app you need to send the whole .apk / .ipa file
  • Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example
  • Setting up a working project properly (including device configuration) is rather complicated and can take time

Expo

Advantages

  • Setting up a project is easy and can be done in minutes
  • You (and other people) can open the project while you're working on it
  • Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file
  • No build necessary to run the app
  • Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)
  • You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them
  • Expo can build .apk and .ipa files (distribution to stores possible with Expo)

Disadvantages

  • You can't add native modules (probably a game changer for some)
  • You can't use libraries that use native code in Objective-C/Java
  • The standard Hello World app is about 25MB big (because of the integrated libraries)
  • If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit
  • Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code
  • When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then
  • Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)

Sources:

  • Detaching Expo Apps to ExpoKit: Concepts
  • Difference between react-native-init and create-react-native-app #516
  • Ejecting to ExpoKit
🌐
Medium
medium.com › @softworthsolutionspvtltd › expo-vs-react-native-cli-7e47c7630039
Expo vs React Native CLI. Expo or React Native CLI ? What should… | by Softworth Solutions Private Limited | Medium
June 27, 2023 - However, all the above mentioned ... like RevenueCat which will solve the problem. ... React Native CLI is the traditional approach for building React Native apps....
🌐
Reddit
reddit.com › r/reactnative › what do companies use? (expo or cli)
r/reactnative on Reddit: What do companies use? (Expo or CLI)
November 2, 2023 -

I am trying to develop an app and am not sure which to use. I know Expo is easier and quicker but you can't access native elements. But there should js lib to do most things. Or should I just start using CLI and if I use CLI would I still be able to write on code base and get an app that works for both ios and android?

Top answer
1 of 17
56
To answer your question to the best of my knowledge: large companies use CLI simply because their apps are far more hybridized than hobbyist apps. Many of them, for efficiency reasons or compatibility reasons, have lots of custom native code in their projects. As for this sub, I honestly don’t know where to guide you to but this sub has become a giant expo ad. You will receive extremely biased opinions all favoured towards expo. I’ve been developing RN apps for a few years. I’ve used both, but I prefer CLI simply because I am closer to the native side and I have learned native development and how RN itself works. I understand the build errors and release processes etc. if you’re a beginner keep in mind that you may be hindering yourself of that same knowledge if you stick with expo. Now Expo is great, but keep in mind that it doesn’t change how RN works. Despite what many say, there are obviously limits to what you can do. If you cannot trust yourself to debug native code which may arise when using the CLI, think carefully if you can fix issues which may occur when ejecting a working project. Also think about your project requirements. If it doesn’t have third party support from expo, Ide go with CLI. If you want to learn RN, go with CLI. If you want to develop a quick simple app, Ide go with Expo. Sorry about this long rant. I’m just a bit fedup about this expo cult thing that’s been going on recently.
2 of 17
31
If starting today, use expo. You can access native code with expo’s latest version, development clients and config plugins.
🌐
MagmaLabs
blog.magmalabs.io › home › expo vs react native cli in 2023
Expo vs React Native CLI in 2023 - MagmaLabs Blog - The Volcano
April 3, 2023 - Expo Go is an example of a native runtime for developing React Native apps. An update: A bundle of your application’s JavaScript code and assets (images, video, fonts, and so on). An update can be served from your local computer with Expo CLI, embedded in the binary by EAS Build, or hosted on a publicly available server.
🌐
Nitor Infotech
nitorinfotech.com › blog › a-comparative-analysis-between-react-native-cli-expo-cli
A Comparative Analysis Between React Native CLI & Expo CLI | Nitor Infotech
Compatibility With Native Functionality – With React Native, you can now connect with a variety of native mobile features such as the camera, file system, Bluetooth, and much more, thanks to the hard work and dedication of the React Native community. Payment Methods – Not all payment types and payment methods are supported by Expo CLI.
🌐
Eightify
eightify.app › summary › web-development › expo-vs-react-native-cli-making-the-right-choice-in-2023
Expo vs React Native CLI: Making the Right Choice in 2023 — Eightify
TLDR Expo and the React Native CLI offer different pros and cons for setting up a React Native environment, but Expo has made significant improvements in terms of flexibility, customization, and ease of use, making it a viable option for developers.
Published   July 4, 2023
🌐
Locofy
locofy.ai › blog › expo-for-react-native
Is Expo Really Better than React Native CLI? | Locofy Blogs
The mobile apps can be shared via a simple QR code and users can instantly get the app up and running by simply scanning it. React Native CLI apps require macOS in order to build iOS apps – meaning Windows users cannot develop iOS apps without ...
Find elsewhere
🌐
Retool
retool.com › blog › expo-cli-vs-react-native-cli
Retool Blog | Putting the Expo vs React Native debate to rest
February 16, 2023 - Yes, that’s right. The React Native docs believes that, by default, developers should choose Expo CLI over their own React Native CLI. Why? Well, React Native CLI and Expo CLI aren’t exactly competitors; rather, they are two techniques vying for the same goal.
🌐
Swovo
swovo.com › blog › expo-vs-react-native
Expo vs React Native CLI: Key Differences Explained
React Native CLI provides developers with more flexibility and control over the project setup. Expo is ideal for beginners or rapid prototyping, while React Native CLI appeals to developers who require extensive access to native modules.
🌐
Medium
medium.com › @nikolagorgievmkd › react-native-for-react-developers-part-2-react-native-cli-vs-expo-46c788d09b39
React Native for React Developers [Part 2: React Native CLI vs Expo ] | by Nikola Gorgiev | Medium
February 17, 2023 - The last thing I will mention is the so-called Ejecting of the Expo Project, which is not recommended, but at least you have the option (which is not reversible), and what it does is “converting” the expo app into a real react native app, and after that you can continue with react native cli, and use all the benefits that React Native provides.
Top answer
1 of 2
16

React Native CLI:

Advantages:

  • You can add native modules written in Java/Objective-C, so you have full control of your application.

Disadvantages:

  • Needs Android Studio and XCode to run the projects

  • You can't develop for iOS without having a mac

  • If you want to share the app you need to send the whole .apk / .ipa file

  • Does not provide JS APIs out of the box, e.g. Push-Notifications, Asset Manager, they need to be manually installed and linked with yarn for example.

  • Setting up a working project properly take more time.

Expo:

Advantages:

  • Setting up a project is easy and can be done in a few minutes.

  • Sharing the app is very easy (via QR-code or link).

  • No build necessary to run the app

  • Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.)

  • You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them

  • Expo can build .apk and .ipa files (distribution to stores possible with Expo)

Disadvantages:

  • You can't add native modules (probably a gamechanger for some)

  • You can't use libraries that use native code in Objective-C/Java (eg: react-native-fbsdk)

  • Large APK Size

  • Debugging in ExpoKit (with native modules) is a lot more complicated since it mixes two languages and different libraries.

  • Choosing between Expo and React Native CLI depends on your application requirements.

2 of 2
4

I prefer React Native CLI, expo has some good things but it has a lot of limitations and probably you will regret to use it in the future.

Check this website: https://apiko.com/blog/expo-vs-vanilla-react-native/

🌐
Reddit
reddit.com › r/reactnative › expo vs react native cli
r/reactnative on Reddit: Expo vs React Native CLI
April 12, 2020 -

I was asked to setup a react native project for my company, which will be probably mantained for long and thus i have to do it properly. My question is: should i go for Expo or Cli? My answer would be CLI from what i understand now, since expo could lead to some limitations at some point and i don't want that to happen. On the other hand, Expo seems much simpler and many tutorials i see use it instead of CLI. What's your take?

🌐
The Frontend Forge
thefrontendforge.hashnode.dev › react-native-expo-versus-cli-a-detailed-overview
React Native Expo vs CLI: Key Differences
January 7, 2025 - Setting up a React Native project for the first time using the CLI can be a lengthy process, often taking up to 4 hours. This involves several steps: Downloading and installing dependencies separately for both Android and iOS ... In contrast, setting up the same project using Expo can be completed in about 4–5 minutes with the same internet speed.
🌐
Stack Overflow
stackoverflow.com › beta › discussions › 78231158 › which-is-better-for-developers-to-develop-react-native-with-expo-cli-or-bare-re
Which is better for developers to develop? React Native with expo CLI or Bare React Native app. - Stack Overflow
Expo CLI is better for faster setup, ease of use, and smaller projects without heavy native code dependencies. Bare React Native is better for complex apps needing custom native modules or deep platform-specific features.
🌐
GitConnected
levelup.gitconnected.com › react-native-cli-vs-expo-cli-which-one-do-i-choose-bdf02ea457bf
React Native CLI vs Expo CLI — Which one do I choose? | by Umair Feroze | Level Up Coding
September 7, 2021 - React Native CLI is a built-in feature that helps you take control over the management of the project locally. You can create and run your applications. You can create a project by simply using this command. ... To run a project, you can run the following commands. // run on all platforms npx react-native start// run on android npx react-native run-android// run on iod npx react-native run-ios
🌐
Reddit
reddit.com › r/reactnative › expo vs bare react native project. what to use in 2024 (and beyond)?
r/reactnative on Reddit: Expo vs bare React Native project. What to use in 2024 (and beyond)?
December 23, 2023 -

Currently in the middle of planning out a basic calendar app for my workplace where you can view upcoming events and see what's going on in the museum. I have my development environment up and running on my Intel Macbook Pro but I'm struggling to decide if I should use Expo or a bare React Native project.

What would you use in 2024 and why?

🌐
Medium
snehasishkonger.medium.com › react-native-cli-vs-expo-a142de3602e7
React Native CLI vs Expo. </ Let’s think it logically> | by Snehasish Konger | Medium
March 25, 2024 - It suits complex projects where ... learning curve and potentially higher maintenance efforts. Expo simplifies the process of developing React Native applications....
🌐
Stack Overflow
stackoverflow.com › questions › 78518800 › when-should-i-use-react-native-cli-instead-of-expo-for-my-project
android - When should I use React Native CLI instead of Expo for my project? - Stack Overflow
A few wins: Expo offers less control over build processes and app layout compared to the CLI. This can limit your ability to optimize or tailor the application to specific needs. Increasing app size: Expo apps are slightly larger due to the ...