React Native CLI Vs. Expo CLI

Back in May of 2021 I embarked on a venture of creating a mobile app for a startup in Edmonton. If you know me, then you know the Start Up I’m referring to is TradesLink Inc.

The app itself came at a time when the company was trying to solve a real problem in the marketplace. The recruitment of qualified tradespeople for larger commercial and industrial construction companies.

Solving this problem involved attracting a segmented group of users in order to create a pool of qualified trades that are searchable by location, certification, trade, skills etc… and then to give our customers the ability to field these individuals and reach out to them.

Now that you understand the problem we were trying to solve, I’m going to go through our approach to the solution.

The solution: build an engaging community of qualified tradespeople using engaging social type features, and a number of tools to help them manage their credentials, tickets, skills and resumes.

It was fairly clear at the outset that the best way to do this was going to be by means of a mobile app available on iOS and android that provided the aforementioned features.

Why we chose React Native

My experience with mobile apps was primarily through building out PWA’s. If you are not familiar with what a PWA is, simply put it’s a web app that’s optimised to run on your mobile device in a way that looks and feels like a regular app you’d download from Google Play or the Apple App Store.

As the lead developer on the team my initial thought was to build out a PWA. After all it was a technology I was familiar with and had worked with in production environments.

It became fairly clear early on though that we would be missing out on some key features of creating an app that would be downloadable through the app stores. Namely, the ability for our users to find us and our ability to market our product. Yes, there were also major performance benefits gained as well building out our app natively.

When building a Start Up you need to be able to bring your idea or app to market as quickly as possible in order to validate it (You should be clear on the problem you are looking to solve from the outset).

I had played around Swift and Kotlin for iOS and android development and due to my lack of experience and knowledge with these programming languages and their development environments it was clear that it wasn’t going to be a good fit to launch an app as expediently as possible.

These two options put aside, their were really only two other considerations. React Native and Flutter.

Flutter itself requires learning the Dart programming language while React Native required learning an already well know language: JavaScript.

With some React experience already under our belt the only reasonable option for our MVP was React Native.

My second mistake

At the outset I had mentioned that we had started building out our app as a PWA. That lasted about a week and half and was the first mistake I had made. The second mistake I had made was in choosing the development and deployment method of our React Native project.

With React native you have really only two options for setting up your application. Those are React Native CLI and Expo.

The choice I had made was to go with React Native CLI.

If I could go back in time I would definitely choose to build out the application using Expo and here is why.

I should have chosen Expo

I’m not saying that Expo is the best choice in all situations, but I’d say that for 95% of startups building an app using React Native, Expo is the clear choice. For developers who are NOT familiar with building applications using React Native, it’s the best choice 100% of the time.

When researching which one to use I didn’t want to limit us in terms of the features and access to native device API’s that we could utilise. After doing a little bit of research it seemed that Expo could limit us in terms of what the app could do.

What I didn’t realise at the time was that Expo had everything we could ever need for the application we were building in terms of out of the box packages to interact with the mobile device natively on both iOS and android.

There’s also a number of other goodies with Expo like being able to view your project build in a browser or compile it on your native device by scanning the qr codes that Expo provides in its debugging terminal.

Also, the console itself makes debugging your application a lot easier.

What if you outgrow Expo?

Likely you wont outgrow Expo, but should you outgrow Expo and need to handle certain features on a device by device basis, meaning android and iOS, or should you need to integrate custom native packages you can simply “eject” Expo and the project structure will reconfigure itself to work with React Native CLI.

Since having built the core functionality of our app out at TradesLink I’ve had the opportunity to play with and build my own smaller projects using Expo. In each situation, should my apps scale, I don’t see a need to “eject” Expo and switch to React Native CLI.

Conclusion

What have I learned in trying to choose between React Native CLI and Expo CLI?

First of all, I should have followed the advice given at the outset when researching how to set up and eploy a React native project.

The documentation on the React Native site clearly says that most projects should use Expo:

If you are new to mobile development, the easiest way to get started is with Expo CLI. Expo is a set of tools built around React Native and, while it has many features, the most relevant feature for us right now is that it can get you writing a React Native app within minutes. “

This should have been enough for me to make my choice!

Second, It is always always always more important to focus on building out a minimal set of features in the quickest way possible when trying to get your MVP to market. This means working with tools you’re already familiar with and working in easy to use development environments. Expo would have been the better choice for this.

Have any questions? feel free to reach out to me!