目录
1. JSX 编译流程
1.1 JSX 代码编写
开发者使用 JSX 语法描述 UI:
function App() {
return (
<View style={{ flex: 1 }}>
<Text>Hello React Native</Text>
</View>
);
}
1.2 Babel 转译
通过 @babel/plugin-transform-react-jsx,JSX 被转换为 React.createElement 调用:
// 转译后
React.createElement(
View,
{ style: { flex: 1 } },
React.createElement(Text, null, 'Hello React Native')
);
###1.3 React 元素生成 React.createElement 生成轻量级 JavaScript 对象(虚拟 DOM 节点):
{
type: View,
props: {
style: { flex: 1 },
children: {
type: Text,
props: { children: 'Hello React Native' }
}
}
}
2. 虚拟 DOM 的生成与协调
2.1 虚拟 DOM 树构建
-
React 通过递归调用 React.createElement 构建完整的虚拟 DOM 树。
-
树节点包含组件类型、属性、子节点等信息。
2.2 协调(Reconciliation)
-
Diffing 算法:比较新旧虚拟 DOM 树,找出差异(如属性变化、组件增删)。
-
Fiber 架构:将更新拆分为可中断的异步任务,优先级调度高响应操作(如用户输入)。
3. 虚拟 DOM 到原生视图的转换
###3.1 React Native Renderer 介入
-
渲染器角色:将 React 元素映射为原生组件(如 View → UIView/ViewGroup)。
-
组件注册:通过 requireNativeComponent 将原生组件暴露给 JS 层。
###3.2 Yoga 布局计算
-
布局引擎:使用 Yoga(基于 Flexbox)计算组件尺寸与位置。
-
样式转换:将 JS 样式对象转换为 Yoga 布局指令:
// JS 样式
{ flex: 1, margin: 10 }
// Yoga 指令
YGNodeStyleSetFlex(node, 1);
YGNodeStyleSetMargin(node, YGEdgeAll, 10);
3.3 原生视图更新
#####旧架构(Bridge 通信)
1. 序列化操作: 将更新操作(如 createView、updateView)序列化为 JSON 消息。
**2.跨线程通信:**通过 Bridge 的 MessageQueue 发送到原生模块(主线程/UI 线程)。
**3.UIManager 执行:**原生端的 UIManager 解析消息并调用原生 API 更新视图。
#####新架构(Fabric + JSI) **1. 直接内存访问:**通过 JSI(JavaScript Interface)实现 JS 与原生代码直接通信。
**2. 同步操作:**跳过序列化,直接调用 C++ 层的 UIManager 方法。
**3. Shadow Tree:**在 C++ 层维护与虚拟 DOM 对应的树形结构,通过指针交换实现原子提交。
四、React Native 新旧架构核心对比
| 特性 | 旧架构(Bridge) | 新架构(Fabric) | 优势分析 |
|---|---|---|---|
| 通信方式 | 异步 JSON 消息队列 | 同步 JSI 直接调用 | 消除异步序列化开销,通信延迟降低 40%-60% |
| 布局计算 | JS 线程计算后通过 Bridge 发送 | 直接在 C++ 层计算 | 减少 2-3 次线程跳跃,布局计算耗时缩短 30%+ |
| 渲染性能 | 高延迟(序列化 + 跨线程) | 低延迟(内存共享 + 同步操作) | 首屏渲染时间优化 50%+,复杂列表滚动帧率提升至 60FPS |
| 线程模型 | 多线程(JS/UI/Native) | 贴近原生渲染流程 | 主线程负载降低 35%,内存抖动减少 50% |
关键技术解析
-
JSI 直接内存访问
- 通过 C++ Host Objects 实现 JS 与原生代码双向直接操作内存,消除 JSON 序列化瓶颈
- 支持同步调用模式,实时响应 UI 交互事件
-
渲染管线重构
- 布局计算下沉到 C++ 层,与 iOS/Android 原生布局引擎对齐
- 采用双缓冲技术(Shadow Tree + Commit Phase)保证渲染原子性
-
线程模型优化
- 合并 JS 线程与原生模块线程,减少 50%+ 的线程切换开销
- 引入优先级调度机制,确保用户输入和动画优先执行
##5. 关键技术与模块 ###5.1 核心模块 Babel: JSX 转译器。
React Reconciler: 协调虚拟 DOM 差异。
Yoga: 跨平台布局引擎。
Bridge/JSI: JS 与原生通信层。
Fabric Renderer: 新架构的渲染器实现。
###5.2 性能优化 Fabric批量更新: 合并多次 setState 减少渲染次数。
Fabric虚拟化列表: 仅渲染可见区域内容(如 FlatList)。
FabricHermes 引擎: 优化 JS 执行效率,减少启动时间。
##总结 JSX → 虚拟 DOM: 通过 Babel 和 React 构建轻量级 JS 对象树。
协调更新: Fiber 架构实现高效差异计算与优先级调度。
原生映射: 通过渲染器 + Yoga 将虚拟 DOM 转换为平台特定 UI。
架构演进: 新架构通过 JSI 和 Fabric 消除性能瓶颈,实现更流畅的跨平台渲染。