What is Expo? React Native Framework, EAS Build and Updates

Expo is a React Native framework with a native module SDK, Expo Router and EAS cloud builds and updates. How it works and how to load test its backend.

What is Expo?

Expo is an open-source framework for building React Native apps for Android and iOS. It gives you the project setup, a library of ready-made native modules (the Expo SDK), file-based routing with Expo Router and, through EAS (Expo Application Services), hosted builds, store submission and over-the-air updates. You write JavaScript or TypeScript and rarely open Xcode or Android Studio.

It sits on top of React Native the way a full-stack framework sits on top of a UI library: React Native renders native views, Expo decides how the project is structured, built and shipped.

How Expo works

  • Expo CLI and dev server. npx expo start serves your JavaScript bundle with fast refresh to a simulator, an emulator or a phone.
  • Expo Go and development builds. Expo Go is a ready-made app for trying a project on a device without building anything. Once you need native code Expo Go does not contain, you create a development build of your own app.
  • Continuous Native Generation (CNG). The android and ios folders are generated on demand by prebuild from a template plus your configuration, instead of being maintained by hand. Config plugins are the functions that change those native projects during prebuild.
  • EAS Build. A hosted service that builds your app binaries. iOS builds run on macOS runners in Expo's cloud, and eas build --local builds on your own machine instead.
  • EAS Update. Ships JavaScript, styling and image changes over the air to apps that include expo-updates, between store releases.

Example: from zero to a running app

npx create-expo-app@latest my-app
cd my-app
npx expo start

Then describe your build profiles in eas.json and build and update from the terminal:

{
  "build": {
    "preview": { "distribution": "internal" },
    "production": {}
  }
}
eas build --platform all --profile production
eas update --branch production --message "Fix login copy"

An update can only change what lives in the JavaScript bundle. Native code, native dependencies, permission changes and Expo SDK upgrades need a new binary from EAS Build, and updates are only delivered to builds whose native code is compatible.

Managed vs bare workflow: an outdated distinction

Older guides split Expo into a managed workflow (JavaScript only) and a bare workflow (you own the native folders). Expo's documentation now calls those concepts deprecated: every Expo project uses Continuous Native Generation, and custom native code goes in through config plugins or local native modules. If a tutorial tells you to "eject", it predates this.

Expo vs React Native CLI

AspectExpoReact Native CLI
Project setupOne command, native folders generatedYou create and maintain the native projects
Native codeConfig plugins, development builds, local modulesDirect edits in Xcode and Android Studio
BuildsEAS Build (hosted) or localLocal Xcode and Gradle, CI you set up
Over-the-air updatesEAS UpdateSeparate service to integrate

Common Expo mistakes

  • Putting secrets in EXPO_PUBLIC_ variables. Expo inlines them into the JavaScript bundle and its docs warn they are visible in plain text in the compiled app. Anything secret belongs on your backend.
  • Expecting an over-the-air update to ship native changes. A new native module or permission means a new build and a store release.
  • Testing only in Expo Go. It hides problems that appear once your own native dependencies are in a development or release build.
  • Treating the app as the whole product. A fast screen still waits on a slow API. Most "the app is slow" reports end at the backend.

Expo and backend load testing

An Expo app is a client. Every login, feed refresh and checkout calls your API endpoints, and a store release or a push notification can send thousands of users to them in the same minute. That load never touches Expo, so it has to be tested on the backend with load testing, plus API testing for correctness.

LoadFocus runs JMeter and k6 scripts from 25+ cloud regions; see load testing and JMeter load testing. To watch the same endpoints between releases, use API monitoring. For worked examples read how cloud load testing changed mobile app load times and why mobile-first teams should prioritise performance testing.

FAQ: Expo

Is Expo free?

The framework and the SDK are open source. EAS is a hosted service with a free tier and paid plans, and the allowances change over time, so check Expo's pricing page before you plan around a number.

Should I use Expo or the React Native CLI?

Most new projects start with Expo because setup, builds and updates are handled for you. The React Native CLI makes sense when you want to own the native projects from day one.

Can an Expo app use any native module?

Yes, if the module works with config plugins or you add it to a development build. Expo Go only contains the modules it ships with.

What is the difference between EAS Build and EAS Update?

EAS Build compiles the app binary (an .ipa or .apk/.aab). EAS Update replaces the JavaScript, styling and images inside an installed app without a new binary.

Do I still need app store review for updates?

Over-the-air updates must follow the rules of Apple and Google. Behaviour changes can still need review, so keep reading the store policies.

How do I load test the backend of an Expo app?

Find the API calls the app makes, script them in JMeter or k6 and run them from several regions at your expected peak. Start with a free LoadFocus account.

How fast is your website?

Elevate its speed and SEO seamlessly with our Free Speed Test.

Free Website Speed Test

Analyze your website's load speed and improve its performance with our free page speed checker.