TechnicalApril 2026 · 12 min read

React Native Performance: 10 Fixes That Actually Move the Needle

Most React Native performance advice is 2019-era noise. These are the 10 fixes that actually matter in 2026 — library swaps, production flags, and memoization patterns that move the needle on real Expo apps. Ordered roughly by impact per minute of effort.

Before you optimize

Measure first. Turn on the React Native DevTools performance monitor. Profile on a real mid-tier Android device (not your iPhone 15 Pro Max). Identify the actual bottleneck. Fix what’s slow, not what feels slow.

1. Swap FlatList for FlashList

Shopify’s FlashList is a near-drop-in replacement that’s dramatically faster for long lists. Memory usage is lower, scroll stays at 60fps on mid-tier devices, and mixed-size items render far more smoothly. Install @shopify/flash-list, change the import, add an estimated item size.

2. Use MMKV instead of AsyncStorage

react-native-mmkv is roughly 30x faster than AsyncStorage and supports synchronous reads. For any app with local state the user expects to see instantly (list of tasks, cached profile, feature flags), switching to MMKV removes visible jank on app open. AsyncStorage should be a fallback, not the default.

3. Use Reanimated over the legacy Animated API

react-native-reanimated runs animations on the UI thread, so they stay smooth even when the JS thread is busy. The legacy Animated API runs on the JS thread and stutters during work. Any gesture-driven animation, complex transition, or layout animation should be on Reanimated in 2026.

4. Use expo-image with caching

expo-image is the 2026 default — faster decoding, better memory behavior, and built-in disk caching. Replace the built-in Image component for anything network-loaded. Set cachePolicy="memory-disk" and contentFit explicitly.

5. Memoize heavy list rows

Each row re-render costs real time on mid-tier devices. Wrap row components in React.memo, pass stable callbacks via useCallback, and extract derived values with useMemo. Don’t blanket-memoize — start with the row and its immediate children. Profile to confirm the render count dropped.

6. Confirm Hermes is on in production

Hermes is now the default engine for new Expo projects. For older projects, set it explicitly:

// app.json
{
  "expo": {
    "jsEngine": "hermes"
  }
}

Also confirm EAS Build is using production (not dev) mode — dev bundles are 2–3x larger and slower.

7. Keep JSON parsing off the main render path

Parsing large JSON payloads in render functions (or even in useEffect) blocks the JS thread.JSON.parse on a 500KB response freezes the UI on mid-tier devices. Parse in a worker, stream-parse if possible, or paginate the API so responses stay small.

8. Lazy-load screens with Expo Router

Expo Router lazy-loads route groups by default, but you still want to split heavy libraries (charts, video players, PDF viewers) into dynamic imports so they don’t load on every app start. Use React.lazy() for rarely-used screens and watch your time-to-interactive.

9. Defer work with InteractionManager

When you navigate to a new screen, the transition animation runs on the main thread. Any heavy work during that window (data fetching, sync, cache reconciliation) causes visible stutter. Wrap it in InteractionManager.runAfterInteractions(() => ...) to let the animation complete first.

10. Strip dev-only code from production

Dev-only imports (Reactotron, logging libs, debug UIs) should not ship. Check via:

  • Wrap dev imports in if (__DEV__) {}.
  • Audit bundle size with npx expo export --platform ios and inspect the output.
  • Check for stray console.log calls — they slow Hermes measurably in tight loops.

Tools to profile before and after

  • React Native DevTools — built-in performance monitor and profiler in 2026.
  • Flipper (if still used) — network, layout, and React tree inspection.
  • Sentry — production performance traces and slow-render detection.
  • Xcode Instruments — for deep iOS profiling.
  • Android Studio Profiler — for Android-specific work.

AI-generated apps: the default audit

After generating an app via ShipNative or similar, run through this quick audit: (1) replace FlatList with FlashList, (2) add expo-image for network images, (3) confirm Hermes is on, (4) memoize any screen that renders 20+ items. That’s usually enough to take the app from “works” to “feels great.”

Frequently Asked Questions

Where do I start if my app feels slow?

Measure first. Install React Native DevTools, turn on the Performance Monitor, and identify whether the problem is list rendering, animations, image loading, or startup. Fixing the wrong thing is the #1 time sink. Most "slow" apps in 2026 are slow lists, slow images, or JS work on the main thread.

Does Hermes really help?

Yes. Hermes reduces startup time and memory usage significantly vs JavaScriptCore. In 2026 it's the default for new Expo projects. If you're on an older project and still on JSC, switch — it's a one-line change in app.json and typically gives 20–30% startup improvement.

Should I use FlashList instead of FlatList?

Almost always, yes. FlashList (from Shopify) is a drop-in replacement that's dramatically faster for long lists, especially with mixed content sizes. The only reason to stick with FlatList is if your list is under 20 items and never scrolls much.

Is optimization worth it before I have users?

Usually no. Ship first, profile second. Premature optimization in React Native is a time sink. That said, use FlashList, expo-image, MMKV, and Reanimated from day one — they're defaults, not optimizations. Save the deeper work for when profiling tells you where it's needed.

Does AI-generated code need performance review?

Yes. AI builders optimize for correctness and readability, not always peak performance. Expect to swap FlatList for FlashList, add memoization to heavy screens, and sometimes replace Animated with Reanimated. Treat AI output as "close to ready" and audit the fast paths.

Offline-First React Native

Local-first is one of the biggest perceived-performance wins.

Read guide →

Supabase vs Firebase 2026

Backend choice affects perceived performance too.

Read comparison →

Ship a real React Native app today

Describe, preview, and export Expo code — free to start.

Build with ShipNative →