rn项目的架构流程大概疏解

3 阅读6分钟

项目技术架构与运行流程分析

讲一个基于 React Native (0.74.1)  构建的跨平台 AI 助手应用(SwiftChat)。

1. 技术架构概览

项目采用标准的 React Native 混合开发架构,结合了原生能力和 JavaScript 灵活性。

核心栈

  • 框架: React Native 0.74.1 (使用 New Architecture/Codegen 能力)
  • 脚本: TypeScript (TSX)
  • 状态管理: Context API (AppProvider)
  • 路由: React Navigation (Stack + Tab + Drawer)
  • 网络: Axios (封装于 request.ts)
  • 引擎: Hermes (高性能 JavaScript 引擎)

目录结构

  • src/: 核心代码目录

    • api/: 接口定义(如登录、聊天等)
    • components/: 通用 UI 组件(如 CustomInputPageLayout
    • pages/: 业务页面(按模块划分,如 chat/, login/, home/
    • utils/: 工具类(存储管理、网络拦截器、通用函数)
    • App.tsx: 应用主入口,处理导航路由和全局 Provider。
  • ios/: iOS 原生工程目录(含有 Podfile 和 Xcode 工作空间)。

  • android/: Android 原生工程目录(Gradle 配置)。

  • index.js: 原生环境启动 JS 端的桥接起点。


2. CLI 运行机制

项目通过 npm 脚本(定义在 

package.json)管理各个阶段的命令。

开发启动流程

  1. Metro Bundler (npm run start) :

    • 启动 JavaScript 增量打包服务。
    • 监听文件变化,通过 WebSocket 向设备推送热更新(Fast Refresh)。
    • 默认端口: 8081
  2. 平台启动 (npm run ios / npm run android) :

    • 调用 react-native run-ios 或 run-android
    • 编译阶段: 调用系统的编译器(Xcode/xcodebuild 或 Gradle/javac)将原生代码编译为安装包。
    • 部署阶段: 将生成的 .app 或 .apk 安装到已启动的模拟器或真机。

3. 跨平台运行深度解析

iOS 运行原理

  • 依赖管理: 使用 CocoaPods。

  • 环境: 需要 macOS + Xcode。

  • 流程:

    1. pod install 安装原生 C++/ObjC 库。
    2. xcodebuild 构建通用二进制文件。
    3. 启动 Simulator.app
    4. App 启动后向 localhost:8081 请求 index.bundle

Android 运行原理

  • 依赖管理: 使用 Gradle。

  • 环境: 需要 Android SDK + Java (JDK 18+)。

  • 流程:

    1. Gradle 自动下载 dependencies 中的 AAR 包。
    2. 构建 Debug APK
    3. adb 将安装包推送到设备。
    4. 通过 adb reverse 建立端口映射,使真机/模拟器能访问电脑上的 8081 端口。

4. 关键技术点分析

  • Environment: 使用 react-native-config 处理多环境变量(.env.development 等)。
  • 新架构: 项目支持 Codegen(代码自动生成),能自动生成 JS 与原生 C++ 之间的桥接代码。
  • 存储: 使用 react-native-mmkv(比传统 AsyncStorage 快几百倍)。

1. 引擎:Hermes (高性能 JavaScript 引擎)

Hermes 是 Facebook 专门为 React Native 打造的 JS 引擎,旨在优化移动端的性能。

  • 为什么用它?  传统的 JS 引擎(如 V8 或 JSC)是在手机运行 App 时才去编译 JS 代码(即 JIT 编译)。而 Hermes 采用了 预编译(Bytecode Pre-compilation) :在你的电脑打包 App 时,它就已经把 JS 转换成了字节码。

  • 带来的好处

    • 启动更快 (TTI) :App 打开后不需要再编译 JS,直接执行字节码,启动速度大幅提升。
    • 内存占用更低:优化了垃圾回收机制。
    • 安装包更小:编译好的字节码通常比原始 JS 压缩包更小。
  • 调试注意:正如你之前发现的,Hermes 下的网络请求调试需要专门的 CDP 协议支持,这也是为什么 Chrome 或 RN Debugger 连接它有时需要特殊配置。

2. ios/ 与 android/ 目录:原生“容器”

你可以把这两个目录看作是两个独立的、真正的 iOS 和 Android 原生工程,而你的 JS 代码只是运行在这些工程内部的一个“虚拟层”里。

  • ios/ 目录:这就是一个标准的 Xcode 项目

    • 转存失败,建议直接上传图片文件

      Podfile:管理 iOS 平台特有的库依赖(通过 CocoaPods)。

    • AppDelegate.mm:iOS App 的入口,它负责初始化环境,并告诉系统“去哪里找 index.js 包”。

  • android/ 目录:这就是一个标准的 Android Studio 项目

    • build.gradle:类似于 package.json,但负责 Android 的编译配置、SDK 版本和依赖。
    • MainApplication.java:Android App 的起点,负责加载 React Native 运行环境。
  • 总结:当你运行 npm run ios 时,本质上是告诉 Mac:“请去 ios/ 目录下用 Xcode 的工具链把这个工程跑起来”。

3. 转存失败,建议直接上传图片文件index.js:JS 世界的起点

如果说项目是一棵树,

转存失败,建议直接上传图片文件

index.js 就是那颗种子。

  • 核心功能:它是 原生系统 和 JavaScript 代码 之间的第一道桥梁。

  • 关键代码AppRegistry.registerComponent(appName, () => App)

  • 原理:当 iOS/Android 原生代码初始化完毕并准备好一个空的视图容器后,它会询问 JS 端:“我该先展示哪个组件?” 

    转存失败,建议直接上传图片文件

    index.js 里的这行注册代码就是回答:“请展示 

    转存失败,建议直接上传图片文件

    App.tsx 定义的内容”。

4. 新架构与 Codegen (JSI + 代码生成)

这是 React Native 近年来最重大的变革,旨在彻底消除旧架构中“异步桥(Bridge)”导致的性能瓶颈。

  • Codegen (代码生成器)

    • 痛点:以前写原生插件,你需要手动写很多 JS 和 C++/ObjC 的映射代码,非常容易出错。
    • 方案:现在你只需要写一份 TypeScript 类型定义,Codegen 就会自动帮你生成 C++ 的底层代码。这保证了 JS 和原生端在通讯时,数据类型是绝对安全的。
  • JSI (JavaScript Interface)

    • 旧架构:JS 调原生就像发邮件(JSON 序列化 -> 异步发送 -> 原生解析),会有延迟。
    • 新架构 (JSI) :JS 持有原生对象的引用,可以直接调用原生方法(就像调用一个普通的 JS 函数)。
    • 结果:交互变得同步且极快。比如滑动长列表或处理手势时,App 的手感会更加丝滑,不再有卡顿感。

简单总结:

  • index.js 负责把 JS 挂载到原生应用上。
  • ios/android 文件夹是 App 的真实原生外壳。
  • Hermes 让 JS 执行得更快。
  • 新架构/Codegen 让 JS 与原生的沟通从“发邮件”变成了“打直拨电话”。

通俗的讲解总结:

如果你把开发一个 App 比作开一家跨国公司

  • 你的代码(src/ 目录) :是公司的核心业务逻辑。
  • React Native:是帮你出海的服务商。
  • Hermes:是服务商提供的翻译专家(让沟通(执行)极快)。
  • 新架构/Codegen:是服务商帮你架设的专线光纤(让总公司(JS)和分公司(原生)之间没有延迟)。
  • ios/android 文件夹:是服务商在当地(不同系统)帮你租好的办公楼(原生外壳)。
  • index.js:是总公司派驻分公司的联络员(负责启动和对接)。

所以,你现在的这个项目是一个**“配置拉满”**的现代 React Native 工程——它用最快的引擎(Hermes),跑着最新的通讯架构(New Architecture),这让它在模拟器和真机上的表现能无限接近于原生开发的效果。

graph TD
    subgraph "JavaScript 层 (你的业务代码)"
        A[src/Pages & Components] --> B[App.tsx]
        B --> C[index.js]
    end

    subgraph "React Native 运行时 (框架层)"
        C --> D["Hermes Engine (JS 运行时)"]
        D <--> E["JSI (JavaScript Interface)"]
        E <--> F["Fabric (新 UI 渲染引擎)"]
        E <--> G["TurboModules (原生能力)"]
        H["Codegen (生成的桥接代码)"] -.-> E
    end

    subgraph "Native 容器层 (原生壳子)"
        I[ios/ 目录 - ObjC/C++] 
        J[android/ 目录 - Java/C++]
        I <--> F
        I <--> G
        J <--> F
        J <--> G
    end

    subgraph "系统底层 (硬件设备)"
        K[iOS 系统 - UIKit]
        L[Android 系统 - View System]
        I --> K
        J --> L
    end

    style A fill:#e1f5fe,stroke:#01579b
    style D fill:#fff9c4,stroke:#fbc02d
    style E fill:#f8bbd0,stroke:#c2185b
    style I fill:#e8f5e9,stroke:#2e7d32
    style J fill:#e8f5e9,stroke:#2e7d32