React Native 0.80: New Architecture Stable
TOP 5 Feb. 5, 2026, 5:30 a.m.

React Native 0.80: New Architecture Stable

React Native 0.80 marks a pivotal moment for the framework, delivering a fully stable New Architecture that was once only available behind flags. This release brings the long‑awaited Fabric renderer, TurboModules, and the JSI bridge into production‑ready territory, promising smoother UI, faster startup, and a more native‑like experience. If you’ve been hesitant to adopt the new stack, 0.80 removes most of the uncertainty and gives you a clear migration path.

What “New Architecture” Really Means

The term “New Architecture” bundles three core innovations: Fabric, TurboModules, and the JavaScript Interface (JSI). Fabric replaces the legacy UI manager with a declarative, asynchronous rendering pipeline that minimizes bridge traffic. TurboModules turn native modules into lazily‑loaded, type‑safe objects, cutting down on initialization overhead. JSI provides a low‑level, bidirectional bridge that lets JavaScript and native code share objects directly.

Together, these pieces reduce the “bridge bottleneck” that has historically limited performance in React Native apps. The result is a UI that feels snappier, especially on complex screens with many animated elements. Moreover, the new architecture aligns React Native more closely with the underlying platforms, making it easier to integrate platform‑specific features without costly workarounds.

Fabric Renderer

Fabric introduces a new view hierarchy that is built and updated off the main thread. By batching UI changes and sending them as a single, serialized command stream, Fabric eliminates the jank caused by frequent bridge calls. It also supports incremental mounting, which means components are only rendered when they become visible, saving memory and CPU cycles.

TurboModules

TurboModules replace the classic “NativeModules” object with a proxy that lazily resolves methods the first time they are called. This lazy loading reduces startup time and memory usage, especially for large apps that import many native modules that are rarely used. TurboModules also benefit from TypeScript typings generated from native code, improving developer experience.

JavaScript Interface (JSI)

JSI is a C++‑based runtime that sits between JavaScriptCore (or Hermes) and the native side. It enables direct manipulation of native objects from JavaScript without serializing data across the bridge. This low‑level access is what makes Fabric and TurboModules possible, and it opens doors for custom native bindings that were previously impractical.

Preparing Your Project for 0.80

Before you jump into the new architecture, ensure your development environment meets the minimum requirements. React Native 0.80 requires Node ≥ 18, Xcode 15 for iOS, and Android Studio 2022.1+ for Android. Upgrading your CLI is also essential: run npm i -g react-native-cli to get the latest version.

Next, create a fresh project to experiment with the new stack. This isolates migration issues from your production codebase.


# Create a new RN project with the latest template
npx react-native@latest init MyNewArchApp --template react-native-template-typescript
cd MyNewArchApp

# Enable the New Architecture flags
npx react-native config

Open android/gradle.properties and ios/Podfile and set the following flags:


# android/gradle.properties
newArchEnabled=true
# ios/Podfile
use_new_architecture!()

Run pod install for iOS and ./gradlew assembleDebug for Android to verify the build succeeds. If you encounter errors, double‑check that you’re using the latest versions of CocoaPods (≥ 1.12) and Gradle (≥ 7.5).

Migrating a Legacy Component to Fabric

Let’s take a common UI component—a custom card with an image, title, and action button—and migrate it to Fabric. The legacy implementation uses View and TouchableOpacity with a lot of inline styles, which can cause unnecessary re‑renders.

First, rewrite the component using React.memo and the new useFabricRef hook (available via @react-native-fabric).


import React, { memo } from 'react';
import { Image, Text, Pressable, View } from 'react-native';
import { useFabricRef } from '@react-native-fabric';

const Card = memo(({ title, imageUrl, onPress }) => {
  const viewRef = useFabricRef();

  return (
    <View ref={viewRef} style={styles.card}>
      <Image source={{ uri: imageUrl }} style={styles.image} />
      <Text style={styles.title}>{title}</Text>
      <Pressable onPress={onPress} style={styles.button}>
        <Text style={styles.buttonText}>Learn More</Text>
      </Pressable>
    </View>
  );
});

export default Card;

Notice how the component is now a pure functional component wrapped in memo. The useFabricRef hook registers the view with Fabric, allowing it to be updated off the main thread. This pattern dramatically reduces the number of bridge calls during state changes.

Pro tip: Always wrap UI‑heavy components with React.memo when using Fabric. It prevents unnecessary diff calculations and lets Fabric batch updates more efficiently.

Leveraging TurboModules for Native Features

Suppose your app needs a high‑performance barcode scanner. The legacy approach would expose a native module via NativeModules.BarcodeScanner, which loads at app startup. With TurboModules, you can defer loading until the scanner screen is actually opened.

First, define the native interface in TypeScript. The react-native-tscodegen tool will generate the corresponding C++ bindings automatically.


import { TurboModule, TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
  startScanning(): Promise<string>; // Returns scanned value
  stopScanning(): void;
}

export default TurboModuleRegistry.getEnforcing('BarcodeScanner');

On the native side (Android), implement the module using the new TurboModule API:


package com.myapp.modules;

import com.facebook.react.turbomodule.core.interfaces.TurboModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.Promise;

public class BarcodeScannerModule implements TurboModule {
  private final ReactApplicationContext reactContext;

  public BarcodeScannerModule(ReactApplicationContext context) {
    this.reactContext = context;
  }

  public void startScanning(Promise promise) {
    // Initialize camera and start scanning
    // Resolve promise with result when a code is read
  }

  public void stopScanning() {
    // Release camera resources
  }
}

Now, use the module in your React component. Because it’s lazily loaded, the native code only initializes when the user navigates to the scanner screen.


import React, { useEffect } from 'react';
import { View, Text } from 'react-native';
import BarcodeScanner from './BarcodeScannerTurboModule';

const ScannerScreen = () => {
  useEffect(() => {
    BarcodeScanner.startScanning().then(code => {
      console.log('Scanned:', code);
    });

    return () => {
      BarcodeScanner.stopScanning();
    };
  }, []);

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text>Point your camera at a barcode</Text>
    </View>
  );
};

export default ScannerScreen;
Pro tip: Keep TurboModules small and focused. A module that does one thing well is easier to lazy‑load and test, and it reduces the memory footprint of your app.

Real‑World Use Cases That Shine with the New Architecture

1. Complex List Views – Apps like social feeds or e‑commerce catalogs often render thousands of items with images, animations, and dynamic heights. Fabric’s off‑main‑thread layout calculation paired with FlashList (which now supports Fabric natively) yields smoother scrolling and lower CPU spikes.

2. Augmented Reality (AR) – AR experiences require rapid sensor data processing and frequent UI updates. By using JSI to share sensor buffers directly with JavaScript, you can avoid the 30‑ms round‑trip latency that previously made frame‑perfect AR challenging.

3. Real‑time Collaboration – Collaborative editing tools need low‑latency state synchronization. With TurboModules handling WebSocket connections natively and Fabric updating the UI asynchronously, you can achieve near‑instantaneous UI reflection of remote changes.

Performance Benchmarks

Several community benchmarks compare RN 0.79 (legacy) with RN 0.80 (New Architecture). On a mid‑range Android device (Pixel 5), a screen with 120 animated list items dropped from 45 fps to a steady 60 fps after migration. Startup time improved by roughly 250 ms thanks to lazy TurboModules.

iOS showed similar gains: a complex onboarding flow went from 1.8 s to 1.4 s launch time. Memory usage decreased by 12 % because Fabric discards off‑screen views earlier, and TurboModules free unused native resources on demand.

Pro tip: Use the react-native-performance library to capture frame timings before and after migration. This data helps you quantify gains and identify any regressions early.

Testing and Debugging with the New Architecture

Testing remains largely unchanged, but there are a few new considerations. The react-test-renderer works out of the box with Fabric components, but you may need to mock JSI modules that interact with native code. The jest-mock-jsi package simplifies this by providing a JS‑side stub for JSI objects.

For debugging UI issues, the new Flipper plugins include a “Fabric Inspector” that visualizes the native view hierarchy and shows which components are rendered off the main thread. This is invaluable when hunting down layout thrashing.

Best Practices for a Smooth Migration

  • Enable feature flags early. Turn on newArchEnabled in a separate branch to catch compile‑time errors before they hit production.
  • Incrementally adopt. Migrate one screen at a time, starting with the most performance‑critical ones.
  • Keep native code modular. Small TurboModules are easier to test and lazy‑load.
  • Monitor bundle size. Fabric introduces some runtime overhead; use source-map-explorer to keep an eye on growth.

Remember that the new architecture is not a silver bullet for all performance problems. Profiling remains essential; sometimes the bottleneck lies in business logic rather than rendering.

Future Roadmap and Community Support

The React Native core team plans to deprecate the legacy bridge in a future major release, making the New Architecture the default. Ongoing work includes tighter integration with Hermes for JSI, improved TypeScript generation for TurboModules, and first‑class support for React Server Components on mobile.

The community has already contributed plugins that leverage JSI for custom animations, native cryptography, and even machine‑learning inference. Keeping an eye on the react-native-community GitHub org will help you discover libraries that are built with the new stack in mind.

Conclusion

React Native 0.80 finally delivers a production‑ready New Architecture, turning years of experimental features into a stable, performant foundation. By embracing Fabric, TurboModules, and JSI, you can unlock smoother UI, faster startup, and more native‑level flexibility. The migration path is well‑documented, and the ecosystem is rapidly catching up with compatible libraries.

Start by enabling the new flags in a sandbox project, experiment with a few components, and measure the impact with the tools mentioned above. When the numbers speak for themselves, roll the changes out to your main codebase. With the New Architecture in place, your React Native apps will be better positioned to meet the demands of modern mobile experiences.

Share this article