RN Bridge 原理

RN Bridge 原理(React Native Bridge)

React Native(RN)的核心思想是:

JavaScript 负责业务逻辑和 UI 描述,Native(iOS/Android)负责真正的 UI 渲染和系统能力调用,两者通过 Bridge 通信。

Bridge 就是连接 JS 世界Native 世界 的通信桥梁。


1. RN 的整体架构

简单理解:

yaml 复制代码
              JavaScript Thread
                    |
                    |
                RN Bridge
                    |
        -------------------------
        |                       |
 Native Modules           UI Manager
        |                       |
 Android/iOS APIs        Native Views

例如:

你写:

ini 复制代码
<Button title="点击"/>

JS 并不会直接创建 Android Button。

流程:

yaml 复制代码
React Component
        |
        ↓
JS生成Virtual DOM
        |
        ↓
Bridge发送UI指令
        |
        ↓
Native创建View
        |
        ↓
显示到屏幕

2. Bridge 到底传什么?

Bridge 传输的是:

JSON-like 数据

例如:

JS:

kotlin 复制代码
NativeModules.Camera.open()

实际上 Bridge 会转换成类似:

json 复制代码
{
  "module": "Camera",
  "method": "open",
  "args": []
}

Native 收到:

scss 复制代码
CameraModule
      |
      ↓
open()
      |
      ↓
调用系统Camera API

3. 三个核心角色

① JS Thread

运行:

  • React代码
  • Redux
  • Hooks
  • JavaScript逻辑

例如:

css 复制代码
setState({
  name:"Tom"
})

JS线程计算:

UI应该变成什么样?


② Bridge

负责:

JS → Native

例如:

arduino 复制代码
Alert.alert(
 "Hello"
)

发送:

arduino 复制代码
JS
 |
 |  "显示Alert"
 ↓
Bridge
 |
 ↓
Native

Android:

scss 复制代码
AlertDialog.show()

iOS:

objectivec 复制代码
UIAlertController

Native → JS

例如:

用户点击按钮:

yaml 复制代码
Native Button
      |
      ↓
Bridge
      |
      ↓
JS callback

JS:

scss 复制代码
onPress()

执行。


③ Native Modules

提供原生能力:

例如:

RN:

scss 复制代码
Camera.takePhoto()

Native:

Android:

复制代码
CameraManager

iOS:

objectivec 复制代码
AVCaptureSession

4. 为什么叫 Bridge?

因为两个环境完全不同:

JS:

复制代码
JavaScript VM
对象
垃圾回收
动态类型

Native:

复制代码
Java/Kotlin
Objective-C/Swift
内存管理
系统API

它们不能直接调用。

所以需要:

arduino 复制代码
JS对象
 ↓
序列化
 ↓
Bridge
 ↓
反序列化
 ↓
Native对象

5. Bridge 的异步机制

传统 RN Bridge:

异步通信

例如:

JS:

scss 复制代码
NativeModules.User.getUser()

不是:

复制代码
JS等待返回

而是:

复制代码
JS发送请求

继续执行

Native处理

结果回来

执行callback

类似:

markdown 复制代码
JS Thread

sendMessage()
      |
      |
      ↓

Bridge Queue

      |
      ↓

Native Queue

      |
      ↓

callback

      |
      ↓

JS Thread

6. 为什么旧 Bridge 性能不好?

因为:

问题1:JSON序列化

例如:

大量列表:

bash 复制代码
[
 {id:1},
 {id:2},
 ...
10000条
]

需要:

JS对象

JSON转换

Native对象

成本高。


问题2:线程切换

例如动画:

60 FPS

意味着:

复制代码
16.6ms一帧

如果:

JS Thread

Bridge

Native

频繁通信:

容易掉帧。


问题3:异步限制

例如:

JS:

复制代码
我要马上知道Native结果

Bridge:

复制代码
等消息回来

存在延迟。


7. 新架构为什么取消 Bridge?

React Native New Architecture:

核心:

  • JSI
  • Fabric
  • TurboModules

架构:

yaml 复制代码
          JS
          |
          |
         JSI
          |
 -----------------
 |               |
Fabric       TurboModules
 |
Native UI

8. JSI 和 Bridge区别

老架构

javascript 复制代码
JS

↓ JSON

Bridge

↓ JSON

Native

新架构

vbnet 复制代码
JS

↓

C++ Interface (JSI)

↓

Native Object

直接调用。

类似:

以前:

打电话找人工转接

现在:

直接拨内部号码


9. Fabric是什么?

以前:

arduino 复制代码
JS
 |
Bridge
 |
UI Manager
 |
View

Fabric:

sql 复制代码
JS
 |
JSI
 |
C++ Renderer
 |
Native View

优势:

  • 更快
  • 同步渲染
  • 支持 Concurrent React

10. TurboModules是什么?

旧:

sql 复制代码
所有Native Module启动加载

例如:

你只用:

复制代码
Camera

但是:

复制代码
Bluetooth
Maps
Contacts

全部加载。

TurboModules:

按需加载:

sql 复制代码
Camera需要?

加载Camera Module

面试回答版本(1分钟)

如果面试问:

RN Bridge 原理是什么?

可以回答:

React Native Bridge 是连接 JavaScript 和 Native 的通信机制。JS 层通过 Bridge 将调用信息序列化成 JSON 消息发送给 Native,Native 根据模块和方法执行对应逻辑,再通过 Bridge 将结果异步回传给 JS。传统 Bridge 存在序列化、线程切换和异步通信开销,因此 React Native 新架构使用 JSI、Fabric 和 TurboModules,实现 JS 与 Native 更直接的通信,提高性能。

相关推荐
杨利杰YJlio4 小时前
KB5121003更新详解:安全启动证书、AI组件、资源管理器与安装验证
前端·javascript·后端
紫菜猫一只4 小时前
Vue 3 与 React 常用写法对比
前端
jinggongszh4 小时前
使用AI协同开发产品条码规则功能——从“理解方案、原型、接口文档”到“落地真实前端代码”
前端·人工智能·mes系统·mes工程架构
渔夫正在掘金4 小时前
Cordis 中文教程:渐进式构建插件化应用
前端·node.js·ai编程
打呵欠的猫4 小时前
前端团队 3 个月 AI 实践复盘:哪些场景 ROI 最高,哪些是伪需求
前端·ai编程
gyx_这个杀手不太冷静5 小时前
高级前端开发职业规划(2026—2035)
前端·面试·agent
程序员黑豆5 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
编程快车5 小时前
用 Phaser 4 造一个空间解谜游戏:纯函数棋盘引擎、透明画布分层与轻量双语
前端·程序员
可视之道5 小时前
前端图形编辑器的多选框架:从单选到框选到 Shift 连选
前端
3秒一个大5 小时前
JS 数组去重全方案:从基础到通用万能去重函数
前端·javascript