What Is React Native
React Native is an open-source framework by Meta for building iOS and Android apps with React. The JavaScript code is not compiled into native code: it runs in a JS engine (Hermes) inside the app and tells the native side which real native views to create and update. One codebase covers both platforms, and platform-specific parts are written where needed.
Applies to: React Native 0.88, Expo SDK 58.
Details
React vs React Native
| React for the web | React Native | |
|---|---|---|
| Renders to | DOM elements (div, span) | Native views (View → UIView / android.view.View) |
| Primitives | HTML tags | Core components: View, Text, Image, … |
| Styling | CSS, cascade, classes | JS objects, no cascade, Flexbox layout (Yoga) |
| Text | Text can go anywhere | Text only inside <Text> |
| Navigation | URL and browser history | A library: React Navigation or Expo Router |
| Runtime | The browser's JS engine | Hermes, bundled with the app |
| Delivery | Deploy to a server, users refresh | Store builds with review; JS-only fixes via OTA updates |
| Shared | Components, hooks, state, context | The same React: react is shared, only the renderer differs |
React Native vs Flutter vs Native
| React Native | Flutter | Native (Swift / Kotlin) | |
|---|---|---|---|
| Language | JavaScript / TypeScript | Dart | Swift, Kotlin |
| UI | Real platform views | Draws every pixel itself (Impeller engine) | Real platform views |
| Look | Native by default | Same on both platforms unless adapted | Native |
| Code sharing | iOS, Android, web (React Native Web) | iOS, Android, web, desktop | None (two codebases) |
| Best fit | Teams that know React, shared web logic | Custom-designed UI, one look everywhere | Heavy platform APIs, top performance |
Expo vs Bare React Native
Expo is the open-source framework the React Native docs recommend for new
apps. It adds a set of native modules (expo-camera, expo-notifications, …),
file-based routing (Expo Router), the dev tooling and prebuild. EAS (Build,
Submit, Update) is a separate, optional cloud service by the same company (free
tier and paid plans): many teams use Expo without it and build the generated
native projects with Xcode, Gradle, fastlane or their own CI.
| Approach | What it means |
|---|---|
| Expo (CNG) | ios/ and android/ are generated by npx expo prebuild from app.json and config plugins; any native library can be used |
| Expo Go | A prebuilt app for learning and first steps: one SDK version at a time, only its bundled native modules |
| Development build | Your own debug build with the dev tools, used instead of Expo Go once custom native code is needed |
| Bare (Community CLI) | ios/ and android/ are committed and edited by hand; Expo modules can still be added |
Follow-up Questions
- Is a React Native app slower than a native one? For typical screens the difference is small; it shows in long lists, heavy animations and startup. See Architecture and Performance.
- What is Hermes? A JS engine built for React Native: it compiles JS to bytecode at build time, so the app starts faster and uses less memory. It is the default engine. See Architecture.
- Can React Native share code with a web app? Business logic, hooks and state yes; UI only through React Native Web or Expo's web target.
- Expo Router or React Navigation? See Navigation.
- Why do the React Native docs recommend a framework? Core has no navigation, native API library or native dependency management; without a framework you build these yourself.
- What is a config plugin? A function that changes the generated native projects
during
npx expo prebuild(Info.plist,AndroidManifest.xml, Gradle files); libraries ship one so that native setup lives inapp.jsoninstead of hand-editedios/andandroid/. - When do you need a new native build instead of an OTA update? When native code or native config changes: a new native library, permissions, the app icon, an SDK upgrade. See OTA Updates.
Common Mistakes
- Saying React Native renders in a WebView. That is Cordova or Ionic; React Native creates native views.
- Saying JS is compiled to native code. It runs in Hermes; only the views are native.
- Treating Expo as a limitation. With development builds and config plugins an Expo app can use any native library.