React Native is a framework that allows you to build native mobile apps using JavaScript.
React Native is not about avoiding any native development, it’s more about boosting productivity and sharing business logic and practices among very different platforms. [1] .
- reuse ideas and skills across platforms - Learn Once, Write Anywhere
- make mobile developer experience as quick as that of a web developer
- maintain one codebase instead of two for mobile project
- lower the cost of hiring a mobile developer
- increase the pool of mobile developers by lowering the cost of entry
You can check Showcase page and React Native Apps GitHub pages for some of the apps built with React Native.
NO.
Read about the Airbnb experience with React Native [2] and the reasons they are moving away.
tl;dr
-
Cross-platform
Most features that used React Native were able to achieve 95–100% shared code and 0.2% of files were platform-specific (.android.js/.ios.js).
-
Iteration speed
While developing in React Native, we were able to reliably use hot reloading to test our changes on Android and iOS in just a second or two. (...) At best, native compilation times are 15 seconds but can be as high as 20 minutes for full builds.
-
Performance
One of the largest concerns around React Native was its performance. However, in practice, this was rarely a problem. Most of our React Native screens feel as fluid as our native ones. Performance is often thought of in a single dimension. We frequently saw mobile engineers look at JS and think “slower than Java”. However, moving business logic and layout off of the main thread actually improves render performance in many cases.
-
Animations
Thanks to the React Native Animated library, we were able to achieve jank-free animations and even interaction-driven animations such as scrolling parallax.
-
Performance
However, the initialization and first-render time (outlined below) made React Native perform poorly for launch screens, deeplinks, and increased the TTI time while navigating between screens.
-
Immaturity
React Native is less mature than Android or iOS. It is newer, highly ambitious, and moving extremely quickly.
-
JavaScriptCore inconsistencies
... it is executed on a JavaScriptCore environment. The following are consequences we encountered as a result:
- iOS ships with its own JavaScriptCore out of the box. This meant that iOS was mostly consistent and not problematic for us.
- Android doesn’t ship its own JavaScriptCore so React Native bundles its own. However, the one you get by default is ancient. As a result, we had to go out of our way to bundle a newer one.
- While debugging, React Native attaches to a Chrome Developer Tools instance. This is great because it is a powerful debugger. However, once the debugger is attached, all JavaScript runs within Chrome’s V8 engine. This is fine 99.9% of the time.
-
Initialization Time
Before React Native can render for the first time, you must initialize its runtime. Unfortunately, this takes several seconds for an app of our size, even on a high-end device. This made using React Native for launch screens nearly impossible.
Also, have a look at the follow up by Charlie Cheever from Expo team [3].
YES and NO.
Expo is a free and open source toolchain built around React Native to help you build native iOS and Android projects using JavaScript and React.