A Year with Expo

evening kid
3 min readJan 11, 2019

You may be wondering why people both love and hate Expo so much. Put in a nutshell, Expo is extremely convenient. I believe there is no easier way (if you know about React) for getting started with mobile development. It’s cross-platform, simple and has great tools for you from testing to publishing your app. So where’s the catch?

In case you don’t know about Expo, it’s a suite of tools and APIs that helps you build React Native apps, but that also keeps your app up-to-date with the framework regular changes (which was part of the reasons why Airbnb stopped using React Native actually).

Expo in a way feels like any Apple product: it’s great, but as soon as you want a little more, you’ll feel limited. What awaits is what we call “ejecting your app”, which means that you’ll lose some of the wonderful Expo environment and find the pretty harsh world of basic React Native. Don’t get me wrong, it’s not unsurmountable. However, React Native without Expo can be very intimidating for a beginner (“but what isn’t” some may say). So when you’ve been to a couple of React workshops or just got started for a year with web development, and you see a brand new opportunity for making a mobile app within an hour, you bet that Expo will seem like the right choice.

React Native is really a great project, in lots of ways. As a long-time React developer now, I truly like the fact that I can easily reuse components and code logic from one project to another. Plus, there is a very useful pattern that makes cross-platform very handy. It consists into having all your component logic into a container component, and then have two separate view files in case you would want your UI to have a different look on different platforms (component.android.js/.ios.js).

// index.js
import Button from './Button';
class ButtonContainer extends Component {
onPress = () => { ... };
render() {
return <Button onPress={this.onPress} {...this.props} />;
}
}
// Button.android.js
function Button(props) {
return <Text>Android button</Text>;
}
// Button.ios.js
function Button(props) {
return <Text>iOS button</Text>;
}

You can even separate your models into a different package that can be shared between your mobile and web apps, even with your back-end. With that being said, I guess this is where the frustration comes from: we are so close from being able to have the whole pipeline using one programming language, one UI library (backed up by a massive and active community), that it gets ugly when you need to, let’s say add payments in your app. As of now, this is probably the biggest deal-breaker for using Expo.

#1 : How is this the top-requested feature, but not planned in the “Expo for Professionals” roadmap? Professionals making apps need to charge for them sometimes, or take payments!

#2 : We are having to plan a huge workflow for detaching because of this issue. Really sad, Expo has so much promise. Still this is a business-killer.

I think that it would be a waste of time trying to convince you that Expo is great, because it just is. Yet the problem is that it can’t help the people who want to create an app but also make a living from it. And as long as Expo will not deliver solutions for professionals (even if it comes at a cost, for real), it will remain this way, loved, then hated, until we eject.

To be honest, most of us genuinely believe in what Expo could be, in the long term. I know that their team believe that mobile development should be simple, and accessible to the majority of creators. And for this reason, if you’re still hesitating, give it a try. But I wish we could hear more about basics features we need to do Expo not only as a hobby, but as a real professional list of tools.

Note: I spent a full year working with Expo, and published two apps. If you’re interested, feel free to check Store Screens or HSK Exams on the App Store.

--

--

evening kid

I often find myself reading too many articles on the internet