🚀 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.
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/andandroid/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
- Configure your project — Add the native modules you need to your project
- Build once — Run
eas build --profile developmentin the cloud - Install on device — Install the resulting app on your phone/simulator
- Develop normally — The dev build connects to your Metro bundler, just like Expo Go
- 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:
- Start with Expo Go — For quick setup and learning
- Move to Development Builds — When we add features requiring native code
- 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.