React Native in 2019 & Beyond
React Native is a great solution for building native mobile apps for iOS and Android with React. Should you still learn it?
React Native is a great library and tool/ SDK that allows you to use JavaScript and React.js to build native mobile apps for iOS and Android.
It compiles your views to native code for the specific platforms and runs your JavaScript logic in a virtual machine that's part of the published app. To your users, it's a normal app which is downloaded from the app store.
In case you're interested, here's a more detailed description of how React Native works under the hood.
What's good about React Native
The value proposition of React Native - build native mobile apps with web technologies - is pretty sweet.
And indeed, it's easy to get started with React Native and build real native apps (that will be distributed via the app stores) with it. You use your React.js and JavaScript knowledge and you don't need to learn Swift or ObjectiveC for iOS or Java for Android.
That saves you a lot of time - you don't have to learn these extra languages after all. It also allows you to share some code between your React for web and native app projects. Not all code though, because React Native doesn't support HTML elements you would use in the browser, but all your core business logic at least.
In addition, React Native, just like React.js, is maintained by Facebook.
This is great because it means that you got reliable maintenance and a strong marketing machine behind React Native. Facebook is using React Native for many of its own apps (e.g. parts of Instagram) and it therefore proves that you can use React Native in major apps.
I also wrote "parts of Instagram" because you can indeed use React Native to power parts of your apps - or you build the entire app with it, that is up to you. It is possible to integrate React Native (and hence JavaScript + React) with your native code and depending on the complexity of the app, you might also be forced to combine both.
What could be better?
That brings us to the weaknesses.
React Native can be used to build an entire app with it. But, depending on the complexity of your app, you might hit a point where you can't build the app you want to build with JavaScript + React.js + React Native only.
You might want to use a certain native platform feature - e.g. the camera or TouchID.
In such cases, you got a couple of options:
Look for implementations in React Native itself (here's a list of the core APIs)
If not implemented in React Native itself, search for community-managed packages
If there also is no community-managed package: Write your own native code and connect it to React Native/ JavaScript
Whilst writing your own native code + connecting it is possible (and actually part of React Native's philosophy - it's not meant to be a "nothing else required" solution), that requires you to learn at least a bit of ObjectiveC (iOS) or Java (Android) code. And that costs time.
Of course, you typically still save a lot of time because you don't have to write the entire app in native code.
And in many apps, you very likely never have to write any custom native code.
The most common native platform features like using the camera or maps are available via community-managed packages. That means you can simply install those packages and you can then tap into these native device features via a convenient JavaScript API.
React Native itself doesn't really ship with a lot of native platform features - it primarily focuses on giving you the build process, the compilation process/ workflow and the core native building blocks (components) you need to build mobile user interfaces for iOS and Android.
The downside of this approach is, that you rely on the community packages being actively maintained - and you have no guarantee for that.
The bigger packages (e.g. camera) are probably not going anywhere but you might face scenarios where a package is not up-to-date with the latest React Native version or where some bug hinders you from progressing. In such scenarios, you need to find workarounds, fix the issue yourself or pick another package.
What will change in 2019?
Partly because of some of the mentioned problems of React Native, AirBnB stopped using it for its native apps.
Of course, AirBnB wasn't the only big company using React Native but that still was a pretty big hit. One can only assume that it pushed the React Native team further into re-thinking React Native.
At least, that is what the React Native team did in 2018, described in a thorough blog post.
The initiatives laid out there, can be tracked here, here and here.
In addition to these changes, the React Native team is also working on other initiatives that should lead to the entire ecosystem working more like "one big solution", rather than the current state of "React Native + third-party packages".
This re-architecture is pretty exciting and has the potential of bringing React Native onto a new level! Whilst some disadvantages will of course still exist, these changes should improve the performance and reliability of React Native. It should also make it easier to create and maintain packages that tap into native device features - removing some of the uncertainties you're facing when using community packages for that.
What will change in 2020+?
The initiatives laid out in the previous sections are not necessarily all completed by the end of 2019. It's a huge process after all and the goal of having a stronger, more integrated community and fast-moving smaller pieces is an ongoing process.
Whilst most work will very likely be done by the end of 2019, we will certainly see more efforts and improvements in 2020. But most likely the current re-architecture efforts will provide a foundation that then doesn't have to be touched again in 2020+.
I would also expect, that we see even more efforts towards improving the development process and making it easier to build as much of your app with just JavaScript + React as possible.
What I wouldn't expect though (because it's not the goal and philosophy), is, that you get auto-adopting (to iOS/ Android styles) UI components. After all, React Native embraces the idea of providing the primitive building blocks and giving you as much flexibility as possible.
Summary
React Native always was and still is a great solution for building real native mobile apps with JavaScript and React.js.
It has its issues, but all cross-platform solutions (like NativeScript etc) have such rough edges - React Native simply is no exception.
But with the planned re-architecture, the team behind React Native seems to be doing the right thing.
I'd expect React Native to continue to grow in the future, I would also expect that more and more bigger companies (re-)consider it for their next apps.