React Native New Architecture is the biggest evolution of the framework since the original bridge. In 2025, teams move to Fabric (the new renderer) and TurboModules (the new native module system) to unlock smoother rendering, lower latency, and modern React patterns. This guide explains how Fabric and TurboModules work, when to migrate, and a step-by-step plan to enable the new architecture safely—plus real code samples, debugging tips, and a two‑sprint rollout blueprint.
React Native New Architecture: Fabric renderer + TurboModules on top of JSI.
React Native New Architecture: Fabric & TurboModules explained
The new architecture replaces the classic Batched Bridge with a JSI-based runtime that lets JavaScript and native code talk through direct, synchronous and asynchronous calls without JSON serialization overhead. Two pillars make this possible:
Fabric – a modern renderer that integrates with Concurrent React, streamlines layout/mounting, and reduces UI latency.
TurboModules – a native module system built on JSI and Codegen for fast calls and type‑safe interfaces.
Together, they improve startup time, reduce frame drops during heavy interactions, and simplify the path to advanced React features.
Old Bridge (batched, JSON) vs New Architecture (JSI, direct calls, codegen).
What changed vs the classic bridge
No JSON serialization tax: JSI exposes native objects to JS directly, reducing overhead.
Direct method calls: JS ↔︎ Native interactions can be synchronous or async where appropriate.
Type‑safe boundaries: Codegen generates native stubs from your TS/Flow specs.
Renderer re-think: Fabric integrates with React’s concurrent features for more responsive UI updates.
Better memory and startup profiles: Less glue code and faster module loading in production builds.
How Fabric works (renderer fundamentals)
Fabric is a cross‑platform renderer that reimplements how React Native constructs and updates native views.
Concurrent React friendly: Better interruptible work and prioritization for smoother gestures and transitions.
Shadow tree + Mounting: Fabric builds a platform-agnostic shadow tree and performs efficient mount/unmount operations.
Layout: Still driven by Yoga; Fabric streamlines how layout results map to native views.
Bridgeless-ready: Fabric does not depend on the old bridge. Apps can run in a bridgeless mode where supported.
Fabric pipeline: React reconciliation → shadow tree → mount/swap with minimal work.
How TurboModules work (JSI + Codegen)
TurboModules are native modules defined by an interface (TS/Flow) that codegen turns into platform bindings.
JSI host objects: Native implementations are exposed to JS as first‑class objects—no bridge marshalling.
Lazy loading: Modules can initialize on first use for faster startup.
Codegen: Generates strongly‑typed headers and source for iOS/Android from your JS spec.
Hermes synergy: With Hermes as the default engine in most setups, TurboModules get low‑latency calls.
Define a TS spec → run codegen → implement native methods → use from JS.
Code example: a minimal TurboModule (TypeScript → native)
// iOS (ObjC/Swift) - MyDeviceInfoSpec-generated files provide interfaces
// Android (Kotlin) - Codegen creates the interface to implement
// Implement getDeviceName() and getConstants() using platform APIs
3) Use from JS:
import MyDeviceInfo from './MyDeviceInfo';
const { appName } = MyDeviceInfo.getConstants();
const name = await MyDeviceInfo.getDeviceName();
Code example: a Fabric component (codegenNativeComponent)
1) Define the component interface:
// MyBadgeNativeComponent.tsx
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
import type { ViewProps } from 'react-native';
type Props = ViewProps & {
label: string;
color?: string;
};
export default codegenNativeComponent<Props>('MyBadge');
2) Implement the platform view with the generated interfaces (Android/iOS). Fabric mounts/unmounts it like any other RN view with type‑safe props and events.
Migration strategy (2025) in 8 steps
Every codebase is different. Treat this as a safe default plan; always verify against the official docs for your RN version.
Upgrade React Native to a version that supports the new architecture well in your ecosystem. Read the RN release notes for breaking changes.
Turn on the flags in your app template (platform‑specific):
Android: set newArchEnabled=true in gradle.properties.
iOS: enable new architecture via build settings or your Pod configuration according to RN docs.
Adopt Hermes if you haven’t already. Hermes is the default engine in modern RN templates and pairs well with JSI.
Run Codegen. Ensure your package scripts and Pod install steps run RN Codegen for components/modules.
Migrate native modules on the hot path first. Convert high‑traffic Bridge modules into TurboModules with TS specs.
Replace legacy UI pieces that rely on imperative Bridge lifecycles with Fabric components. Start with isolated widgets.
Profile and fix regressions. Use Flipper, React DevTools Profiler, and platform tools (Xcode Instruments, Android Studio Profiler) to measure render commits, layout time, and jank.
Iterate and document. Capture patterns in your internal docs: module specs, codegen conventions, and testing strategy.
Lower interaction latency: Fewer dropped frames in high‑stress UI thanks to Fabric’s scheduling.
Faster native calls: JSI bypasses serialization; hot modules feel snappier.
Startup improvements: Lazy TurboModules defer work off the critical path.
Measure what matters:
Use React Profiler to track commits and render durations for critical flows.
Flipper for network, layout, and React performance plugins.
Platform profilers (Instruments/Android Studio) for CPU, memory, and UI thread time.
Testing & debugging in the new architecture
Unit tests: Keep component logic pure and testable; Fabric doesn’t change this.
Integration tests: Validate that TurboModules return the right shapes/types across platforms.
E2E: Tools like Detox or Appium continue to work; focus on user journeys that were janky under the bridge.
Flipper: Use modern plugins; verify no regressions when enabling bridgeless or new arch flags.
When to migrate (decision framework)
Yes now if your app suffers UI jank, relies on heavy native modules, or you’re planning big feature work that benefits from codegen and concurrent rendering.
Plan a staged pilot if you have many custom native components/modules—migrate a feature slice first.
Wait only if a critical third‑party dependency hasn’t released new‑arch support yet; track its roadmap.
Common pitfalls and how to avoid them
Forgetting codegen: Wire up scripts so Codegen runs during install/build. Breakages often trace back to missing generated files.
Mismatched types: Keep TS specs in sync with native implementations; let the compiler help you.
Global side effects in render: Clean up components so Fabric can schedule work efficiently.
Partial migrations without tests: Add targeted integration tests around migrated modules/components.
Implementation guide: your next steps this week
Create a branch and upgrade to a supported RN version in a sample app or a small feature module.
Enable new architecture flags and Hermes; run the app on both platforms.
Migrate one simple native module to a TurboModule via a TS spec and Codegen.
Build one Fabric component using codegenNativeComponent and replace an existing widget.
Profile a hot interaction (list scroll, gesture) before/after; document the delta.
Share a short internal doc: conventions for module/component specs, codegen commands, and troubleshooting.
Final recommendations
Start small and measure. Move one module and one component, then expand.
Lean on Codegen and types. Let your tooling enforce contracts.
Use Hermes + Flipper + React Profiler as your default performance toolkit.
Track third‑party library readiness; contribute fixes upstream where possible.
Disclosure: Some links are affiliate links. If you click and purchase, we may earn a commission at no extra cost to you. We only recommend tools we’d use ourselves.