React Native Performance Optimization: 10 Tips

Daniyal Alam
CEO & Founder

React Native lets a single JavaScript codebase run on both iOS and Android — but without careful optimisation the result can feel sluggish compared to a native app. After shipping 12 React Native apps at DanixSoft, we have catalogued the 10 changes that reliably turn a laggy prototype into a smooth, production-grade experience.
1. Use the New Architecture (Fabric + JSI)
React Native's New Architecture eliminates the asynchronous bridge that was the root cause of most performance issues before 2024. Enable it in your android/gradle.properties and iOS project settings. Every new DanixSoft project ships with the New Architecture enabled from day one.
2. Memoize expensive components with React.memo
Re-renders are the silent killer in React Native. Wrap components that receive complex objects as props in React.memo and ensure parent components do not create new object references on every render. Use useCallback for handler functions passed as props.
3. Use FlatList instead of ScrollView for lists
ScrollView renders every child at once. For any list longer than 10 items, switch to FlatList with keyExtractor, getItemLayout (if items have fixed height), and windowSize={5}. This reduces memory usage by 60–80% for long lists.
4. Offload heavy computation to a worker thread
JavaScript runs on a single thread in React Native. Image processing, data transformation, and encryption should run in a native module or a library like react-native-workers. The UI thread should only handle rendering.
5. Lazy load screens with React Navigation
Configure React Navigation's lazy: true on tab navigators. Screens are only mounted when first visited, reducing initial bundle execution time by 30–50% on cold launch.
6. Optimise images with FastImage
Replace the built-in Image component with react-native-fast-image. It uses SDWebImage (iOS) and Glide (Android) under the hood, providing disk caching, progressive loading, and priority queuing. Image rendering performance typically improves by 2–3×.
7. Avoid anonymous functions in JSX
Every anonymous function in a render creates a new reference, forcing child re-renders. Define handlers outside the return statement or use useCallback.
8. Profile with Flipper and the React DevTools Profiler
You cannot optimise what you have not measured. Flipper's performance plugin shows native thread FPS, memory, and CPU in real time. The React DevTools Profiler highlights which components are re-rendering and why.
9. Use Hermes as the JavaScript engine
Hermes is a JavaScript engine optimised for React Native. It pre-compiles JavaScript to bytecode at build time, cutting TTI (time to interactive) by up to 40% on lower-end Android devices. It is enabled by default in new React Native projects — verify it is not accidentally disabled.
10. Bundle split with Metro and Async Storage
Use Metro's RAM bundle format for large apps. Modules are loaded on demand rather than all at startup. Pair this with background prefetching of data your users are likely to need next, using a simple priority queue backed by AsyncStorage.
Implementing all 10 tips consistently is the difference between an app that gets 2-star reviews for slowness and one that gets featured by Apple or Google. If you need a performance audit of an existing React Native app, contact the DanixSoft team — we routinely reduce cold-start times from 4+ seconds to under 1.5 seconds.