Why look beyond Expo

Expo provides a managed workflow that simplifies React Native development by abstracting away many native module complexities and offering cloud services for builds and updates. This approach is beneficial for rapid prototyping and projects that align with the Expo SDK's capabilities. However, developers might explore alternatives when their project requirements extend beyond Expo's managed environment. One common reason is the need for custom native modules or highly specific native integrations not available in the Expo SDK, which often necessitates ejecting from the Expo managed workflow or using a bare workflow, thus reducing some of Expo's core benefits. Performance-critical applications or games might benefit from frameworks that offer closer access to native APIs or different rendering engines.

Another consideration is the programming language. While Expo leverages JavaScript/TypeScript, developers proficient in Dart, Kotlin, or Swift may prefer frameworks that align with their existing skill sets or offer native performance advantages inherent to those languages. Furthermore, projects with strict size constraints might find the bundled Expo SDK larger than a minimal native application. Finally, teams looking for complete control over the native build process or those with specific CI/CD pipelines might prefer a less opinionated framework that allows for deeper customization of the underlying native projects.

Top alternatives ranked

  1. 1. React Native โ€” Build native mobile apps with JavaScript and React.

    React Native, developed by Facebook (now Meta), enables developers to build natively-rendered mobile applications for iOS and Android using JavaScript and React. It offers a component-based architecture, allowing for declarative UI development familiar to web developers. Unlike Expo's managed workflow, React Native provides direct access to native modules and APIs, giving developers greater control and flexibility to integrate custom native features or libraries. This makes it suitable for projects requiring deep native integrations or highly optimized performance that might be constrained by Expo's abstractions. React Native uses an optimizing compiler to transform JavaScript code into native views, resulting in an application that performs similarly to a purely native app. It supports a vast ecosystem of libraries and tools, benefiting from the large React community. While Expo is built on top of React Native, choosing raw React Native often means managing the native build environment (Xcode, Android Studio) directly, which can introduce additional setup and maintenance overhead compared to Expo's cloud-based services.

    Best for:

    • Cross-platform mobile development with native performance.
    • Leveraging existing web development skills (React, JavaScript).
    • Projects requiring custom native module development.
    • Large-scale applications needing fine-grained control over the native layer.

    Further Reading: React Native Getting Started

  2. 2. Flutter โ€” Google's UI toolkit for building natively compiled applications for mobile, web, and desktop from a single codebase.

    Flutter, developed by Google, is an open-source UI software development kit used for building cross-platform applications. It utilizes the Dart programming language and its own rendering engine, Skia, to draw widgets directly on the screen, bypassing OEM widgets. This approach ensures consistent UI across different platforms and offers high performance, as Flutter doesn't rely on JavaScript bridges to communicate with native components. Developers often choose Flutter for its expressive UI capabilities, fast development cycles aided by Hot Reload, and strong performance characteristics. Unlike Expo, which focuses on React Native, Flutter introduces a different programming language and a distinct widget-based architecture. It provides a comprehensive set of pre-built widgets that adhere to Material Design and Cupertino (iOS) guidelines, allowing for visually rich and customizable user interfaces. Flutter is particularly well-suited for applications where a consistent, branded look and feel across platforms is paramount, and for developers who prefer a single codebase for multiple targets, including mobile, web, and desktop.

    Best for:

    • Building visually rich and consistent UIs across platforms.
    • Fast development with Hot Reload and a declarative UI.
    • Applications requiring high performance and custom rendering.
    • Developers comfortable with Dart or learning a new language.

    Further Reading: Flutter Documentation

  3. 3. SwiftUI โ€” Apple's declarative UI framework for building apps across all Apple platforms.

    SwiftUI is Apple's modern, declarative UI framework for building applications across all Apple platforms, including iOS, macOS, watchOS, and tvOS. Introduced in 2019, SwiftUI offers a paradigm shift from UIKit, allowing developers to define user interfaces with Swift code in a more concise and readable manner. It leverages Swift's features like result builders and property wrappers to simplify UI construction and state management. For developers exclusively targeting the Apple ecosystem, SwiftUI provides the most native and integrated experience, directly harnessing platform-specific features and performance optimizations. Unlike Expo, which targets cross-platform development with JavaScript, SwiftUI is deeply integrated with Xcode and the Apple development toolchain, offering features like Live Previews and seamless integration with other Apple frameworks. While it requires learning Swift and is platform-specific, SwiftUI is ideal for projects that demand the absolute best native user experience and performance on Apple devices, or for developers within an existing Apple-centric ecosystem.

    Best for:

    • Native iOS, macOS, watchOS, and tvOS app development.
    • Leveraging modern Swift language features.
    • Building highly integrated and performant Apple ecosystem apps.
    • Developers deeply invested in the Apple platform.

    Further Reading: SwiftUI Documentation

  4. 4. Jetpack Compose โ€” Android's modern toolkit for building native UI.

    Jetpack Compose is Google's modern, declarative UI toolkit for building native Android applications. It is built entirely in Kotlin and designed to simplify and accelerate UI development on Android. Compose moves away from XML-based layouts and imperative UI updates, allowing developers to describe their UI using Kotlin functions that automatically update based on state changes. This approach offers significant advantages in terms of code conciseness, maintainability, and developer productivity compared to the traditional Android View system. For developers focused solely on the Android platform, Jetpack Compose provides the most idiomatic and performant way to build native Android UIs, fully integrating with the Android SDK and ecosystem. Unlike Expo, which provides a cross-platform JavaScript solution, Compose is Android-specific (though Compose Multiplatform extends this to other platforms). It's an excellent choice for teams with existing Kotlin expertise or those starting new Android projects who prioritize native performance, modern architecture, and a streamlined development experience on the Android platform.

    Best for:

    • Native Android UI development with a declarative approach.
    • Kotlin-first Android projects.
    • Modernizing existing Android applications.
    • Achieving optimal performance and integration on Android.

    Further Reading: Jetpack Compose Documentation

  5. 5. Ionic โ€” Open-source framework for building performant, high-quality mobile, desktop, and web apps using web technologies.

    Ionic is an open-source UI toolkit for building high-quality, cross-platform mobile, desktop, and web applications using standard web technologies like HTML, CSS, and JavaScript. It integrates with popular frameworks such as Angular, React, and Vue, allowing web developers to leverage their existing skills to create native-like experiences. Ionic applications run within a WebView, wrapped by native containers like Capacitor or Cordova, which provide access to native device features. This approach contrasts with Expo's React Native foundation, as Ionic renders web components rather than native UI components. Ionic is particularly strong for projects that prioritize maximum code reuse across web and mobile platforms and for teams primarily composed of web developers. It offers a rich library of pre-designed UI components that mimic native app look and feel, and its ecosystem supports features like live reload, theming, and integrations with backend services. While performance can sometimes be a consideration compared to truly native or React Native apps, Ionic's strength lies in its ability to deliver functional, cross-platform applications rapidly using familiar web development workflows.

    Best for:

    • Web developers building cross-platform mobile and web apps.
    • Maximum code reuse between web and mobile.
    • Rapid development of business or content-heavy applications.
    • Leveraging existing Angular, React, or Vue expertise.

    Further Reading: Ionic Documentation

  6. 6. Kotlin Multiplatform Mobile (KMM) โ€” Share code between iOS and Android.

    Kotlin Multiplatform Mobile (KMM) is a technology developed by JetBrains that allows developers to share common business logic between iOS and Android applications while retaining native UI for each platform. Unlike Expo, which aims for a single codebase for both UI and logic, KMM focuses on code sharing at the logic layer, allowing teams to write platform-specific UIs using SwiftUI for iOS and Jetpack Compose for Android. This approach combines the benefits of code reuse for core features like networking, data storage, and business rules with the ability to deliver a completely native user experience on each platform. KMM leverages Kotlin's interoperability with Objective-C/Swift and Java, enabling seamless integration with existing native codebases. It is an excellent choice for projects where native UI/UX is paramount, but consolidating backend logic is desired, reducing duplication and potential bugs. KMM requires a deeper understanding of both native platforms than Expo's managed workflow, but it offers a powerful middle ground between full native development and purely cross-platform frameworks.

    Best for:

    • Sharing business logic between iOS and Android.
    • Achieving native UI/UX on both platforms.
    • Teams with Kotlin expertise.
    • Complex applications where native performance and feel are critical.

    Further Reading: Kotlin Multiplatform Mobile Getting Started

  7. 7. Swift โ€” Apple's powerful and intuitive programming language for building apps across all Apple platforms.

    Swift is a robust and intuitive programming language developed by Apple for building apps across all Apple platforms. It emphasizes safety, performance, and modern programming patterns, making it a strong choice for developing high-quality, native iOS, macOS, watchOS, and tvOS applications. When compared to Expo, Swift represents the pinnacle of native Apple development. It offers direct access to all platform APIs, optimal performance, and the most integrated development experience within Xcode. Developers using Swift can leverage the full power of the Apple ecosystem, including advanced frameworks like Core ML, ARKit, and Metal. While it is platform-specific and requires learning Swift, choosing Swift for iOS development ensures maximum control, flexibility, and the ability to craft highly optimized and responsive applications tailored precisely to Apple's hardware and software. It's the go-to choice for projects where uncompromising native performance, specific Apple platform features, and a truly native user experience are non-negotiable requirements.

    Best for:

    • Building high-performance native applications for Apple platforms.
    • Leveraging the full range of Apple's frameworks and features.
    • Projects requiring meticulous control over UI/UX and system resources.
    • Developers committed to the Apple ecosystem.

    Further Reading: Swift Documentation

Side-by-side

Feature Expo React Native Flutter SwiftUI Jetpack Compose Ionic Kotlin Multiplatform Mobile Swift
Primary Language(s) JavaScript, TypeScript JavaScript, TypeScript Dart Swift Kotlin HTML, CSS, JavaScript (with Angular, React, Vue) Kotlin Swift
Platform Targets iOS, Android, Web iOS, Android (Web/Desktop via community) iOS, Android, Web, Desktop iOS, macOS, watchOS, tvOS Android (iOS/Desktop via Multiplatform) iOS, Android, Web, Desktop iOS, Android (Logic only) iOS, macOS, watchOS, tvOS
UI Rendering Native (React Native) Native Skia engine (custom widgets) Native (Apple frameworks) Native (Android frameworks) WebView (Web components) Native (platform-specific UI) Native (Apple frameworks)
Native Module Access Limited (managed workflow), Full (bare workflow) Full Full Full Full Via Capacitor/Cordova plugins Full Full
Learning Curve (from web dev) Low (React/JS) Moderate (React/JS, native concepts) Moderate (Dart, new framework) High (Swift, Apple ecosystem) High (Kotlin, Android ecosystem) Low (Web technologies) Moderate (Kotlin, native concepts) High (Swift, Apple ecosystem)
Development Speed High (managed workflow, OTA updates) High (Hot Reload, component-based) High (Hot Reload, declarative UI) High (Live Previews, declarative UI) High (Preview, declarative UI) High (Web dev tools, PWA support) Moderate (shared logic, native UI) Moderate (Xcode, native tools)
Performance Good (native runtime) Excellent (native runtime) Excellent (Skia engine) Optimal (native) Optimal (native) Good (WebView, JIT) Optimal (native UI, shared logic) Optimal (native)
Ecosystem Size Large (React Native ecosystem) Very Large Large and growing Large (Apple ecosystem) Large (Android, Kotlin ecosystem) Large (Web ecosystem) Growing (Kotlin ecosystem) Very Large (Apple ecosystem)

How to pick

Selecting the right framework or toolkit depends heavily on your project's specific requirements, your team's existing skill set, and your target platforms. Consider the following decision-tree style guidance:

  • Do you prioritize rapid prototyping and frequent over-the-air (OTA) updates for a cross-platform app, and your team is proficient in JavaScript/TypeScript?
    • If yes, Expo may still be a strong contender, especially if native module access is not a primary concern.
    • If you need more control over native modules or prefer the core React Native experience without Expo's managed workflow, choose React Native directly.
  • Is building visually rich, custom UIs across multiple platforms (mobile, web, desktop) a top priority, and are you open to learning Dart?
    • If yes, Flutter offers a highly performant and consistent UI experience with its own rendering engine.
  • Are you primarily targeting Apple platforms (iOS, macOS, watchOS, tvOS) and require the most native experience with modern Swift features?
    • If yes, SwiftUI provides a declarative, integrated approach for building apps across the Apple ecosystem.
    • For the ultimate control and performance on Apple platforms, Swift with UIKit (or SwiftUI) is the foundational choice.
  • Are you exclusively building for Android, seeking a modern, declarative UI, and your team is proficient in Kotlin?
    • If yes, Jetpack Compose is the official and recommended toolkit for native Android UI development.
  • Do you have a strong web development team (HTML, CSS, JavaScript with Angular, React, or Vue) and want to maximize code reuse between web and mobile applications, even if it means running in a WebView?
    • If yes, Ionic allows you to leverage existing web skills and components for cross-platform app development.
  • Do you want to share business logic between iOS and Android but maintain completely native UIs for each platform?
    • If yes, Kotlin Multiplatform Mobile (KMM) offers a solution for shared logic while allowing platform-specific UI development in SwiftUI and Jetpack Compose.

Ultimately, the best alternative depends on balancing factors like development speed, performance requirements, team expertise, desired level of native control, and the platforms you intend to support. Evaluate each option against your project's critical success factors.