react navite 跨端核心原理

React Native 的跨端核心原理,可以总结为一句话:

JavaScript 负责业务逻辑,Native(Android/iOS)负责真正的 UI 和系统能力,两者通过通信机制协同工作。

下面我按照从底层到上层的方式讲解,这也是大厂面试经常会问到的内容。


一、React Native整体架构

React Native运行时主要由三部分组成:

scss 复制代码
                React Native

           JavaScript Runtime
           (Hermes/V8/JSC)
                  │
                  │
        React Fiber(Reconciler)
                  │
                  │
      JS Interface(Bridge / JSI)
        ╱                    ╲
 Android Native         iOS Native
(View、Button...)      (UIView...)

主要分为:

  • JS层
  • 通信层
  • Native层

二、JS层(React)

这一层就是我们平时写的代码。

例如

javascript 复制代码
function App() {
  return (
    <View>
      <Text>Hello</Text>
      <Button title="Click" />
    </View>
  );
}

其实这里:

sql 复制代码
<View>

不是HTML

也不是DOM

而只是一个React Element。

React经过Fiber计算以后,会生成:

复制代码
Virtual Tree

例如:

css 复制代码
App

 ├── View
 │
 ├── Text
 │
 └── Button

然后告诉Native:

我要创建一个View
我要创建一个Text


三、Native层

真正显示页面的是:

Android

css 复制代码
android.view.View

TextView

Button

ImageView

iOS

objectivec 复制代码
UIView

UILabel

UIButton

UIImageView

所以:

React Native没有浏览器。

没有DOM。

没有CSS。

最终都是Native控件。

例如:

JS

scss 复制代码
<Text>Hello</Text>

Android

arduino 复制代码
TextView.setText("Hello")

iOS

ini 复制代码
UILabel.text="Hello"

四、Bridge(经典架构)

React Native最开始的核心就是Bridge。

架构如下:

diff 复制代码
JS Thread
      │
      │ JSON
      ▼
-----------------------
Bridge
-----------------------
      ▲
      │
Native Thread

JS不能直接调用Java。

也不能直接调用Objective-C。

所以Bridge负责:

序列化

例如:

JS:

ini 复制代码
<Button title="登录" />

Bridge发送:

json 复制代码
{
  "type":"createView",
  "class":"Button",
  "props":{
      "title":"登录"
  }
}

Native收到:

objectivec 复制代码
UIButton

创建出来。


Bridge存在的问题

Bridge全部走JSON。

例如:

javascript 复制代码
JS

↓

JSON

↓

Native

↓

JSON

↓

JS

问题:

大量:

  • JSON解析
  • 序列化
  • 线程切换

比如:

列表1000项:

arduino 复制代码
1000次Bridge

动画:

arduino 复制代码
60fps

Bridge

Bridge

Bridge

Bridge...

性能开始下降。

因此RN后来重构了架构。


五、JSI(现在的新架构)

React Native 0.68+ 以后基本都在使用:

JSI

JavaScript Interface

最大的改变:

JS可以直接调用C++对象。

以前:

arduino 复制代码
JS

↓

Bridge

↓

Native

现在:

bash 复制代码
JS

↓

JSI

↓

C++

↓

Android/iOS

没有JSON。

没有Bridge。

例如:

javascript 复制代码
JS

↓

C++ Function

↓

Java

直接调用。

速度提升很多。


六、TurboModule

以前:

所有Native Module:

复制代码
App启动

↓

全部初始化

例如:

复制代码
Camera

Storage

GPS

Image

Location

Clipboard

即使没用,也初始化。

启动慢。


TurboModule:

懒加载。

例如:

第一次:

kotlin 复制代码
Camera.open()

才初始化:

sql 复制代码
Camera Module

其它模块:

复制代码
不用

↓

不初始化

优点:

  • 启动快
  • 内存少

七、Fabric(新的UI架构)

旧版:

arduino 复制代码
React

↓

Bridge

↓

UIManager

↓

Native View

新版:

php 复制代码
React Fiber

↓

Fabric

↓

C++

↓

Native View

Fabric特点:

同步更新。

例如:

以前:

scss 复制代码
setState()

↓

Bridge

↓

下一帧

现在:

scss 复制代码
setState()

↓

Fabric

↓

同步Commit

更加接近React DOM。


八、Hermes引擎

以前:

RN默认:

复制代码
JavaScriptCore

后来Meta开发:

Hermes。

特点:

  • 启动快
  • 内存少
  • Bytecode
  • GC优化

流程:

复制代码
JS

↓

Hermes Compiler

↓

Bytecode

↓

运行

不像浏览器:

复制代码
JS

↓

Parser

↓

AST

↓

解释

Hermes直接运行Bytecode。

启动速度明显提升。


九、React Native渲染流程

完整流程:

scss 复制代码
React代码

↓

JS Runtime(Hermes)

↓

React Fiber

↓

计算Diff

↓

生成Mutation

↓

Fabric

↓

Native UI

↓

Android/iOS绘制

整个流程:

php 复制代码
JS

↓

Fiber

↓

Diff

↓

Fabric

↓

Native

↓

GPU

↓

屏幕

十、事件回传

点击按钮:

css 复制代码
Android Button

用户点击:

复制代码
Native

↓

JSI

↓

JS

↓

onPress

例如:

javascript 复制代码
<Button
    onPress={()=>{
        console.log("点击")
    }}
/>

实际上:

scss 复制代码
Native Event

↓

Event Dispatcher

↓

JS Runtime

↓

onPress()

十一、跨端能力来自哪里?

很多人误以为:

React Native 是把网页打包成 App。

其实不是。

RN真正跨端的是:

复制代码
React组件

↓

不同平台对应不同实现

例如:

sql 复制代码
<View />

Android:

复制代码
android.view.View

iOS:

objectivec 复制代码
UIView

React代码不用改。

底层平台实现不同。

所以:

复制代码
React API

↓

统一

↓

Android实现

↓

iOS实现

十二、与其他跨端方案对比

技术 UI 渲染方式 性能 优点 缺点
React Native 原生控件渲染 ⭐⭐⭐⭐☆ 接近原生、生态成熟 需要维护原生模块,复杂动画仍可能涉及原生开发
Flutter 自绘渲染(Skia) ⭐⭐⭐⭐⭐ UI 一致性高、性能优秀 应用体积较大,与原生 UI 风格存在差异
WebView(Hybrid) 浏览器渲染 ⭐⭐☆☆☆ 开发快、Web 技术复用 性能和体验受限
小程序 宿主平台渲染 ⭐⭐⭐☆☆ 免安装、平台能力丰富 受平台限制,生态封闭

十三、React Native 新架构总结(面试高频)

React Native 的现代架构可以概括为:

  1. React Fiber:负责组件渲染和 Diff 算法。
  2. Hermes:负责执行 JavaScript,提高启动速度和运行效率。
  3. JSI(JavaScript Interface) :取代传统 Bridge,实现 JavaScript 与 C++/Native 的直接通信,减少序列化和线程切换开销。
  4. TurboModule:原生模块按需(懒)加载,降低启动耗时和内存占用。
  5. Fabric:新的渲染系统,与 Fiber 深度集成,提升 UI 更新效率和并发渲染能力。
  6. Native UI :最终由 Android 的 View/TextView 或 iOS 的 UIView/UILabel 等原生控件完成绘制。

整体流程可以简化为:

markdown 复制代码
React 组件
    │
    ▼
React Fiber(计算 UI 变化)
    │
    ▼
Hermes(执行 JavaScript)
    │
    ▼
JSI(直接调用 Native/C++)
    │
    ├── TurboModule(系统能力)
    └── Fabric(UI 渲染)
           │
           ▼
Android / iOS 原生控件
           │
           ▼
GPU 渲染到屏幕

可以看到,React Native 的核心思想不是"跨平台绘制一套 UI",而是"跨平台复用业务逻辑,由各平台渲染原生控件" 。这也是它与 Flutter(自绘引擎)最大的架构区别。

相关推荐
奇奇怪怪的1 小时前
从开发到生产——生成优化、监控、安全与成本
前端
10share1 小时前
100行代码 模拟实现Vue 响应式系统
前端·vue.js
Heo1 小时前
Vite进阶用法详解
前端·javascript·面试
狂炫冰美式2 小时前
人均配了AI, 为什么公司还是没变快? 🤔 本质还是分布式系统问题
前端·后端·架构
乘风gg3 小时前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员3 小时前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
爱读源码的大都督4 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝4 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员4 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端