React Native has a reputation problem. Ask any iOS developer and they will tell you it will never match native performance. Ask a Flutter developer and they will say the same thing. Ask someone who last used React Native in 2019 and they will have horror stories about jank and bridge overhead.
They are all describing a different product than what ships today.
What Changed
The old React Native architecture had a fundamental problem: every call between JavaScript and native code crossed an asynchronous bridge. Serialization, deserialization, async queue. That was the tax on every interaction.
The New Architecture, which became the default in React Native 0.74, replaced this with JSI - the JavaScript Interface. JSI lets JavaScript hold direct references to native objects and call native code synchronously. No serialization. No async queue. Just a function call.
The difference is not marginal. The bridge latency that caused dropped frames during scroll and gesture handling is gone for most interactions.
Hermes, the JS engine now bundled by default, also deserves credit. Pre-compilation to bytecode means faster startup. Lower memory usage means less GC pressure. Hermes is not V8, but it is tuned specifically for the constraints of mobile devices.
The Apps That Actually Prove It
You cannot argue with production at scale.
| App | Monthly Active Users | Platform | Notable |
|---|---|---|---|
| 3 billion+ | iOS + Android | Built the framework | |
| Shopify | 2 million+ merchants | iOS + Android | Rewrote checkout in RN |
| Discord | 500 million+ | iOS + Android | Real-time messaging |
| Coinbase | 110 million+ | iOS + Android | High-frequency price updates |
| Walmart | Millions | iOS + Android | Complex ecommerce flows |
Shopify’s case is worth examining. They did not accidentally end up on React Native. They evaluated Flutter, they evaluated native development, and they chose React Native for a specific reason: they already had a large JavaScript and TypeScript engineering organization. The performance was good enough, and the developer velocity was better.
Coinbase is more impressive as a proof point. Financial apps need snappy price updates, smooth chart animations, and zero-jank order flows. If React Native could not handle that, Coinbase would have rebuilt in Swift and Kotlin. They did not.
The Honest Performance Analysis
React Native is not identical to fully native code. Here is what the gap actually looks like:
Where React Native matches native:
- Standard UI components (lists, navigation, forms)
- Network requests and data fetching
- Business logic execution
- Push notifications and background tasks
Where the gap persists:
- Complex custom animations below 60fps targets
- Heavy computational work on the JS thread
- Camera and video processing pipelines
- Games and graphics-intensive applications
The gap in the second category is real, but it is also addressable. Reanimated 3 moves animation logic to the UI thread entirely, bypassing JavaScript. Skia via react-native-skia gives you GPU-accelerated 2D graphics. Worklets let you run code synchronously on the UI thread.
The tools exist. The question is whether your app needs them.
What Developers Actually Get Wrong
The performance problems people attribute to React Native are usually caused by:
1. FlatList misuse. Not setting getItemLayout, not using keyExtractor, rendering too many items without windowing. This is fixable.
2. Re-renders. JavaScript is fast. Re-rendering a component tree 60 times a second for no reason is not. React.memo, useMemo, and useCallback are not premature optimization in React Native - they are table stakes.
3. Ignoring the Metro bundler config. Default Metro config is for development. Production builds with Hermes optimization enabled perform significantly better.
4. Images. Uncompressed images, wrong format, no caching strategy. This kills perceived performance and gets blamed on the framework.
The New Architecture Migration in Practice
Teams upgrading from the old architecture to the New Architecture report measurable improvements:
- Startup time drops 15-30% for most apps
- Scroll performance in complex lists improves noticeably
- Touch responsiveness on gesture-heavy screens becomes competitive with native
The migration is not free. Third-party libraries need to support the New Architecture, and some older ones do not. The compatibility situation in 2025 is significantly better than 2022, but you need to audit your dependencies before committing.
Flutter vs React Native in 2025
The honest comparison:
Flutter gives you Dart, a custom rendering engine, and truly identical behavior across platforms. React Native gives you JavaScript/TypeScript, native rendering, and access to the native platform’s look and feel automatically.
If you are building a design-heavy app where pixel-perfect cross-platform consistency matters, Flutter wins. If you are building a standard consumer app where native platform feel matters and you want to share code with your web team, React Native wins.
Neither answer is wrong. The question is what you are optimizing for.
Bottom Line
The “React Native can’t do native performance” argument was valid in 2018. The New Architecture with JSI, Hermes, and Reanimated 3 addresses the architectural problems that caused that reputation. Facebook, Shopify, Discord, and Coinbase do not ship performance-sensitive production apps on a framework that cannot perform. If you dismissed React Native based on old information, it is worth another look - but go in with realistic expectations about where the remaining gaps are.
Comments