Skip to main content

🚀 Expo vs Bare React Native

Understanding your options and making the right choice

🎯 Learning Objectives

By the end of this lesson, you will be able to:

  • Explain the difference between Expo and bare React Native workflows
  • Describe the evolution of Expo and why perceptions have changed
  • Compare the advantages and trade-offs of each approach
  • Make an informed decision about which workflow suits your project
  • Understand what "Development Builds" are and how they bridge the gap

⏱️ Estimated Time: 25-35 minutes

📑 In This Lesson

The Two Paths

When starting a React Native project, you have two main approaches: Expo and Bare React Native. Think of it like buying a car — you can get a fully-loaded model with all the features included, or you can get a base model and add what you need yourself.

Two Ways to Build React Native Apps 🚀 Expo "The Fully-Loaded Option" ✅ Pre-configured tooling ✅ Native modules included ✅ Cloud build services (EAS) ✅ Over-the-air updates ✅ File-based routing ✅ Expo Go for quick testing Recommended for most projects ✓ ⚙️ Bare React Native "The DIY Option" 📦 Manual native configuration 📦 Add each native module 📦 Build locally or custom CI 📦 Manual update mechanism 📦 Choose your own router 📦 Always need native builds For specific requirements

Both paths lead to production apps — the difference is in the development experience

What is Bare React Native?

Bare React Native (sometimes called "vanilla" React Native) is the framework as Meta provides it. You get:

  • The core React Native framework
  • Full access to the ios/ and android/ native folders
  • Complete control over native configuration
  • The need to manually integrate every native feature

It's like getting a house with just the foundation and framing — you add the plumbing, electrical, and HVAC yourself. Maximum flexibility, maximum work.

What is Expo?

Expo is a platform built on top of React Native. It provides:

  • A pre-configured development environment
  • The Expo SDK — dozens of pre-built native modules
  • Expo Go — an app for testing without native builds
  • EAS (Expo Application Services) — cloud builds, updates, and submission
  • Expo Router — file-based navigation

It's like getting a fully-furnished house. You can still renovate and customize, but you can also move in and start living immediately.

📢 The Official Recommendation

As of 2024, the React Native documentation officially recommends Expo as the way to start new projects. This is a significant endorsement — Meta is saying "use Expo" in their own docs.

The Evolution of Expo

If you've heard negative things about Expo, they're probably outdated. Expo has evolved dramatically, and the platform of 2024 is fundamentally different from the Expo of 2018 or 2020.

A Brief History

timeline
    title Expo Evolution
    2016 : Expo Founded
         : Managed workflow only
         : Limited native access
    2018 : Expo SDK grows
         : Still no custom native code
         : "Ejecting" was common
    2020 : Bare workflow introduced
         : EAS announced
         : Flexibility increases
    2022 : Development Builds launch
         : Custom native code without ejecting
         : EAS Build matures
    2024 : New Architecture support
         : Expo becomes RN's recommendation
         : Full native parity achieved
                

Expo has transformed from a limited sandbox to a complete development platform

The Old Complaints (Now Resolved)

Old Complaint Reality in 2024
"You can't use custom native code" ✅ Development Builds support any native code
"You'll have to eject eventually" ✅ Ejecting is almost never needed now
"Expo apps are too large" ✅ Modern Expo apps have comparable sizes
"You can't use library X" ✅ Most libraries work with Dev Builds
"Expo Go is limiting" ✅ Expo Go is for prototyping; Dev Builds for production
"You're locked into Expo's ecosystem" ✅ You can always add/access native code

✅ The Key Insight

Modern Expo isn't a "walled garden" — it's a set of tools that work together. You get the convenience of pre-built modules AND the ability to add custom native code when needed. It's additive, not restrictive.

What Changed?

The biggest shift was the introduction of Development Builds and the maturation of EAS Build. These two features eliminated the main pain points:

🔨 EAS Build

Build iOS and Android apps in the cloud. No Mac required for iOS. Handles code signing. Makes building as easy as eas build.

📱 Development Builds

Create a custom version of "Expo Go" that includes any native modules you need. Get the convenience of Expo Go with unlimited native access.

Feature Comparison

Let's do a detailed comparison across the dimensions that matter:

Development Experience

Aspect Expo Bare React Native
Project Setup One command, works instantly Multiple steps, config required
Testing on Device Expo Go or Dev Build Must build native app first
Hot Reloading ✅ Built-in ✅ Built-in
Error Messages Enhanced, user-friendly Raw native errors
TypeScript ✅ Pre-configured Manual setup

Native Capabilities

Aspect Expo Bare React Native
Camera, Location, etc. Expo SDK modules (easy) Manual integration
Custom Native Code ✅ Via Dev Builds ✅ Direct access
Native Module Linking Automatic (mostly) Manual or autolinking
New Architecture ✅ Supported ✅ Supported

Build & Deployment

Aspect Expo (with EAS) Bare React Native
iOS Builds Cloud (no Mac needed) Requires Mac + Xcode
Android Builds Cloud Local or custom CI
Code Signing Managed automatically Manual setup
App Store Submission eas submit Manual or custom scripts
OTA Updates EAS Update (built-in) CodePush or custom

Cost Considerations

Aspect Expo Bare React Native
Framework Free Free
Development Free Free
Cloud Builds (EAS) Free tier, then paid Your own infra costs
OTA Updates Free tier, then paid CodePush (App Center) or DIY

💡 EAS Pricing

EAS has a generous free tier (30 builds/month, 1000 updates/month as of 2024). For most indie developers and small teams, the free tier is sufficient. Paid plans are reasonable and often cheaper than maintaining your own CI infrastructure.

Development Builds: The Best of Both

Development Builds are the secret sauce that made Expo viable for production apps. They deserve special attention because they eliminate the historical trade-off between convenience and capability.

What is a Development Build?

Think of Expo Go as a "generic" app that can run any Expo project — but it can only include the native modules that Expo decided to bundle. A Development Build is a custom app built specifically for your project, including whatever native modules you need.

flowchart LR
    subgraph ExpoGo["Expo Go"]
        A["Pre-bundled
native modules"] B["Camera ✓"] C["Location ✓"] D["Notifications ✓"] E["Custom code ✗"] end subgraph DevBuild["Development Build"] F["Your native modules"] G["Camera ✓"] H["Location ✓"] I["Notifications ✓"] J["Custom code ✓"] K["Any library ✓"] end style ExpoGo fill:#fff3e0,stroke:#ff9800 style DevBuild fill:#e8f5e9,stroke:#4caf50

Development Builds include exactly the native code your project needs

How It Works

  1. Configure your project — Add the native modules you need to your project
  2. Build once — Run eas build --profile development in the cloud
  3. Install on device — Install the resulting app on your phone/simulator
  4. Develop normally — The dev build connects to your Metro bundler, just like Expo Go
  5. Rebuild when native code changes — Only needed when adding new native modules

✅ The Magic

You only rebuild when your native code changes. JavaScript changes still hot-reload instantly. So 95% of your development feels exactly like using Expo Go — fast and seamless.

When to Use What

flowchart TD
    A[Starting development] --> B{Need custom
native modules?} B -->|No| C[Use Expo Go] B -->|Yes| D[Create Development Build] C --> E{Adding a library that
requires native code?} E -->|No| C E -->|Yes| D D --> F[Develop with Dev Build] F --> G{Native dependencies
changed?} G -->|No| F G -->|Yes| H[Rebuild Development Build] H --> F style C fill:#fff3e0,stroke:#ff9800 style D fill:#e8f5e9,stroke:#4caf50 style F fill:#e8f5e9,stroke:#4caf50

Start with Expo Go, switch to Development Builds when you need custom native code

Common Native Module Scenarios

Feature Works in Expo Go? Notes
Camera ✅ Yes expo-camera included
Location ✅ Yes expo-location included
Push Notifications ✅ Yes expo-notifications included
In-App Purchases ❌ No Needs Development Build
Firebase (native SDK) ❌ No Needs Development Build
Bluetooth ❌ No Needs Development Build
Health/Fitness APIs ❌ No Needs Development Build
Custom native module ❌ No Needs Development Build

Making Your Decision

So when should you use Expo vs Bare React Native? Let's make this concrete:

Use Expo (Recommended) When:

  • ✅ Starting a new project (almost always)
  • ✅ You want fast iteration and good developer experience
  • ✅ You don't have a Mac but need iOS builds
  • ✅ You want over-the-air updates
  • ✅ You want simplified app store submission
  • ✅ Your team includes less experienced native developers
  • ✅ You're building a typical app (content, social, e-commerce, productivity)
  • ✅ You need the Expo SDK modules (camera, location, etc.)

Consider Bare React Native When:

  • ⚠️ You're integrating with an existing native app ("brownfield")
  • ⚠️ You have specific native build requirements that EAS can't meet
  • ⚠️ Your organization requires on-premise builds (security/compliance)
  • ⚠️ You have an experienced native team who wants full control
  • ⚠️ You're deeply customizing the React Native framework itself

Decision Flowchart

flowchart TD
    A[New React Native Project] --> B{Integrating into
existing native app?} B -->|Yes| C[Consider Bare RN
or Expo with care] B -->|No| D{Need on-premise builds
for compliance?} D -->|Yes| E[Bare RN with
custom CI] D -->|No| F{Want good DX and
faster development?} F -->|Yes| G["Use Expo ✓"] F -->|Neutral| G style G fill:#4caf50,stroke:#333,color:#fff style C fill:#ff9800,stroke:#333,color:#fff style E fill:#ff9800,stroke:#333,color:#fff

For most projects, Expo is the right choice

Can You Switch Later?

💡 Yes, You Can!

Starting with Expo doesn't lock you in. You can:

  • Add custom native code via Development Builds at any time
  • "Prebuild" to generate native folders if you need direct access
  • Continue using Expo tools even with custom native code

The modern Expo workflow is designed to grow with your project, not constrain it.

Summary

🎉 Key Takeaways

  • Expo is now officially recommended — The React Native docs endorse it as the starting point
  • Old complaints are outdated — Development Builds solved the "can't use custom native code" problem
  • Expo Go is for prototyping — Development Builds are for production apps with custom needs
  • EAS provides cloud services — Builds, updates, and submission without complex CI setup
  • Bare RN is for special cases — Brownfield apps, on-premise requirements, or deep native customization
  • You're not locked in — Expo projects can add native code at any time

📚 Our Course Approach

Throughout this course, we'll use Expo with the following strategy:

  1. Start with Expo Go — For quick setup and learning
  2. Move to Development Builds — When we add features requiring native code
  3. Use EAS Build — For production builds and deployment

This gives you the best of both worlds: fast iteration during learning, and production-ready skills for real apps.

🚀 What's Next?

Now that you understand why we're using Expo, let's get your development environment set up! In the next lesson, we'll install all the tools you need to start building.

🛠️ Decision Made!

You now understand the landscape. Expo it is! Time to install some tools and write some code.