Full transparency: Bathtimer has been ejected from expo for a few months, but since a good portion of initial development is still written in expo, I want to share (1) why I started out using expo, and (2) why I decided to part ways with it.
When working with React Native, no developer is a stranger to Expo. I'm sure a lot of people started their journey using Expo, since even the React Native team advocates its usage for beginners. I started out with Expo because it gave a few advantages over going with plain React Native:
-
It abstracted out the underlying Android/iOS code, config, etc. and allowed me to develop 100% in Javascript/Typescript. I just wanted to get an app made as quickly as possible, so I didn't want to get bogged down in the nuances of Andriod/iOS programming. Plus, it was nice to stick with JS/TS, since I personally enjoy working with it.
-
It has a better development experience than plain React Native. You can test the app on your phone without plugging it into your computer. You can build and publish in a more streamlined fashion. Even something like setting the app icon or splash screen is much easier to do in Expo than in pure React Native.
Here's a video by Evan Bacon, one of Expo's maintainers, that does a great job highlighting the strengths of Expo: https://www.youtube.com/watch?v=YjJ0NG9MFkg
Alas, as with most upsides, they're packaged along with downsides. Expo has one glaring weakness: there is a wealth of libraries you can't use. Namely, libraries that use native code (I think Expo has a new feature called Expo Native Modules. I'm not sure if this fixes the problem entirely, so I'll have to check it out on my next mobile app project). I came to a point where I needed to install a library that had native code, and there was nothing in the Expo ecosystem that supported what I needed. The feature I needed was a timer that continued running even in the background, i.e. if the screen is off, the timer needed to continue counting down. Expo didn't have such a library, so I turned to react-native-background-timer. It was a difficult choice to make, since it's difficult to even consider parting with a such a useful tool. Ultimately, I decided to eject from Expo and into bare React Native.
Was it the right choice? Since I've ejected, I've installed many native libraries that have helped immensely. On the flipside, I had to work directly with Android/iOS code and config (which, admittedly, isn't as hard as I thought it would be, but is still an extra chore). Also, publishing to the Play Store is always a tedious task that Expo would have made easier.
What do you think? Have you ejected an app from Expo? Why, and do you wish you could go back?
If you're still using Expo, do you think you'll stay in the managed workflow forever, or is there something that could push you to eject?