跳到主要内容

架构与运行机制 ✅

聚焦 RN 架构/运行时、通信与渲染、旧/新架构迁移与 Hermes。

RN 的整体架构与渲染原理?

答案

核心概念:

RN 采用 JS 线程(React/业务) + 原生 UI 线程(渲染/交互) 的双线程, 通过桥(旧架构)或 JSI(新架构)通信;React 的虚拟树映射为原生控件树。

示例说明:

JS: React 计算 → 生成更新 → 发送给原生
Native: 接收更新 → 渲染 UIView/View → 事件回传 JS

面试官视角:

  • 要点清单: 双线程模型;虚拟树 → 原生控件
  • 加分项: 知道旧/新通信差异
  • 常见失误: 认为 RN 直接编译成原生

延伸阅读:

JS ↔ 原生通信是如何实现的?

答案

核心概念:

旧架构通过异步序列化(Bridge)批量分发;新架构以 JSI 直接对象与函数,延迟更低、同步/异步更灵活。 内核采用 JavaScriptCore(Hermes 可选)。

  1. RN 向 JS 传递信息

示例说明:

旧: batched JSON message → Bridge → Native
新: JSI function/object binding → direct call

延伸阅读:

Fabric 渲染管线是什么?

答案

核心概念:

Fabric 是新渲染系统,改进布局/测量/提交,支持并发更新与更稳定的 UI 性能,减少中间对象创建。

示例说明:

Shadow Tree → Layout → Mount → Commit (并发友好)

面试官视角:

  • 要点清单: 渲染阶段;并发/稳定性
  • 加分项: 真实落地与迁移经验
  • 常见失误: 认为 Fabric 自动解决重渲染

延伸阅读:

  • 官方新架构资料

TurboModule 与旧 NativeModule 的差异?

答案

核心概念:

TurboModule 借助 Codegen 生成类型安全绑定,支持 JSI;更快的模块查找/调用;旧模块基于反射/字符串。

示例说明:

// 代码生成的类型声明(示意)
export interface DeviceSpec { getDeviceName(): Promise<string> }

面试官视角:

  • 要点清单: 类型安全;调用路径优化
  • 加分项: Codegen 流程与调试
  • 常见失误: 混用旧模块导致不兼容

延伸阅读:

  • 新架构模块文档

Hermes 引擎的价值与限制?

答案

核心概念:

Hermes 面向 RN 的轻量 JS 引擎,支持字节码预编译、快启、低内存;需关注 Intl/Proxy 等差异与第三方兼容。

示例说明:

收益: 启动/内存;成本: 兼容/体积评估

面试官视角:

  • 要点清单: 启动与内存收益;不适用场景
  • 加分项: 线上切换评估;字节码缓存
  • 常见失误: 忽视 polyfill/Intl

延伸阅读:

UI 组件如何映射到原生控件?

答案

核心概念:

RN 组件(Text/View/Image/ScrollView 等)映射到 iOS 的 UIView 层级/Android 的 View/ViewGroup;平台样式与行为差异需适配。

示例说明:

<Text> → UILabel/TextView, <View> → UIView/ViewGroup

面试官视角:

  • 要点清单: 映射关系;差异适配
  • 加分项: 跨端组件库沉淀
  • 常见失误: 期望 1:1 Web 行为

延伸阅读:

  • 组件文档

事件与手势从原生回传 JS 的过程?

答案

核心概念:

原生捕获手势/点击 → 通过 Bridge/JSI 回传 → JS 更新状态/触发动画;复杂手势建议原生驱动(Reanimated/GestureHandler)。

示例说明:

Native touch → dispatchEvent → JS handler → setState/animate

面试官视角:

  • 要点清单: 事件来源;回传与延迟
  • 加分项: 原生驱动动画;中断策略
  • 常见失误: JS 驱动长链路动画

延伸阅读:

  • Reanimated/GestureHandler 文档

旧 → 新架构迁移路径与风险?

答案

核心概念:

升级 RN 版本并开启新架构开关,优先改造自研模块/关键三方库;逐步验证 Fabric/TurboModule 兼容性与性能。

示例说明:

步骤:评估 → 升级 → 开关 → 模块改造 → 回归/灰度

面试官视角:

  • 要点清单: 库兼容;灰度与回滚
  • 加分项: 指标对比报告
  • 常见失误: 一次性重构,缺乏回滚

延伸阅读:

  • 迁移指南

常见通信与渲染瓶颈有哪些?

答案

核心概念:

频繁跨桥调用、大对象传输、深层次重渲染、图片解码与主线程阻塞;需合并更新/数据裁剪/原生驱动动画/懒加载。

示例说明:

排查:setState 次数/大小 → Bridge 调用数 → 图片 → JS CPU

面试官视角:

  • 要点清单: 定位维度;优化策略
  • 加分项: 持续监控与阈值告警
  • 常见失误: 只凭体验,无数据

延伸阅读:

  • Performance 文档