DEV Community

Cover image for Migrating a Native App to React Native? Here’s How Expo Can Help
Chris Lojniewski for Pagepro

Posted on • Originally published at pagepro.co

Migrating a Native App to React Native? Here’s How Expo Can Help

Migrating Native App to React Native with Expo

Shopify’s migrating native app to React Native led to an 86% code unification across platforms, drastically cutting down development time and eliminating 1.8 million lines of redundant code. Let’s face it: it’s not just a small improvement—it’s a game-changer for mobile teams looking to scale efficiently.

And Shopify isn’t alone. Tesla, Instagram, and Uber Eats have also embraced React Native, reporting a reduction in development time.

With results like these, it’s clear why more companies are making the switch. React Native makes mobile development faster, cheaper, and easier to maintain. But there’s one tool that takes this efficiency even further—Expo.

Expo is the preferred way to start a new React Native project, officially recommended by the React Native team. It cuts development time by eliminating the need to deal with native configurations, offering pre-built APIs, and allowing instant over-the-air (OTA) updates without waiting for App Store approvals.

In this article, we’ll break down:

  • Why companies migrate from native apps to React Native

  • How Expo speeds up the migration process

  • Common challenges and how to solve them with Expo

  • The long-term performance and maintenance benefits of Expo-powered apps

Why Migrate from Native to React Native?

Companies choose to migrate from native development to React Native due to a mix of cost, speed, and scalability benefits:

  • Faster Development – A single codebase for both iOS and Android reduces development time.

  • Lower Maintenance Costs – One codebase means fewer resources spent on bug fixes and updates.

  • Wider Developer Availability – JavaScript and TypeScript are more common than Swift/Kotlin, making hiring easier.

  • Code Reusability – With React Native, large parts of the web code can be shared between mobile and desktop.

  • Strong Ecosystem – Companies like Facebook, Shopify, and Microsoft actively support and improve React Native.

We have a full article on migration from native to React Native, you can check it here: Migration of a Native app to React Native

5 Key Expo Features Improving the Migration From Native to React Native 

Migrating from a fully native app to React Native is a strategic decision, the one that comes with technical challenges. Legacy dependencies, platform-specific code, and maintaining feature parity across iOS and Android can slow the process down.

Expo eliminates the need for direct native configuration in most cases by providing a structured workflow, pre-built APIs, and a cloud-based build system. Instead of managing Xcode project settings, Android Gradle files, or manual package linking, Expo’s managed workflow ensures seamless compatibility across platforms. It automates dependency management, builds optimizations, and runtime compatibility, allowing teams to focus on delivering features instead of dealing with platform-specific issues.

Here are five key Expo features that significantly improve the migration process from native to React Native.

1. Pre-Built APIs for Native Capabilities (Push, Camera, Authentication, etc.)

  • Push notifications (expo-notifications) – Unified API for handling push messages on both iOS and Android.

  • Camera and media access (expo-camera, expo-image-picker) – Built-in components for working with photos and videos.

  • Secure authentication (expo-auth-session) – Simplifies OAuth flows for Google, Apple Sign-In, and others.

  • Haptics, sensors, geolocation, and background tasks – APIs for device interactions without needing native modules.

How It Improves Migration from a Native App

Migrating a native iOS/Android app to React Native means adapting platform-specific features to work cross-platform. Push notifications, camera access, and authentication are often deeply integrated into native apps, requiring different configurations for iOS and Android.

  • Push Notifications – Native apps rely on APNs (iOS) and FCM (Android), which require separate implementations. Expo’s expo-notifications abstracts these complexities, providing a unified way to send and handle push messages.

  • Camera & Media – Instead of writing Swift/Java to access device cameras, Expo provides expo-camera and expo-image-picker, reducing the need for custom native code.

  • Authentication – Migrating sign-in flows can be challenging due to OAuth platform differences. expo-auth-session standardizes authentication across providers like Google and Apple.

2. Expo Router: File-Based Navigation for React Native

Expo Router brings file-based routing to React Native, similar to Next.js for web applications. Instead of configuring navigation manually with react-navigation, developers can structure routes directly in the filesystem.

Example:

cpp

CopyEdit

app/

  ├── index.tsx  // Home screen

  ├── about.tsx  // About page

  ├── profile/

     ├── index.tsx  // User profile

     ├── settings.tsx  // Profile settings
Enter fullscreen mode Exit fullscreen mode

When transitioning from a native iOS or Android app, navigation logic is often deeply tied to platform-specific navigation stacks:

  • iOS (UINavigationController) relies on a push/pop stack structure, making navigation hierarchical and tightly coupled to Apple’s APIs.

  • Android (Fragments and Activities) depends on a combination of fragment transactions and activity lifecycle management, which behaves differently from iOS.

Migrating to React Native requires unifying these platform-specific navigation paradigms into a single cross-platform system, which can introduce complexity.

Expo Router

Source: Expo Blog

How Expo Router Helps

  • Simplifies navigation setup by replacing manual stack configurations with a file-based structure that automatically maps screens to routes.

  • Ensures consistency across iOS and Android without requiring platform-specific navigation logic or behavioral adjustments.

  • Improves deep linking and dynamic routing, automatically mapping URLs to screens without requiring modifications to Info.plist (iOS) or AndroidManifest.xml (Android).

For teams migrating from native mobile apps, Expo Router removes the friction of managing navigation inconsistencies, making the transition smoother and more maintainable.

3. Over-the-Air (OTA) Updates for Instant Deployment

With Expo’s OTA updates (expo-updates), teams can push new app versions without resubmitting to the App Store or Google Play.

How It Improves Migration

One of the biggest bottlenecks in mobile app migration is dealing with App Store/Play Store approvals. Every time you fix a bug or roll out a small UI improvement, it requires manual app resubmissions and waiting times (which can take days).

Expo’s OTA updates:

  • Allows instant fixes and updates – No need to wait for App Store/Play Store review cycles.

  • Reduces risk when rolling out migrated features – Teams can gradually transition parts of the app and push improvements incrementally.

  • Ensures a seamless transition between native and React Native components – Legacy native features can coexist with new React Native implementations, allowing for progressive migration.

Instead of being locked into slow deployment cycles, Expo’s OTA updates allow development teams to move faster while ensuring a smooth migration experience.

Read more about: Over the Air Updates

4. Managed Workflow: No Need for Native Code to Start

The Expo Managed Workflow allows teams to build React Native apps without manually configuring native modules (e.g., Xcode, Android Studio, Gradle).

It includes:

  • Expo Go – A lightweight client to preview apps instantly.

  • Pre-configured Metro bundler – No need to set up native build tools.

  • Cloud-based builds (EAS Build) – Run builds on Expo’s servers without needing a local macOS machine.

How It Improves Migration

When migrating from a fully native app, developers often face the challenge of setting up React Native environments alongside existing native code.

Expo Managed Workflow:

  • Eliminates the need for immediate native configurations – Teams can start migrating features incrementally without needing to install Xcode or Android Studio.

  • Reduces dependency management overhead – No need to manually link native modules or configure Gradle/Xcode projects.

  • Allows teams to focus on UI and business logic first – Native complexities can be handled later while migrating in phases.

This means small teams can begin migrating a native app to React Native without disrupting their existing workflows.

5. Expo Application Services (EAS): Optimized Builds & CI/CD

EAS Build & Submit automates app compilation and deployment, handling:

  • Cloud-based app builds (no need for macOS machines for iOS builds).

  • Code signing, provisioning, and store submission.

  • Optimized binaries for faster app performance.

Expo EAS Build

How It Improves Migration

For teams migrating an existing native app, one of the most time-consuming parts of migration is setting up CI/CD pipelines for React Native builds.

Expo’s EAS removes this friction by:

  • Handles app signing and certificates automatically – Reduces manual provisioning profile issues that slow down migration.

  • Optimizes builds for performance – Ensures migrated React Native apps are not bloated compared to their native counterparts.

  • Eliminates the need for Mac infrastructure – iOS builds are handled entirely in the cloud, removing the dependency on local macOS machines.

By offloading build complexities to Expo’s infrastructure, teams can migrate and deploy React Native features faster, without the DevOps overhead.

Common Challenges in native app rebuilds and How to Overcome Them with Expo

1. Handling Platform-Specific Code and Dependencies

Migrating from a native app to React Native comes with technical hurdles, but Expo offers solutions to smooth the transition.

Example:

A fitness-tracking app relies on custom Bluetooth logic to sync with external heart rate monitors and direct camera frame access for real-time motion tracking. These features are deeply integrated with platform-specific SDKs like Core Bluetooth (iOS) and Android’s Bluetooth stack, making it difficult to replicate them in a cross-platform environment. Since React Native runs in a JavaScript bridge, developers often worry about whether Expo can support such low-level interactions without sacrificing performance or requiring a complete rewrite.

How Expo Helps

  • Expo provides pre-built APIs (expo-bluetooth, expo-camera, expo-sensors) that handle many common hardware interactions without requiring native code modifications.

  • For advanced use cases, the bare workflow allows direct access to native modules while still leveraging Expo’s build system.

  • Custom Development Clients (expo-dev-client) enable teams to extend Expo’s managed workflow by adding their own native modules without fully ejecting, maintaining compatibility with Expo’s ecosystem while integrating necessary platform-specific features.

By starting in managed workflow and selectively extending to native where necessary, teams can preserve Expo’s benefits while ensuring full device compatibility.

2. Dealing with Missing Native Functionalities in Expo’s Managed Workflow

Example:

A subscription-based video streaming app depends on in-app purchases (IAP) for subscriptions and low-level video processing using AVFoundation (iOS) or ExoPlayer (Android). These features are deeply tied to native APIs, and developers often face issues when transitioning to React Native because Expo’s managed workflow does not support all system-level integrations out of the box.

Without direct access to these native APIs, teams might worry about whether they need to fully eject from Expo just to integrate key monetization and media processing features.

How Expo Helps

  • For in-app purchases, Expo’s bare workflow allows direct integration with StoreKit (iOS) and Google Play Billing (Android) while still benefiting from Expo’s build and OTA update capabilities.

  • For media-heavy apps, the expo-av package offers built-in audio/video support, reducing the need for full native rewrites. If advanced processing is required, teams can add native video libraries within the bare workflow.

  • Custom Development Clients (expo-dev-client) provide a middle ground—allowing teams to build a native module just for the missing functionality while keeping the rest of the app inside Expo’s managed workflow.

3. Avoiding Performance Pitfalls When Rewriting Key Components

Example:

A finance or trading app needs to render large amounts of real-time data with complex animations and interactive charts. In a fully native app, developers would use UIKit (iOS) or Jetpack Compose (Android) to optimize UI rendering, but moving to React Native introduces concerns about whether JavaScript-based rendering can match native performance.

React Native’s default rendering model relies on JavaScript and React’s reconciliation process, which can introduce frame drops, janky animations, and slow list rendering, especially for high-performance applications.

How Expo Helps

  • For complex animations, react-native-reanimated (fully supported within Expo) allows teams to offload animations to the native thread, avoiding JavaScript performance bottlenecks.

  • For handling large data sets, FlashList (developed by the React Native team) provides a high-performance, virtualized list solution optimized for React Native, significantly improving scroll performance.

  • For real-time updates, Expo’s WebSocket and background task APIs allow apps to process background data without slowing down the UI thread.

By using Expo’s optimized libraries and minimizing JavaScript thread workload, teams can ensure native-like performance while keeping development fast and scalable.

4. Ensuring Stability When Migrating in Phases

Example:

A banking app migrating to React Native needs to release new React Native-based screens while keeping core native functionalities intact. However, managing a hybrid architecture, where part of the app is still native while new features are built in React Native, can introduce stability issues if not handled properly.

Teams may struggle with embedding React Native inside an existing native app, ensuring a smooth transition without breaking core functionalities, and maintaining stability across releases.

How Expo Helps

  • Incremental Migration – Expo allows teams to start with a managed workflow and gradually introduce React Native screens into an existing native app without fully replacing it overnight.

  • Bridging Between Native and React Native – Using Expo’s bare workflow, teams can embed React Native inside an existing iOS/Android app, gradually migrating screens without disrupting the entire application.

  • OTA Updates for Stability – Expo’s OTA updates (expo-updates) allow teams to push fixes and gradual feature rollouts without waiting for App Store/Google Play approvals, minimizing downtime and migration risks.

By migrating in controlled phases, teams can transition to React Native while keeping legacy native components stable and functional.

Performance and Maintenance Benefits Post-Migrating Native App to React Native with Expo

Migrating to React Native using Expo not only simplifies development but also improves app maintenance and performance.

1. Performance Benefits of React Native with Expo

  • Efficient Rendering – React Native’s UI updates are handled efficiently with the React reconciler.

  • Optimized Lists and UI Components – Expo supports FlatList and FlashList for smooth scrolling on large data sets.

  • Reduced App Size – Expo’s bundling ensures optimal app size without unnecessary dependencies.

2. Maintenance Benefits

  • Single Codebase = Easier Updates – One update applies to both iOS and Android.

  • Expo’s OTA Updates – Deploy fixes and updates instantly without waiting for App Store approval.

  • Lower Developer Overhead – A React Native team can maintain multiple platforms without needing separate iOS and Android specialists.

Is Expo the Right Choice for Your Migration?

Migrating from native to React Native is a big decision, but Expo provides a powerful set of tools that can significantly speed up the transition, reduce complexity, and improve app maintenance.

If your app doesn’t require extensive native modules, Expo’s managed workflow is an ideal choice for a fast and smooth migration. For teams needing more flexibility, the bare workflow still allows you to benefit from Expo’s build tools while maintaining full native access.

As React Native adoption continues to grow, Expo is becoming the go-to solution for teams looking to streamline their mobile development and migration processes.

Sources

Top comments (0)