A friend of mine looking to start a company has asked me to help him on the tech side.

He is in the process of raising seed funding and comes from a non-technical background. He is building an app that will need to be available across web, iOS, and Android. How should he go about building the app?

I’m a full stack freelance developer with a focus on Javascript. I mostly React for the frontend work I do. I also run a popular fantasy football game. The mobile apps for this game are written in React Native (both Android and iOS).

The question of whether to use React Native is something I have thought about a lot in the past. Having used it in production and seeing friend’s use it and our pain points.

Benefits of React Native

The core benefit of using React Native is that you can share code between iOS and Android instead of writing and maintaining two completely separate codebases. Beyond this, you can also reuse parts of your web app. If you use React Native Web you can share even more code between the three platforms. Potentially the whole thing.

Another benefit is faster app updates. Your app does not have to go through the app review process. Instead you can make over the air (OTA) updates using Expo or CodePush (except for when updating native code).

Disadvantages of React Native

The biggest disadvantage of using React Native is performance. React Native is not native. People starting out with React Native often get excited about being able to write “native” code and deploy it so easily. You can find many benchmarks online regarding React Native performance. I would advice against taking these articles too seriously. The benchmarks are often written for unrealistic use cases and do not depict how a real app will perform as well as the challenges involved in optimising performance. The best way to judge React Native apps is to take a look at apps in the wild which we will do below.

React Native suffers from slow startup performance due to loading the Javascript bundle, and can also suffer from performance while running. The main pain point of performance issues happen in the bridge between the Javascript code and the native code.

In my experience React Native performs better on iOS than it does on Android. This is also others experience as we will see below.

Production Apps Using React Native

One of the most important items to assess is popular apps that run on React Native and how they perform.

The React Native docs have a showcase page that lists many popular apps. One hugely important detail to bear in mind is to what extent each of these apps use React Native.

For example, the Facebook, Instagram and Pinterest apps are all listed on this page, but they use React Native to a minimal extent. The Facebook app is for the most part a native app, but uses React Native for the Marketplace. Blood Donations, Crisis Response, Privacy Shortcuts, and Wellness Checks are also built with React Native.

Facebook uses a native router, which is not the case for most React Native apps. Most RN apps will use a package like React Native Navigation to handle routing.

An example of an app fully built with React Native is Facebook Ads Manager. My own experience using it has been pretty poor. It always felt slow and janky when using it on my Android device (OnePlus 3). I do not know how it performs on iOS, but I assume slightly better. Furthermore, Ads Manager even has some native components. Smaller sized teams will be not have the resources or expertise to build native functionality into their React Native app.

Some of the more impressive apps in the showcase include the Discord app which is handled by a development team of two. It has an average rating of 4.8 with over 442,000 ratings at the time of writing. Discord only built the iOS version of the app in React Native, because they found Android performance to be too slow. There are a wide range of Android devices out there and many of them are less performant than the high end iOS devices. It still made sense for them to build the iOS app in React Native as their web frontend is written in React and it also has the advantage of OTA updates.

There is one screen in the Discord app that is built in native — the chat screen. They couldn’t get the performance they needed for it with regular React Native.

Discord also suffers from a somewhat slow startup time of 1.5 seconds, although this isn’t dreadful. The larger the bundle size the slower the startup time will be. One thing you can do to help with startup speed is to use RAM bundles and inline requires to lazy load your app. You can read more about this here:

Another impressive app in the showcase is the Bloomberg app. I don’t know the details of the app, but having played with it on iOS, it is extremely slick and performant.

I recommend taking a look at many of the apps in the showcase and giving them a test yourself, (but beware, many hardly use React Native.)

One app that used to be on the list is the AirBNB app. They used to use RN for parts of their app, but decided to sunset the project and move back to fully native.

So What Should You Do?

There are very clear advantages and disadvantages to going with React Native. Performance really does matter, as do developer costs and speed of development.

One question to ask is what sort of app is it? If it has a high level of complexity and likely to suffer performance issues, then React Native probably isn’t a good idea. Snapchat wouldn’t work well in React Native for example.

But many apps aren’t that complicated. Often they’re just a collection of list views, articles, chat, and switching tabs. This sort of app could well be written in RN and perform decently enough in most situations.

Another question to ask is what your budget is? I don’t run a large company, but if you’re a Facebook or Google of the world, you can afford to invest in a separate development team for both Android and iOS. Ironically, Facebook are the ones that built React Native (and Google built Flutter), but their core apps are built with native. Facebook and Messenger are mostly native. Gmail is native.

It makes sense for these companies to maintain two separate teams, because they have the resources and making their apps 10% better (or even 1% better) will produce a huge revenue boost that more than covers the costs of the extra developers needed.

There is clearly a perceived need for cross platform development in larger companies too, but for the most part, their core apps have stayed native and will continue to do so for good reason.

For smaller companies starting out I believe it’s a much tougher question.

It’s important to have a presence across all 3 platforms, because then the greatest number of people will have access to it. Building for 3 platforms is extremely costly however. You need to build 3 apps instead of just 1. You can’t reuse any of the code.

This a huge drain on resources. Both time and money. It’s not just 3 times the number of developers needed. It also means the founders have to look over 3 different products and the team has to test 3 times as many apps.

A startup is often about iterating on ideas, and you don’t know what’s going to work and what isn’t. Developing an app for 3 platforms just to realise no one wants to use it is a real shame. The opposite of a Lean Startup (not that all startups necessarily have to follow Lean Startup principles).

One idea is to start out on web and then move to mobile apps once you gain some traction. This is a path I’d recommend for many companies, but isn’t always optimal. Would Instagram or Snap have succeeded had they adopted this strategy when starting out?

And even if you adopt this strategy, develop your web app, gain a little traction and now decide it’s time to build a mobile app, you’re still stuck with the question of native, React Native (or a web view).

If you go the React Native route and get out to the other platforms quickly, you may not become the huge hit you were hoping for, because for parts of your app, the performance isn’t there, and users feel that final 10% that you may not be able to achieve using React Native.

The most annoying part of this all is that you cannot reuse code if you change your mind down the line. If you decide to switch from RN to native, all your previous code has to be thrown out.

I’ve reiterated some of the points above a few times, but as both a developer and entrepreneur I don’t have a good answer for you.

The decision you make will depend on the exact details of your situation. The app your building, the amount of funding you have, and the skillset of your team and future team members.

For another perspective on all this I recommend watching this video:

Final Thoughts

Having said all this, if it’s a project I am involved in I will go with React Native again. This is my skillset and as well as the skillset of many of the people I work with. If it’s a Snapchat type app I would not go with RN however.

I will look to start with a web app and then work out down the line what makes the most sense for next steps. I am very interested in React Native Web as this allows me to build the app for web and move quickly to mobile. Even if we later decide to move to native for the mobile apps, the RNW development would still have been useful and necessary for the web side of things.

Another framework I have been looking into recently is Flutter to see how performant that is. Some of worries around Flutter are an immature ecosystem including packages and learning resources, having to learn the Dart language, and perhaps most importantly, bringing on new developers to develop in Dart.

Having played around with a few Flutter apps I can say that at least the iOS versions of these apps have been really nice and performant. Some teams have moved over from React Native to Flutter and delighted with the move. The opinions of these developers are the ones I value the most as they’ve have good experience with both technologies. It says a lot when a team of React developers gives Flutter a better review than React Native.

This is a topic I may write further about in a future blog post, but if you’re interested, here are some informative articles about real world Flutter applications:

UPDATES:

Reflectly (Flutter) and Codecademy Go (React Native, Expo) were featured as apps of the day on the iOS app store.