菜单

包组织

相关源文件

本文档解释了 React Native 单仓库(monorepo)中包的组织方式。它涵盖了仓库结构、包之间的关系、版本模式以及不同包如何融入 React Native 生态系统。有关构建管道和依赖管理的信息,请参阅 构建管道

单仓库结构概述

React Native 使用单仓库(monorepo)结构,将多个包管理在同一个仓库中。这种方法带来了多项好处,包括简化的依赖管理、跨包的原子化提交以及协调版本控制。

仓库布局

React Native 仓库的组织结构如下:

该仓库被配置为 Yarn 工作区,如根目录的 package.json 文件所定义。

来源:package.json40-44

核心软件包

该仓库包含几十个具有特定职责的包。主要包包括:

描述目的
react-native核心 React Native 框架开发者安装的主要包
@react-native/codegen代码生成工具从 JS 规范生成 C++/ObjC/Java 代码
@react-native/metro-babel-transformerBabel 转换器转换用于 React Native 的 JS 代码
@react-native/community-cli-pluginCLI 插件React Native CLI 的核心命令
@react-native/metro-configMetro 配置默认 Metro 打包器配置
@react-native/babel-presetBabel 预设默认 Babel 配置
@react-native/virtualized-lists列表组件FlatList 和 SectionList 实现
@react-native/js-polyfillsJS polyfillsJavaScript 环境 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/* 命名空间
  • 一些包被标记为私有(不发布到 npm)

来源:packages/react-native/package.json1-5 packages/react-native-codegen/package.json1-5 packages/virtualized-lists/package.json1-5

版本策略

单仓库中的包遵循协调的版本控制策略:

  1. react-native 包使用语义版本(例如,开发版本为 1000.0.0
  2. 支持的 @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 数组,精心选择了要包含在已发布包中的文件。这包括:

  • 核心 JavaScript 实现(Libraries
  • Android(ReactAndroid)和 iOS(React)的原生代码
  • 共享 C++ 代码(ReactCommon
  • 构建脚本和配置文件
  • TypeScript 定义
  • 新项目的模板文件

该包排除了测试文件和其他不必要的文件,以保持合理的包大小。

来源:packages/react-native/package.json34-93

支持包依赖

支持包具有精心管理的依赖关系:

  1. 内部依赖:对其他单仓库包的引用使用相同的版本模式(0.80.0-main
  2. 外部依赖:对外部包(如 Babel)的依赖使用 semver 范围。

例如,@react-native/babel-preset 包依赖于许多具有特定版本范围的 Babel 插件。

来源:packages/react-native-babel-preset/package.json16-62

同样,@react-native/codegen 包既有内部依赖,也有外部依赖。

来源:packages/react-native-codegen/package.json31-54

模块解析

该单仓库通过以下方式包含自定义模块解析配置:

  1. Flow 配置:用于开发时模块解析。
  2. Metro 配置:用于 React Native 应用的运行时模块解析。

.flowconfig 文件包含模块名称映射的配置。

来源:.flowconfig65-68

这使得在单仓库内部,像 import {...} from 'react-native' 这样的导入能够正确解析。

单仓库依赖

单仓库的根目录 package.json 定义了所有包使用的开发依赖。

这些共享的开发依赖确保了单仓库内所有包的工具链一致性。

来源:package.json45-116

包之间的关系

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

示例包和测试

该单仓库包含用于测试和示例的特殊包。

  1. RN Tester:包含示例组件和测试应用程序。
  2. Codegen TypeScript Test:测试 codegen 系统的 TypeScript 功能。

这些包被标记为私有,未发布到 npm。

来源:packages/rn-tester/package.json1-67 packages/react-native-codegen-typescript-test/package.json1-42

包发布控制

该单仓库通过包可见性设置来控制哪些包会被发布。

  1. 公共包:供 npm 公开使用的包。
  2. 私有包:在其 package.json 中标记了 "private": true 的内部包。

私有包包含测试工具和内部实用程序,并非供 React Native 开发者直接使用。

来源:packages/rn-tester/package.json4 packages/react-native-codegen-typescript-test/package.json4