DEV Community

Cover image for πŸš€ How to Upgrade Your React Native Project to the New Architecture (v0.79+)
Amit Kumar
Amit Kumar

Posted on • Edited on

πŸš€ How to Upgrade Your React Native Project to the New Architecture (v0.79+)

With the evolution of React Native, the New Architecture brings significant performance and maintainability improvements through features like TurboModules, Fabric, and C++ shared logic. Upgrading to this architecture can seem intimidatingβ€”but with the right strategy, it's achievable.

In this blog, I’ll walk you through two practical approaches to upgrading your project to the New Architecture in React Native (v0.79.3 at the time of writing), the recommended approach, the challenges I faced, and how I overcame them.


Image description


In this guide, I’ll walk you through:

  • βœ… Two practical upgrade approaches
  • πŸ› οΈ The recommended method
  • βš”οΈ Challenges I faced
  • πŸ’‘ How I solved them
  • πŸ› οΈ Solutions to Each Problem
  • βœ… Migration Checklist
  • 🚫 Common Mistakes to Avoid
  • 🎁 Final Checklist Before You Go Live

Image description


πŸ“Œ When Should You Consider Upgrading?

If your current project is within 2 to 4 versions of the latest release, upgrading is relatively safe. Otherwise, it’s better to migrate code manually to a fresh project. We’ll cover both methods.


πŸš€ From 0.71 to 0.79: My New Architecture Journey

I upgraded from React Native 0.71 to 0.79 for New Architecture support

Image description


πŸ› οΈ Approach 1: Upgrade Using React Native Upgrade Helper (Recommended for Small Version Gaps)

This method is ideal if your current version is just a few versions behind (e.g., 0.75 to 0.79).

Step 1. Update Android Studio

  • Make sure you’re using the latest stable version of Android Studio.
  • This ensures compatibility with the updated Gradle, SDKs, and React Native tooling.

Step 2. Use the React Native Upgrade Helper

Step 3. Follow the Diff Instructions Carefully

  • Pay special attention to native file changesβ€”these are critical for enabling the New Architecture.
  • Use version control to commit incrementally and rollback if needed.

Image description


πŸ“¦ Update Third-Party Dependencies

Once you’re on the latest version, update your dependencies:


Image description


βœ… Approach 2: Create a Fresh Project (Recommended for larger Version Gaps)

If your current project is outdated or complex, this is the safest and cleanest way to upgrade.

🧱 Steps to Migrate

Step 1. Create a New Project

npx @react-native-community/cli init  MyApp
Enter fullscreen mode Exit fullscreen mode

Step 2. Migrate Your Existing Codebase

Once your new React Native project is created (preferably using the latest stable version like v0.79.3), it’s time to bring your existing app logic into the new environment.

πŸ“ Step 3: Move Your src/ Folder

Start by copying the entire src directory from your old project into the root of the new project

πŸ“¦ Step 4: Sync and Install Dependencies

Now, open both the old and new package.json files side by side.

  • Carefully review the dependencies and devDependencies.
  • Instead of copying everything directly, manually install each package in the new project using the latest version and Test the app after each installation.
  • Ensure that each dependency you bring in is compatible with React Native's New Architecture.

Yes, it's manualβ€”but it's also bulletproof for both Android and iOS

βœ… Step 5: Verify It Works

After you've copied your source code and installed the updated dependencies:

  1. Clean the Android build (optional but recommended):
cd android && ./gradlew clean && cd ..

Enter fullscreen mode Exit fullscreen mode
  1. Run the app on both platforms to ensure everything is wired correctly:
npx react-native run-android
npx react-native run-ios

Enter fullscreen mode Exit fullscreen mode
  1. Watch the terminal and device logs for any errors, warnings, or compatibility issues.

πŸ’‘ Tip: If any dependency causes issues with the new architecture, check the package's documentation or GitHub issues. Some packages may still require legacy support or additional configuration to work correctly.


🧩 Challenges I Faced (And How I Solved Them)

As I migrated to the New React Native Architecture, I ran into some unexpected issues that weren’t immediately obvious. Here's a breakdown of the most common ones β€” and how I resolved each.

πŸ”₯Common Issues (React Native New Architecture)

πŸ’‘ Note: I’ve included dedicated solution links at the end of this section for deeper dives.


🌐1. Translation failed

The old way of handling translations using i18n-js no longer works reliably in the new architecture.

βœ… The recommended and stable alternative is react-i18next, which is modern, flexible, and actively maintained.

Image description


βš›οΈ2. Redux not working

Redux can break in the new architecture, especially if you're using older packages like 'redux' and 'redux-thunk'.

The new approach uses the modern Redux Toolkit:

import { configureStore } from "@reduxjs/toolkit";

Enter fullscreen mode Exit fullscreen mode

πŸ” You don’t need to refactor your entire Redux logic.
Just update your store configuration. Actions, reducers, and selectors will continue to work as before.

Image description

Replace this


import {createStore, applyMiddleware, compose} from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './rootReducer';
const composeStore = compose(applyMiddleware(thunk));
export const appStore = createStore(rootReducer, composeStore);
const store = () => {
  return appStore;
};

export default store;



Enter fullscreen mode Exit fullscreen mode

With this


import {configureStore} from "@reduxjs/toolkit";
import rootReducer from "./rootReducer";

export const appStore = configureStore({
  reducer: rootReducer,
  devTools: true,
  middleware: getDefaultMiddleware => getDefaultMiddleware(),
});

const store = () => {
  return appStore;
};

export default store;


Enter fullscreen mode Exit fullscreen mode

After integrating this, You might getting this redux error

Image description

Fix:


...
middleware: getDefaultMiddleware =>
    getDefaultMiddleware({
      serializableCheck: false,
    }),
...

Enter fullscreen mode Exit fullscreen mode

πŸ“3. Absolute imports fail

If you’re using absolute import paths like @abc/screens defined in package.json, you may find they don’t resolve properly in the new architecture setup.

πŸ› οΈ In my case, I had to temporarily fall back to relative paths like:

import MyScreen from '../../screens/MyScreen';

Enter fullscreen mode Exit fullscreen mode

βœ… Later, I fixed this properly by configuring babel.config.js and tsconfig.json.
(I'll walk through that fix in a later section.)


4. Bridging fails

With the New Architecture, React Native introduces a bridge-less communication model.

This means:

  • Legacy native modules written using the old bridge might stop working.
  • You must migrate to TurboModules, define spec files, and rely on codegen for typed module integration.

While it’s more strict, it brings better performance, type safety, and native interoperability.


5. GIFs Fail to Load (New Architecture Compatibility)

If your app uses GIFs, they may not work properly with the New Architecture (Fabric/TurboModules).

Fix:

Add the Fresco GIF dependency to app/build.gradle:

implementation 'com.facebook.fresco:animated-gif:3.6.0'

Enter fullscreen mode Exit fullscreen mode

⚠️ Note: If 3.6.0 is not compatible, use the latest stable version of Fresco instead.


6. SafeAreaView Overlaps Status Bar on Android 15+ (Edge-to-Edge Issues)

If your app's content overlaps the status bar or edge-to-edge display isn't working properly on Android 15+, try this solution.

Fix:
Add this line to your Android /android/app/src/main/res/values/styles.xml

<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>

Enter fullscreen mode Exit fullscreen mode

πŸ› οΈ Quick Reference Table

Problem Solution
🌐 i18n Translations not working Multi-language Setup Guide
βš›οΈ Redux not working Redux Integration Tutorial
πŸ“ Absolute imports fail Absolute Imports Fix
πŸ”Œ Native Bridging fails TurboModules Guide β€’ C++ Guide
πŸ–ΌοΈ GIFs not loading implementation 'com.facebook.fresco:animated-gif:3.6.0'
πŸ–ΌοΈ Layout overlapping <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>

πŸ”§ Platform-Specific Challenges (Android & iOS)

While migrating to the New Architecture, I ran into some platform-specific issues β€” especially on Android and iOS. Below are the key problems I faced, and how I resolved them.


πŸ“¦ APK Size Increased

After upgrading to the New Architecture, I noticed the APK size increased significantly:

Version APK Size
πŸ§“ Before Upgrade 112 MB
πŸ†• After Upgrade 140 MB

However, with a simple tweak, I was able to bring it down drastically β€” my final APK was just 65 MB.

⚠️ Important: After applying this change, make sure to test your app’s performance and launch time thoroughly.
There have been community discussions mentioning that setting android:extractNativeLibs="true" might slightly impact launch performance.
In my case, I carefully compared app launch behavior before and after the change β€” and found no noticeable difference in performance.


βœ… Solution

Update your AndroidManifest.xml to include the following inside the <application> tag:

<application
  android:extractNativeLibs="true"
  ...
>

Enter fullscreen mode Exit fullscreen mode

This ensures unused native libraries are not bundled unnecessarily.


πŸ›‘ Proguard Build Failure

If you’re using Proguard or enabling minifyEnabled, you may see this common R8 error:

Image description


πŸ›  Fix Steps

1. Open the file:

πŸ’‘ Note: Make sure to build your release APK first β€” otherwise, the missing_rules.txt file will not be generated.

android/app/build/outputs/mapping/release/missing_rules.txt

Enter fullscreen mode Exit fullscreen mode

2. Copy the suggested rules from that file.
3. Paste them into android/app/proguard-rules.pro:

# Added from R8 missing rules
-keep class com.example.SomeClass { *; }
-dontwarn com.example.OtherClass

Enter fullscreen mode Exit fullscreen mode

πŸ“Œ If you already have custom Proguard rules, merge them carefully to avoid breaking your release build.

πŸ“ Reference: React Native GitHub Issue #36505


🍏 iOS-Specific Setup Issues

While running pod install, I ran into the following CocoaPods and build error:

Image description


βœ… Solution

Edit your Podfile as follows:

platform :ios, '15.1'          # Add this
use_modular_headers!          # Add this

target 'YourAppName' do
  config = use_native_modules!

  # β€”β€”β€” Add this block β€”β€”β€”
  $RNFirebaseAsStaticFramework = true
  use_frameworks! :linkage => :static

  pod 'Firebase', :modular_headers => true
  pod 'FirebaseCoreInternal', :modular_headers => true
  pod 'GoogleUtilities', :modular_headers => true
  pod 'FirebaseCore', :modular_headers => true
  # β€”β€”β€” End β€”β€”β€”

  use_react_native!(...)
end

Enter fullscreen mode Exit fullscreen mode

Then run:

cd ios && pod install

Enter fullscreen mode Exit fullscreen mode

This ensures compatibility with Firebase and other modular dependencies when using the new architecture.


πŸ“ My Recommendation:

If your current version is significantly outdated or your project is complex, start with a fresh React Native project and migrate your code manually. It may take more time initially, but the result is a leaner, faster, and more future-proof application.

If you're planning to upgrade to the New Architecture, here's what I suggest based on your current version gap:


πŸ” Scenario 1: Large Version Gap (e.g., RN 0.68 β†’ 0.79)

🧠 Recommendation:
If your current React Native version is significantly outdated, it's best to:

πŸ†• Start fresh with a clean React Native project, and manually migrate your screens, logic, and assets.

This ensures a smoother transition without the risk of legacy code breaking under the new system.

Yes, it takes a bit more time β€” but it pays off with a cleaner and more maintainable codebase.


πŸ”„ Scenario 2: Small Version Gap (e.g., RN 0.75 β†’ 0.79)

βš™οΈ Recommendation:
If the gap between your current version and the latest one is just 2–4 versions, you can safely use the React Native Upgrade Helper or the official upgrade tool.

These tools help you compare file-by-file changes and apply only the necessary updates β€” saving time while avoiding full rewrites.

✍️ Choose the upgrade approach that matches your project’s stability and complexity. Don’t rush it β€” test thoroughly before shipping!


βœ… Migration Checklist & Tools

Here’s a handy checklist and toolset to help guide your upgrade to the React Native New Architecture:

🧰 Tools You'll Need

Tool Purpose
πŸ”„ Upgrade Helper Compare file-by-file differences between RN versions
βš™οΈ React Native CLI Create fresh React Native projects
πŸ“¦ React Native Directory Check if libraries support the New Architecture (TurboModules/Fabric)

πŸ“ Migration Checklist

  • πŸ” Audit your current React Native version and all dependencies
  • πŸ“± Update to the latest Android SDK and compile/target versions
  • πŸ€” Decide: Upgrade in-place or create a fresh new RN project
  • πŸ›  Update your Podfile, build.gradle, and overall project configs
  • πŸš€ Enable the New Architecture (app.build.gradle + Podfile flags)
  • 🧬 Migrate native modules to TurboModules (if applicable)
  • 🌐 Switch from i18n-js to react-i18next for translations
  • βš›οΈ Update Redux store using @reduxjs/toolkit
  • πŸ“ Fix absolute imports via babel.config.js and tsconfig.json
  • πŸ“¦ Optimize APK size using android:extractNativeLibs="true"
  • πŸ§ͺ Test app performance and launch time thoroughly
  • πŸ” Fix Proguard errors using missing_rules.txt
  • βœ… Validate both APK and IPA builds before production release

🚫 Common Mistakes to Avoid

❌ Mistake ⚠️ Why It's a Problem βœ… What To Do
Skipping clean builds Cached files can cause unexpected crashes or outdated behavior Run npx react-native clean and ./gradlew clean
Ignoring native code Legacy native modules may break under the New Architecture Refactor to TurboModules using proper spec.ts and bridging format
Not updating Android/iOS versions Incompatible SDK versions can break builds Use compileSdkVersion = 34 (or latest) and platform :ios, '15.1'
Forgetting New Architecture flags TurboModules/Fabric won’t be enabled just by upgrading Enable manually in gradle.properties, build.gradle, and Podfile
Using outdated libraries Many libraries are not compatible with the New Architecture Check reactnative.directory before installing any library
Ignoring Proguard + release builds App might crash only in release mode without clear error logs Test release builds early and copy missing rules from missing_rules.txt into proguard-rules.pro
Testing only on emulators Emulators don’t reflect real performance, launch time, or device-specific bugs Always test on real devices (both Android & iOS)
Skipping the docs Missing official changes can cause implementation mistakes Follow React Native New Architecture docs

⚠️ Note:

The issues and solutions I’ve shared are based on my specific project setup.
You might face different roadblocks depending on your architecture, packages, and integrations.

Always validate each solution with your own setup, and don’t hesitate to tweak things accordingly.


🎁 Final Checklist Before You Go Live:

  • βœ… Clean build (npx react-native clean & ./gradlew clean)
  • βœ… New Architecture flags enabled (TurboModules, Fabric)
  • βœ… Native modules migrated or verified
  • βœ… Absolute imports working via Babel & tsconfig
  • βœ… Translations updated (i18n-js β†’ react-i18next)
  • βœ… Redux store migrated to @reduxjs/toolkit
  • βœ… Real device testing (Android + iOS)
  • βœ… Proguard rules added from missing_rules.txt
  • βœ… APK & IPA thoroughly tested
  • βœ… Android/iOS SDK versions updated

πŸ™‹ Need Help?

Let me know in the comments if you’re stuck or hit something weird β€” I’d love to help or even update this guide to cover your case.


πŸ”„ Your Turn!

Have you upgraded your React Native version yet?

πŸ‘‰ Share the challenges you faced and how you solved them in the comments.
Let’s build a helpful community knowledge base together! πŸ’¬πŸ‘₯


🎯 Final Thoughts

Upgrading to the New Architecture isn’t just about bumping a version β€” it’s a complete shift in how React Native communicates with native code.

If you're aiming for long-term stability, performance, and scalability, embracing this architecture with a clean slate may be the best move.


πŸ”š Wrapping Up

Migrating to the New Architecture in React Native isn’t just about flipping a switch β€” it’s about adopting a modern, more efficient way to build native apps with better performance, maintainability, and future compatibility.

Yes, it comes with its fair share of gotchas, but once you overcome those, the rewards are worth it πŸš€

Top comments (0)