Architecture Compared

Architecture: Bridge, JavaScript Engine or Native Widgets

The five frameworks fall into three families, told apart by what draws the pixels:

Three families of cross-platform app: who runs the code and who draws the screen
Three families of cross-platform app: who runs the code and who draws the screen

Web in a WebView. Cordova 129 and Capacitor 243,123 run your web app in the system WebView and cross into native code through a message bridge (How the Bridge Works): an asynchronous call, serialized as JSON, that returns a Promise. Neither ships a JavaScript engine. BookNest's release APK contains no engine library at all; the Chromium 4,389 that runs it (com.google.android.webview, 133.0.6943.137 on this emulator) updates through Google Play 1 on its own schedule. Tauri 126,184 also uses the system WebView (Android WebView, WKWebView on iOS), but its native side is a Rust library you write, with mobile plugins in Kotlin and Swift.

JavaScript driving native views. React Native 36,878 ships its own engine, Hermes 11,328 (Hermes V1 by default since 0.84, February 2026), and renders real platform views. Since 0.82 it runs only the New Architecture, where JSI lets JavaScript hold references to C++ objects and call them synchronously instead of queuing JSON messages (React Native).

Own rendering engine. Flutter 16,720 compiles Dart ahead of time to machine code and paints every pixel with its own renderer, Impeller, the default on iOS and on Android API 29 and later. Its buttons are Flutter widgets imitating Material or Cupertino, not platform controls, so they look the same on every OS version. Native APIs are reached through platform channels, again asynchronous messages.