React Native 中 JSX 编译流程与虚拟 DOM 到原生视图的转换详解

27 阅读4分钟

目录

  1. JSX 编译流程
  2. 虚拟 DOM 的生成与协调
  3. 虚拟 DOM 到原生视图的转换
  4. 新旧架构对比
  5. 关键技术与模块

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%

关键技术解析

  1. JSI 直接内存访问

    • 通过 C++ Host Objects 实现 JS 与原生代码双向直接操作内存,消除 JSON 序列化瓶颈
    • 支持同步调用模式,实时响应 UI 交互事件
  2. 渲染管线重构

    • 布局计算下沉到 C++ 层,与 iOS/Android 原生布局引擎对齐
    • 采用双缓冲技术(Shadow Tree + Commit Phase)保证渲染原子性
  3. 线程模型优化

    • 合并 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 消除性能瓶颈,实现更流畅的跨平台渲染。