Based on the advantages, it sounds like choosing to build your app with React Native is a no-brainer. However, there are also some limitations to React Native, so it’s important to take these into consideration before making your decision. The main things to watch out for are:
Animations: If your app requires a decent amount of smooth animation, then React Native may not be the best choice. By ‘a decent amount’, I’m not referring to something like
Angry Birds, but subtle things like Spotify’s transition of the tab-bar/compact player to the large player. Your designers may not always be able to get the animation that they desire, so it’s important to explore whether or not the designed animation affects the performance too much.
Lists: If you have large lists, especially those that include images or video (think Instagram), then scroll performance may quickly become an issue that you’ll need to tackle. A good example of this is Discord. Whilst it
still chooses React Native, the team needed to
invest a large amount of time and effort into improving performance (even having to develop native modules to achieve this).
E2E testing: There’s no built-in default End-to-End (E2E) testing library for React Native. There are solutions such as
Detox, but these aren’t as performant or reliable as the in-built E2E solutions that come as standard with Xcode and Android Studio.
Why is E2E testing important? It allows automation of critical user flows, helping to stop any bugs from making their way into your production app.
Performance: Since React Native is based on JavaScript, it needs to ‘bridge’ across to the native platform in order to do things like rendering the UI, or communicating with the native elements, such as camera or audio.
If you’re not careful, bottlenecks can occur, resulting in laggy user interactions, especially on older Android devices. In saying that, there is an
open proposal within the React Native community that looks to improve this, so it’s something to keep an eye on.
User experience: Because of its cross-platform nature, it can be very easy to make unintentional compromises in user experience and flows when building apps with React Native. Whilst writing once for both platforms is a major benefit, there are subtle differences between platforms that ideally should be respected; for example,
navigation, search experience, date pickers, and typography.
Tech debt: JavaScript evolves at a far greater rate than native languages. Because of this, it’s important to stay on top of React Native and dependency updates; otherwise, tech debt is likely to increase quite quickly.