本文档解释了 React Native 单仓库(monorepo)中包的组织方式。它涵盖了仓库结构、包之间的关系、版本模式以及不同包如何融入 React Native 生态系统。有关构建管道和依赖管理的信息,请参阅 构建管道。
React Native 使用单仓库(monorepo)结构,将多个包管理在同一个仓库中。这种方法带来了多项好处,包括简化的依赖管理、跨包的原子化提交以及协调版本控制。
React Native 仓库的组织结构如下:
该仓库被配置为 Yarn 工作区,如根目录的 package.json 文件所定义。
该仓库包含几十个具有特定职责的包。主要包包括:
| 包 | 描述 | 目的 |
|---|---|---|
react-native | 核心 React Native 框架 | 开发者安装的主要包 |
@react-native/codegen | 代码生成工具 | 从 JS 规范生成 C++/ObjC/Java 代码 |
@react-native/metro-babel-transformer | Babel 转换器 | 转换用于 React Native 的 JS 代码 |
@react-native/community-cli-plugin | CLI 插件 | React Native CLI 的核心命令 |
@react-native/metro-config | Metro 配置 | 默认 Metro 打包器配置 |
@react-native/babel-preset | Babel 预设 | 默认 Babel 配置 |
@react-native/virtualized-lists | 列表组件 | FlatList 和 SectionList 实现 |
@react-native/js-polyfills | JS polyfills | JavaScript 环境 polyfills |
@react-native/assets-registry | 资源注册表 | 资源处理工具 |
@react-native/normalize-colors | 颜色标准化 | 颜色处理工具 |
来源:package.json40-44 packages/react-native/package.json1-184 packages/react-native-codegen/package.json1-56 packages/community-cli-plugin/package.json1-48
React Native 包遵循特定的命名约定:
react-native@react-native/* 命名空间来源:packages/react-native/package.json1-5 packages/react-native-codegen/package.json1-5 packages/virtualized-lists/package.json1-5
单仓库中的包遵循协调的版本控制策略:
react-native 包使用语义版本(例如,开发版本为 1000.0.0)@react-native/* 包使用与它们所构建的 React Native 版本匹配的版本模式,并带有指示其分支的后缀(例如,0.80.0-main)这种方法确保支持包与它们设计配合使用的 React Native 版本正确匹配。
来源:package.json4 packages/react-native/package.json3 packages/react-native-codegen/package.json3 packages/virtualized-lists/package.json3
react-native 包结构主 react-native 包具有特定的结构,包含几个关键目录:
package.json 文件中的 files 数组定义了要包含在发布的 npm 包中的内容。
来源:packages/react-native/package.json34-93
react-native 包通过 package.json 中的 files 数组,精心选择了要包含在已发布包中的文件。这包括:
Libraries)ReactAndroid)和 iOS(React)的原生代码ReactCommon)该包排除了测试文件和其他不必要的文件,以保持合理的包大小。
来源:packages/react-native/package.json34-93
支持包具有精心管理的依赖关系:
0.80.0-main)例如,@react-native/babel-preset 包依赖于许多具有特定版本范围的 Babel 插件。
来源:packages/react-native-babel-preset/package.json16-62
同样,@react-native/codegen 包既有内部依赖,也有外部依赖。
来源:packages/react-native-codegen/package.json31-54
该单仓库通过以下方式包含自定义模块解析配置:
.flowconfig 文件包含模块名称映射的配置。
这使得在单仓库内部,像 import {...} from 'react-native' 这样的导入能够正确解析。
单仓库的根目录 package.json 定义了所有包使用的开发依赖。
这些共享的开发依赖确保了单仓库内所有包的工具链一致性。
React Native 包之间维护着特定的关系。
此图展示了包之间的依赖关系,其中主 react-native 包集成了许多支持包。
来源:packages/react-native/package.json108-143 packages/community-cli-plugin/package.json24-36 packages/metro-config/package.json28-33 packages/react-native-babel-transformer/package.json17-22
该单仓库包含用于测试和示例的特殊包。
这些包被标记为私有,未发布到 npm。
来源:packages/rn-tester/package.json1-67 packages/react-native-codegen-typescript-test/package.json1-42
该单仓库通过包可见性设置来控制哪些包会被发布。
package.json 中标记了 "private": true 的内部包。私有包包含测试工具和内部实用程序,并非供 React Native 开发者直接使用。
来源:packages/rn-tester/package.json4 packages/react-native-codegen-typescript-test/package.json4