本页面文档记录了 React Native 构建流水线架构,它将你的源代码转换为可在 iOS 和 Android 平台上运行的应用程序。构建流水线通过协调一致的工具和流程系统,集成了 JavaScript、原生代码(Objective-C、Swift、Java、Kotlin)和 C++ 组件。
有关代码生成的具体信息,请参阅 代码生成。有关单仓库(monorepo)包组织结构,请参阅 包组织。
React Native 构建流水线由几个相互关联的系统组成,它们协同工作以编译、打包和部署应用程序。
来源:package.json1-117 yarn.lock1-443 packages/react-native/ReactAndroid/build.gradle.kts1-80 packages/react-native/scripts/react_native_pods.rb1-50
React Native 的 JavaScript 代码通过一个专门的流水线进行处理。
Metro 打包器负责打包 JavaScript 资源、应用转换并将最终的 bundle 提供给原生应用程序。默认的转换器是 @react-native/metro-babel-transformer,它应用 React Native 特定的 Babel 配置。
来源:packages/react-native-babel-transformer/package.json1-29 packages/react-native-babel-preset/package.json1-21 packages/metro-config/package.json1-30 packages/community-cli-plugin/package.json1-48
React Native 的 Babel 预设包含专门针对 React Native 开发的转换,处理以下功能:
该预设定义在 @react-native/babel-preset 中,并被 Metro 转换器使用。
来源:packages/react-native-babel-preset/package.json16-29
React Native 采用特定于平台的构建系统来编译和打包原生代码。
Android 构建系统使用 Gradle,并通过 Kotlin DSL 构建文件进行配置。
关键组件
来源:packages/react-native/ReactAndroid/build.gradle.kts1-459 packages/react-native/ReactAndroid/src/main/jni/CMakeLists.txt1-119 packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake1-123
iOS 构建流水线主要通过 CocoaPods 进行管理。
iOS 构建系统高度依赖 CocoaPods 进行依赖管理和与 Xcode 的集成。核心文件 react_native_pods.rb 包含了 React Native iOS 构建的主要配置。
来源:packages/react-native/scripts/react_native_pods.rb1-100 packages/react-native/scripts/react_native_pods.rb400-471 packages/react-native/scripts/cocoapods/utils.rb1-100
React Native 依赖于多个 C++ 库,这些库需要正确下载、准备和构建。
| 库 | 目的 | 版本 来源 |
|---|---|---|
| Boost | 通用 C++ 工具 | libs.versions.toml |
| Folly | Facebook 开源库 | libs.versions.toml |
| glog | Google 日志库 | libs.versions.toml |
| DoubleConversion | 字符串↔双精度浮点数转换 | libs.versions.toml |
| fmt | 格式化库 | libs.versions.toml |
| fast_float | 快速浮点数解析器 | libs.versions.toml |
| Yoga | 布局引擎 | 内部信息 |
准备过程因 Android 和 iOS 而异。
Android 使用 Gradle 任务下载和准备 C++ 库。
来源:packages/react-native/ReactAndroid/build.gradle.kts248-408
iOS 使用以下任一方式:
ReactNativeDependencies pod 进行预构建的依赖项选择由 ReactNativeDependenciesUtils.build_react_native_deps_from_source() 决定。
来源:packages/react-native/scripts/react_native_pods.rb172-181
功能标志在构建流水线中起着至关重要的作用,尤其是在新架构方面。
新架构组件(Fabric、TurboModules)根据环境变量和功能标志有条件地包含在内。
来源: packages/react-native/scripts/react_native_pods.rb62-99 packages/react-native/scripts/cocoapods/new_architecture.rb1-50 packages/react-native/defaults/DefaultNewArchitectureEntryPoint.kt1-110
Android 构建的主要入口点
Gradle 任务:
:packages:react-native:ReactAndroid:build - 构建 React Native Android 库架构入口点:
DefaultNewArchitectureEntryPoint - 配置和加载新架构来源: packages/react-native/defaults/DefaultNewArchitectureEntryPoint.kt1-110 packages/react-native/defaults/DefaultTurboModuleManagerDelegate.kt1-21
对于 iOS,主要的构建入口点是
CocoaPods 函数:
use_react_native! - 将 React Native 包含到 iOS 项目中的主入口点react_native_post_install - 安装后配置构建阶段:
来源: packages/react-native/scripts/react_native_pods.rb62-214 packages/react-native/scripts/react_native_pods.rb422-471
构建流程会产生几个关键的产物
| 平台 | 产物 | 描述 |
|---|---|---|
| JavaScript | index.bundle | 打包后的 JavaScript 代码 |
| JavaScript (Hermes) | index.bundle.hbc | Hermes 字节码 |
| Android | libappmodules.so | 原生模块共享库 |
| Android | *.aar | 库的 Android 归档文件 |
| iOS | *.framework | iOS 框架 |
| iOS | libReact.a | 包含 React Native 的静态库 |
| Codegen | 生成的 C++/ObjC/Java 文件 | 用于 JavaScript-Native 通信的接口 |
来源: packages/react-native/package.json34-94 packages/rn-tester/package.json1-59
应用程序通过特定的配置文件与 React Native 构建流程集成
来源: packages/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake1-123 packages/react-native/defaults/DefaultNewArchitectureEntryPoint.kt31-69
来源: packages/react-native/scripts/react_native_pods.rb62-214 packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec1-87
构建流程集成了开发工具,以增强开发体验
Metro 开发服务器:
原生调试:
构建脚本:
react-native run-android、react-native run-ios)来源: package.json7-38 packages/rn-tester/package.json15-27
React Native 构建流程是一个复杂的系统,它协调 JavaScript、原生代码和 C++ 组件来生产跨平台应用程序。了解此流程的不同部分有助于开发人员有效地定制和排查其构建过程。
要点
来源: package.json1-117 packages/react-native/package.json1-184 packages/react-native/ReactAndroid/build.gradle.kts1-459 packages/react-native/scripts/react_native_pods.rb1-471