如果从架构原理来看,RN(React Native)和 Flutter 最大的区别可以概括成一句话:
RN:JavaScript/TypeScript 驱动原生 UI;Flutter:Dart 驱动自己的渲染引擎。
1. 整体架构对比
React Native ┌──────────────────────────────┐ │ React / JS / TS │ │ Component / Hooks / State │ └──────────────┬───────────────┘ │ JS ↔ Native 通信 (现代 RN: JSI) │ ┌──────────────▼───────────────┐ │ React Native Runtime │ │ Fabric / TurboModules / JSI │ └──────────────┬───────────────┘ │ Native Components │ ┌───────┴───────┐ │ │ iOS UIKit Android ViewFlutter ┌──────────────────────────────┐ │ Dart App │ │ Widget / State / Business │ └──────────────┬───────────────┘ │ Flutter Framework │ ┌──────────────▼───────────────┐ │ Flutter Engine │ │ Dart Runtime + Skia/Impeller │ └──────────────┬───────────────┘ │ GPU / Surface │ ┌──────┴──────┐ │ │ iOS Android2. 最核心的架构区别
| 维度 | React Native | Flutter |
|---|---|---|
| 开发语言 | JS / TS | Dart |
| UI 来源 | 原生控件 | Flutter 自己绘制 |
| 渲染 | React → RN → Native UI | Widget → Engine → GPU |
| JS/Dart 与 Native 通信 | JSI / TurboModules 等 | Platform Channels / FFI 等 |
| UI 抽象 | React Component | Widget |
| 平台差异 | 比较明显 | Flutter 层统一 |
| 原生能力 | 直接使用 Native 生态较方便 | 需要 Plugin / Platform Channel |
| UI 一致性 | 依赖 iOS/Android 原生实现 | 跨平台一致性较强 |
| 包体积 | 通常较小 | 通常相对较大 |
| 性能模型 | JS 逻辑 + Native UI | Dart + 自有渲染引擎 |
3. RN 的核心:JS 驱动 Native
早期 RN 经常被描述成:
JS │ │ Bridge ▼ Native │ ▼ UIView / Android View例如:
<View> <Text>Hello</Text> <Button title="OK" /> </View>最终并不是 RN 自己画一个 Button,而是由 RN 的架构映射到平台对应的 Native View。
现代 RN 已经发生了比较大的变化:
React ↓ Fabric ↓ JSI ↓ C++ / Native ↓ UIKit / Android所以现在讨论 RN 架构时,最好不要再简单理解成:
JS → JSON Bridge → Native
更准确的是:
React + JS/TS Runtime + JSI + Fabric + TurboModules + Native Platform
4. Flutter 的核心:自己画 UI
Flutter 的思路完全不同。
你写:
Container( child: Text("Hello"), )Flutter 并不是把Container转换成:
UIView Android View而是:
Widget ↓ Element ↓ RenderObject ↓ Flutter Engine ↓ Impeller ↓ GPU也就是说:
Flutter 的 Button、Text、List、ScrollView 等大量 UI 都是 Flutter 自己实现的。
所以 Flutter 能做到:
同一份 Widget ↓ ┌─────┴─────┐ iOS Android └─────┬─────┘ ↓ Flutter Engine ↓ GPU这也是 Flutter 跨平台 UI 一致性比较强的根本原因。
5. 两者最大的架构差异:谁负责渲染?
这是面试里非常值得讲的一点。
RN
React Component ↓ React Native ↓ Native Component ↓ UIKit / Android View ↓ 系统渲染所以 RN 更接近:
跨平台 React 层 + 原生 UI。
Flutter
Flutter Widget ↓ RenderObject ↓ Flutter Engine ↓ Impeller ↓ GPU所以 Flutter 更接近:
跨平台 UI 框架 + 自己的渲染体系。
6. 这会直接影响性能
假设有一个复杂列表:
1000 个 Cell ↓ 大量布局 ↓ 大量滚动 ↓ 动画RN:
JS/React ↓ RN ↓ Native View ↓ iOS / Android renderingFlutter:
Dart ↓ Flutter Framework ↓ Engine ↓ GPU因此两者的性能瓶颈也不完全一样。
RN 常见瓶颈
JS 线程 ↓ JS 执行 / React 更新 ↓ JSI / Native ↓ Native UI特别是:
JS 计算太重
大量 React 重渲染
JS 与 Native 高频交互
大型列表
复杂动画
Flutter 常见瓶颈
更多会出现在:
Dart 逻辑
Widget rebuild
Layout
Paint
GPU 渲染
图片/Shader
大量 Widget
7. RN 为什么更容易接入原生生态?
因为 RN 的设计本身就非常接近:
React + Native例如你已经有:
iOS SDK Android SDK可以通过 Native Module 暴露给 JS:
JS/TS ↓ TurboModule ↓ Swift / Objective-C Kotlin / Java所以如果一个公司已经拥有大量:
iOS Native 代码
Android Native 代码
原生 SDK
原生组件
RN 往往比较容易融入现有技术体系。
8. Flutter 的 Native 通信
Flutter 通常是:
Dart ↓ MethodChannel ↓ Swift / Kotlin例如:
Flutter │ │ MethodChannel ▼ Android Kotlin │ ▼ Native SDK或者:
Flutter │ │ Platform Channel ▼ iOS Swift当然 Flutter 也可以通过:
FFI直接调用 C/C++ 等 Native 能力。
9. 架构思想上的区别
可以把它们理解成两种路线:
RN:复用 Native
React │ React Native │ ┌──────────┴──────────┐ ▼ ▼ iOS Native Android Native │ │ UIKit View重点是:
尽可能利用已有的 Native 平台。
Flutter:抽象 Native
Flutter │ Flutter Widget │ Flutter Engine │ GPU ┌─────────┴─────────┐ ▼ ▼ iOS Android重点是:
尽可能把 UI 和渲染从 Native 平台抽离出来。
10. 如果从“大型 App 架构”来看
这时候两者差异就更有意思了。
RN 通常是:
App │ ┌─────────┴─────────┐ │ │ Native Layer RN Layer │ │ iOS / Android React / TS │ │ Native SDK JS Business所以很适合:
Native 主体 + RN 页面/业务模块
例如一个大型 App:
原生 App Shell │ ├── 首页 —— RN ├── 商品 —— RN ├── 订单 —— RN ├── 支付 —— Native ├── 相机 —— Native └── 地图 —— NativeFlutter 更容易形成:
Flutter App │ ├── UI ├── State ├── Business ├── Network └── Navigation │ ↓ Platform Channel │ ┌─────┴─────┐ iOS Android也就是:
Flutter 更倾向于整个 App 使用 Flutter 架构。
11. 一个非常好记的总结
如果你正在准备RN / Flutter 面试,可以直接记这张图:
跨平台方案 │ ┌─────────┴─────────┐ │ │ RN Flutter │ │ React / TS Dart │ │ Fabric Widget │ │ JSI Flutter Engine │ │ Native Components Impeller │ │ UIKit / Android GPU一句话:
RN 的核心是“JavaScript/React 驱动 Native UI”,Flutter 的核心是“Dart/Widget 驱动自己的渲染引擎”。
如果进一步往源码和底层架构深入,最值得比较的是RN 的 Fabric + JSI + TurboModules和Flutter 的 Widget → Element → RenderObject → Engine → Impeller,这部分也是两者真正拉开架构差异的地方。