CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

React Native 架构:Bridge → JSI → Hermes 与 New Architecture

分类:前端与客户端 · 路径:docs/topics/react-native-architecture/README.md

#react-native#jsi#hermes#fabric#turbomodules#codegen

用 1~2 周从 Bridge 历史到能在 RN 0.74+ New Architecture 下用 JSI / TurboModule / Codegen

父主题

移动端跨平台开发:从原生 iOS/Android 到 React Native / Flutter 与原生桥

子主题(0)

React Native 架构:Bridge → JSI → Hermes 与 New Architecture

0. 元信息

1. 学习路线

RN 起源与 Bridge 历史(async JSON 序列化)
  → Hermes 字节码与启动优化
  → JSI:JS 直调 C++ 与原生(同步调用)
  → Fabric:新渲染管线(UI 主线程 + 同步布局)
  → TurboModules:懒加载 + Codegen
  → New Architecture 启用与迁移
  → Expo 与 EAS Build 关系
  → RN 性能调优(Reanimated / FlashList / MMKV)

2. 阶段周数分配(46 周,每天 1.52 小时)

精简子主题按”运行时 → 渲染 → 模块 → 工具链”四阶段推进,再加一个综合周。

阶段主题周数备注
1RN 起源与 Bridge 局限0.5 周历史包袱理解
2Hermes 与启动优化1 周字节码 + 内存
3JSI 与 Fabric 渲染管线1.5 周同步调用 + UI 主线程
4TurboModules 与 Codegen1 周懒加载 + 类型生成
5Expo / EAS 与发布0.5 周OTA / Build
6性能调优与监控1 周Reanimated / FlashList / MMKV
7综合项目(新架构 demo)1 周含 README + 复盘

选 4 周方案时把第 5/6 阶段压成 1 周。每周留 0.5 天复盘。

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1RN 工程结构(metro / ios / android / src)npx react-native init 跑通能解释 metro.config.js 与 Babel 作用
2Hermes vs JSCHermes 字节码对比能用 hermes-engine 看 HBC
3Bridge 模型(async JSON)旧文档读一遍 + 在 console 看 bridge log能解释为什么 Bridge 在大列表卡顿
4JSI 直调 C++react-native-mmkv 源码能解释 jsi::Runtime 与 HostObject
5Fabric 渲染跑一个含 FlatList 的 RN App,看 layout pass能解释同步布局与 old renderer 差异
6TurboModules + Codegen用 TS Spec 生成原生模块能生成 iOS / Android stub
7New Architecture 启用RCT_NEW_ARCH_ENABLED=1 pod install 跑通真机启动比 Old 快
8Reanimated 3 worklet写一个 60fps 动画UI 线程跑动画,JS 线程卡顿不掉帧
9EAS Build 与 OTAExpo EAS Build 提交一次出 ipa / apk

关键陷阱:用旧文档学 Bridge;忽略 Codegen;Reanimated worklet 当普通 JS 写;JS bundle 不拆包。

4. 第一周任务

任务当天交付
Day 1装 Node 22+、Watchman、Ruby;用 npx @react-native-community/cli init 建工程;启用 HermesRN 0.74+ 工程 + 真机跑
Day 2写 FlatList 列表 + 网络 + 详情,启用 Hermes列表 Demo
Day 3react-native-mmkv,对比 MMKV vs AsyncStorage 启动时间启动时间对比
Day 4react-native-reanimated,写一个 useSharedValue / useAnimatedStyle 动画60fps 动画
Day 5FlashList 替换 FlatList,喂 1 万条数据看帧时间FlashList vs FlatList 帧时间对比
Day 6启用 New Architecture:RCT_NEW_ARCH_ENABLED=1,真机跑New Arch 配置证据
Day 7步骤 A:跑通 RN 最小可用(列表 + 详情 + 动画 + 持久化);步骤 B:补齐 4 类边界(JS bundle 拆分、JS 线程阻塞、原生模块错误、Image 缓存)RN Demo + 边界测试

5. 阶段通用验收

  1. 不看答案独立重写 RN 工程与 New Architecture 配置;
  2. 用自己的话解释 Bridge / JSI / Hermes / Fabric / TurboModules 各自解决什么问题;
  3. 画一张图:Old Arch vs New Arch 调用时序;
  4. 测试正常路径、JS 线程阻塞、原生模块抛错、图片加载失败;
  5. 至少准备 3 组自定义数据并贴出实际渲染;
  6. 记录冷启动、JS bundle 大小、内存峰值、P99 帧时间;
  7. 能修改既有 App 加 TurboModule、加 Reanimated、加 Codegen。

6. 最终验收

7. 综合项目

实现「RN 跨端 Todo」:列表 + 详情 + 离线持久化(MMKV)+ 动画(Reanimated)+ 原生模块(Codegen 写一个 iOS / Android 原生计数器)。成果合入父主题首选综合项目。

本主题贡献

RN New Architecture 把 Bridge 异步 JSON 换成 JSI 同步直调,把渲染换成 Fabric 同步布局,把模块换成 TurboModules 懒加载,三件事必须一次讲清。本子主题专门补齐”为什么 Codegen 不能手写”、“为什么 Reanimated worklet 不能写闭包”、“为什么 MMKV 比 AsyncStorage 快一个数量级”三个常被绕过的点,并把 Hermes 字节码与 New Arch 启用后的量化收益说清。

3 职责

  1. 用 TS Spec → Codegen → Swift / Kotlin stub 的流程,演示一个自定义 TurboModule(计数器),证明类型在单一源真相。
  2. 把 Hermes 字节码(.hbc)与 JSC 对比,冷启动时间 + 内存 + 包体积三个维度出量化差异。
  3. 用 Reanimated 3 worklet + FlashList + MMKV 组合,演示 60 fps 动画与 1 万条数据列表的 P99 帧时间。

4 交付物

  1. 一份 RN 0.74+ 工程(启用 Hermes + New Arch + RCT_NEW_ARCH_ENABLED=1),真机跑通,配 Codegen Spec 一份。
  2. 一份 TS Codegen Spec(src/NativeCounter.ts)+ iOS Swift 实现 + Android Kotlin 实现,类型贯通,包含 iOS requiresMainQueueSetup 与 Android 线程约束。
  3. 一份 Reanimated worklet 动画 + FlashList 大列表 + MMKV 持久化 demo,含 Flipper Performance 截图与 P99 帧时间对照。
  4. 一份 Bridge vs JSI 时序图(Old async JSON vs New sync direct call),对比 FlatList 帧时间数据,证明 Fabric 同步布局收益。

3 指标

  1. 冷启动 < 1.2 s(启用 New Arch + Hermes vs Old Arch 对照)。
  2. 1 万条 FlatList → FlashList 后 P99 帧时间下降 ≥ 50%(Flipper Performance)。
  3. Codegen 类型错误在 build 期拦截率 100%(TS Spec 改一处,原生两端 stub 自动同步)。

React Native DocumentationReact Native New ArchitectureCallstack BlogSoftware Mansion: Reanimated。复制前核对 LICENSE。

8. 推荐资料

React Native DocumentationReact Native New ArchitectureCallstack BlogSoftware Mansion: Reanimated。复制前核对 LICENSE。

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

React Native 在 2015 年开源时,核心假设是「Web 开发者能写移动端」。Bridge 模型让 JS 与 Native 互调,但 JSON 序列化与异步队列在大型列表与高频动画场景下掉帧。2022 年 Meta 推出 New Architecture,把 Bridge 替换为 JSI(同步直调)、把渲染替换为 Fabric(同步布局)、把原生模块替换为 TurboModules(懒加载 + Codegen)。今天任何 RN 工程都建议直接启用 New Architecture。

9.2 概念地图

flowchart TB
  JS[JS 线程] -->|async JSON| Bridge[Old Bridge]
  Bridge --> Native[Native UI / Modules]
  NewArch[New Architecture] --> JSI[JSI 同步调用]
  JSI --> Cxx[C++ 桥接层]
  Cxx --> Fabric[Fabric 渲染]
  Cxx --> Turbo[TurboModules]
  Turbo --> Native
  Hermes[Hermes 字节码] --> JS
  Codegen[Codegen] --> Turbo
  Codegen --> Fabric

9.3 基础知识讲解

9.3.1 论文 / 规范

资料用法
Meta, React Native: A New Architecture设计概览
Meta, JSI SpecJS 直调 C++ 接口
React Native CodegenTS Spec → iOS / Android 桩

9.3.2 书

用法
Emin Toprak, React Native in Action入门
Frank van Puffelen, React Native Cookbook实战

9.3.3 博客 / 文档

资料用法
React Native Blog版本与新架构进展
Callstack: React NativeNew Architecture 案例
Software Mansion: Reanimatedworklet 原理
Shopify: FlashList大列表虚拟化

9.3.4 人物

人物关注点
Jordan WalkeReact Native 起源
Bartłomiej PlewniaNew Architecture 推进
Nicolas CoteFabric 渲染
Krzysztof MagieraReanimated

9.3.5 方法

9.3.6 重点训练材料

9.4 经典问题与经典案例

#问题最简答案
1Bridge 卡顿异步 JSON 序列化;用 JSI 替换
2Hermes 字节码如何预编译Metro transformer 输出 .hbc
3JSI 怎么调原生jsi::Runtime 注册 HostObject
4Fabric 怎么同步布局UI 主线程 + Yoga
5TurboModule 怎么写TS Spec → Codegen → Swift / Kotlin 实现
6Reanimated worklet 怎么跑'worklet' 指令 + UI 线程
7FlashList 为什么比 FlatList 快双向缓存 + 回收
8MMKV 为什么比 AsyncStorage 快mmap + JSI
9JS bundle 怎么拆Metro splitChunks
10New Architecture 怎么启用RCT_NEW_ARCH_ENABLED=1

9.5 学习难点

难点为什么会卡突破路径
Bridge vs JSI 思维模型习惯异步 JSON读 Codegen 生成的 Native stub
Codegen 配置TS Spec 写错react-native-codegen-typescript 校验
Fabric 渲染时序老资料讲 old renderer看 React Native 0.74+ 源码
Reanimated worklet 边界闭包捕获 UI 线程变量runOnUI / runOnJS
New Arch 迁移三方库不兼容用 interop layer

9.6 技术标准与接口

9.6.1 Entity

名称版本组织状态
React Native0.74+Meta + 社区活跃
Hermes0.12+Meta活跃
Reanimated3.xSoftware Mansion活跃
FlashList1.xShopify活跃
MMKV2.xTencent活跃

9.6.2 Scope

RN 负责 JS 渲染与跨端逻辑,原生模块负责系统调用。新架构把异步桥换成同步直调。

9.6.3 Structure

工程结构:android/ + ios/ + src/ + metro.config.js;TS Spec 文件:src/Native*.ts

9.6.4 Ecosystem

Expo、React Navigation、Reanimated、FlashList、MMKV、Sentry、CodePush、EAS Build。

9.6.5 Depth Tiers

层级能力
L0知道 RN / Bridge
L1能读懂 RN 工程
L2能写 RN App + 持久化 + 导航
L3能用 New Architecture + Codegen
L4能设计 TurboModule + Fabric 渲染策略

本子主题目标:L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。

本计划归属:前端与客户端 主 + 工程技术 辅。

代码块 1:RN TurboModule Codegen Spec

// src/NativeCounter.ts
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
  increment(value: number): Promise<number>;
  reset(): void;
}

export default TurboModuleRegistry.getEnforcing<Spec>('NativeCounter');

代码块 2:iOS 实现

// ios/Counter/Counter.swift
import Foundation

@objc(Counter)
public class Counter: NSObject {
  @objc public func increment(_ value: NSNumber,
                              resolver resolve: @escaping RCTPromiseResolveBlock,
                              rejecter reject: @escaping RCTPromiseRejectBlock) {
    resolve(value.intValue + 1)
  }

  @objc public func reset() {
    // no-op
  }

  @objc public static func requiresMainQueueSetup() -> Bool { false }
}

代码块 3:Reanimated worklet

// src/AnimatedBox.tsx
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';

export function AnimatedBox() {
  const x = useSharedValue(0);
  const style = useAnimatedStyle(() => ({
    transform: [{ translateX: x.value }],
  }));
  return (
    <Animated.View
      style={[{ width: 80, height: 80, backgroundColor: 'tomato' }, style]}
      onTouchEnd={() => { x.value = withSpring(x.value + 100); }}
    />
  );
}

代码块 4:Bridge vs JSI 时序

sequenceDiagram
    participant JS
    participant Bridge as Old Bridge
    participant JSI as JSI (New Arch)
    participant Native

    Note over JS,Native: Old: Bridge 异步 JSON
    JS->>Bridge: rpc("increment", 1)
    Bridge-->>Native: 序列化 + 排队
    Native-->>Bridge: 返回
    Bridge-->>JS: Promise resolve

    Note over JS,Native: New: JSI 同步
    JS->>JSI: jsi.invoke("increment", 1)
    JSI->>Native: 同步调用
    Native-->>JSI: 返回
    JSI-->>JS: 同步返回

直接依赖(2)

查看知识图谱