All articles
Mobile DevelopmentMay 18, 2026 7 min read

React Native New Architecture in 2026: When to Migrate and When to Wait

The New Architecture is the default in fresh React Native projects, but legacy apps face a real migration cost. Here's how we decide when to pull the trigger and when to delay.

React Native New Architecture in 2026: When to Migrate and When to Wait

By 2026, the React Native New Architecture isn't a science project anymore. It's the default for new apps created with the community CLI and Expo SDK 52+, and Meta has stopped shipping meaningful improvements to the legacy bridge. The question on most teams' minds isn't if — it's whether next sprint, next quarter, or next year is the right time to migrate a production app that's been humming along on the old paths.

We've shipped a handful of these migrations now, ranging from a 40-screen e-commerce app to a fintech app with native modules glued in by three different agencies over four years. The honest answer: migration is rarely as painful as the Twitter horror stories suggest, but the variance is enormous and the failure modes are deeply unglamorous.

What the New Architecture actually changes

If you've been heads-down shipping features, here's the one-paragraph refresher. The legacy architecture relied on an asynchronous JSON bridge between JavaScript and native code. The New Architecture replaces it with three things working together: Fabric (a new rendering system that talks to the native UI layer synchronously via C++ shadow nodes), TurboModules (lazy-loaded native modules with JSI bindings instead of bridge serialization), and Codegen (TypeScript/Flow specs that generate the C++ glue at build time).

The practical implications:

  • Synchronous calls between JS and native are possible, which matters for things like measuring layout, scroll handlers, and gesture libraries.
  • Native modules load on first use rather than at startup, so cold start improves on apps with many integrations.
  • The bridge serialization tax on every prop change is gone, which mostly shows up in animation smoothness and large lists.
  • Bridgeless mode (default in RN 0.74+) removes the bridge entirely, including for the dev tools that relied on it.

None of this matters if your app feels fine today. Which brings us to the real question.

Who should migrate now

We put apps into three buckets.

Migrate now

  • You're on React Native 0.74 or newer and Expo SDK 51+. The further you are from the head, the worse the upgrade gets, regardless of New Arch.
  • You depend on libraries that have already dropped legacy support — Reanimated 4, the current Gesture Handler, Skia, and several Shopify libraries are New Arch-only or strongly recommend it.
  • You're seeing measurable performance problems in long lists, animations, or apps with heavy native integrations like maps and camera.
  • You ship a brand surface where 60fps actually matters — e-commerce browsing, social feeds, anything with parallax or shared element transitions.

Migrate in the next two quarters

  • You're on RN 0.72 – 0.73 and broadly current on libraries. You can plan a focused upgrade sprint without it derailing the roadmap.
  • You have one or two custom native modules and they're maintained in-house. Codegen migration is annoying but tractable.
  • You're already planning a major refactor — a redesign, a navigation library swap, or a state management overhaul — and can fold the migration into that work.

Wait

  • You're on RN 0.68 or older. Migrate to a recent legacy version first; jumping straight to New Arch from an ancient base is how teams burn a quarter.
  • You depend on an unmaintained native module that's load-bearing — a payment SDK wrapper, a niche Bluetooth library, an analytics SDK with a custom native side. Fix that dependency first.
  • The app is in maintenance mode and the business case for any engineering investment is thin. The legacy architecture will keep working for years; it just won't get faster.

What actually breaks during migration

The official docs make it sound like you flip a flag and run. In our experience, the time sinks cluster around four areas.

Third-party native modules

Libraries that haven't shipped a Codegen spec will either crash on startup in bridgeless mode or fall back to the interop layer, which mostly works but adds its own quirks. The interop layer is a genuine gift from the React Native team — it lets legacy modules run under the New Architecture without rewriting them — but it doesn't cover everything. Custom view managers and modules that use the old RCTBridge patterns are the usual offenders.

Before migrating, audit every native dependency. Run something like this against your lockfile:

npx react-native config | jq '.dependencies | to_entries[] | select(.value.platforms.ios.codegenConfig == null and .value.platforms.android.codegenConfig == null) | .key'

Any library without Codegen config is a candidate for trouble. Cross-reference each one against its GitHub repo. If the maintainer hasn't merged a New Arch PR by 2026, that library is a risk regardless of what the interop layer does.

Your own native code

If you have hand-written native modules, you need a Codegen spec. The good news: the spec is a TypeScript file and the generator handles most of the boilerplate. The bad news: every method signature has to be expressible in the spec's type system, which is stricter than JavaScript's. Methods that returned any, accepted variadic args, or did clever overloading need rewriting.

A minimal spec looks like this:

// specs/NativeBiometric.ts
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
  isAvailable(): Promise<boolean>;
  authenticate(reason: string): Promise<{
    success: boolean;
    error?: string;
  }>;
}

export default TurboModuleRegistry.getEnforcing<Spec>('NativeBiometric');

The getEnforcing call throws at module load if the native side isn't registered, which is the behaviour you want. Silent fallbacks during migration are how bugs end up in production.

Layout and measurement

Fabric handles layout synchronously, which exposes bugs that the async bridge papered over. Code that called measureInWindow and assumed the result arrived after the next frame can now race. Code that mutated layout during a render pass — which was never legal but often worked — now reliably misbehaves. We've seen modal libraries, tooltip positioning, and custom keyboard avoidance components all need touch-ups.

Dev tools and debugging

Flipper is dead. The new debugging story is React Native DevTools, which is genuinely good but different. If your team has muscle memory and custom Flipper plugins, budget time to rebuild that workflow.

A migration checklist that survived contact with reality

This is the rough order we work through on a production app.

  1. Get current on legacy first. Upgrade React Native and all dependencies to the latest version that still supports the old architecture. Ship that to production. Stabilise.
  2. Audit native dependencies. Build a spreadsheet. New Arch ready, interop-compatible, or blocker — pick one for each.
  3. Replace blockers. This is usually 60% of the total effort. Don't skip it.
  4. Migrate custom native modules to TurboModules with Codegen specs. Keep the old module files around behind a feature flag until QA signs off.
  5. Flip the flag in a feature branch. On Expo, this is the newArchEnabled field in app.json. On bare RN, it's the RCT_NEW_ARCH_ENABLED env var for the iOS pod install and a gradle property on Android.
  6. Run the full app through QA on physical devices. Simulators hide a surprising amount of layout weirdness.
  7. Ship to internal testers via TestFlight and Play Console internal track for at least a week before public rollout.
  8. Stagger the production rollout. 5%, then 20%, then 100% over a week, watching crash-free session rates.

When native still wins

The New Architecture narrows the gap with Swift and Kotlin, but doesn't close it. If your app is built around camera processing, real-time audio, AR, or anything that touches the GPU at high frequency, the cost of routing through JSI is still measurable. We've moved exactly one client off React Native in the last two years, and it was a video-editing app where the team had outgrown the abstraction. That decision should be driven by your product surface, not by general anxiety about cross-platform.

For everything else — most e-commerce, most B2B, most content apps, most fintech — React Native with the New Architecture is the cheapest path to a good mobile app in 2026. The migration is a real cost, but it's a one-time cost, and the alternative is being stranded on a deprecated runtime in 18 months.

Where we'd start

If you're staring at this on a Monday morning, do two things before lunch. First, run npx react-native info and write down your current versions. Second, open every native dependency in your package.json and check whether the latest version supports the New Architecture. That two-hour audit will tell you which bucket you're in better than any blog post can. If the audit looks scary, we help teams plan these migrations without burning a quarter on yak-shaving.

#React Native#Expo#Mobile Development#Architecture

Want a team like ours?

72Technologies builds production software for the kind of teams who actually read this blog.

Start a project
React Native New Architecture: Migrate or Wait in 2026 · 72Technologies