本文档概述了 React 的构建和发布流程的架构和工作流程。它解释了代码库如何构建成不同的包格式、经过测试以及发布到各种分发渠道。
React 的构建系统使用 Rollup 为各种环境和平台创建优化的包。该系统支持多种包类型(开发、生产、性能分析)、模块格式(CommonJS、ESM)和目标环境(Node.js、浏览器、React Native)。
构建过程为三个不同的发布渠道生成制品:
19.1.0)来源:scripts/rollup/build.js1-130 scripts/rollup/bundles.js10-54 package.json120-153
构建系统支持多种包类型,每种包类型都针对特定的环境和用例:
| 捆绑包类型 | 描述 | 目标环境 |
|---|---|---|
NODE_ES2015 | 适用于 Node.js 的 ES2015 模块 | Node.js |
ESM_DEV | ES 模块(开发版) | 现代浏览器 |
ESM_PROD | ES 模块(生产版) | 现代浏览器 |
NODE_DEV | CommonJS(开发版) | Node.js |
NODE_PROD | CommonJS(生产版) | Node.js |
NODE_PROFILING | 带有性能分析的 CommonJS | Node.js |
BUN_DEV | Bun 运行时(开发版) | Bun |
BUN_PROD | Bun 运行时(生产版) | Bun |
FB_WWW_DEV | Facebook WWW(开发版) | Facebook 内部 |
FB_WWW_PROD | Facebook WWW(生产版) | Facebook 内部 |
RN_OSS_DEV | React Native OSS(开发版) | React Native |
RN_OSS_PROD | React Native OSS(生产版) | React Native |
BROWSER_SCRIPT | 直接浏览器脚本 | 浏览器 |
来源:scripts/rollup/bundles.js10-54 scripts/rollup/build.js49-70
React 的代码库组织成不同的模块类型,服务于特定目的:
来源:scripts/rollup/bundles.js56-67 scripts/rollup/forks.js17-18
每个 React 包都遵循一致的输出结构,旨在支持多种环境:
来源:packages/react-dom/package.json25-49 packages/react/package.json11-22 scripts/rollup/packaging.js41-115
主构建过程由构建脚本编排,该脚本执行以下步骤:
来源:scripts/rollup/build.js633-743 scripts/rollup/build.js354-537
React 维护多个发布渠道,以支持不同级别的稳定性和实验性:
来源:scripts/rollup/build-all-release-channels.js44-146 ReactVersions.js21-64 scripts/rollup/build-all-release-channels.js169-257
React 使用功能标志和模块分支来支持不同的环境和实验性功能。
来源:scripts/rollup/forks.js134-191 scripts/rollup/forks.js242-274 scripts/rollup/build.js432-437
React 使用 GitHub Actions 进行持续集成和部署。
来源:.github/workflows/runtime_build_and_test.yml1-66 .github/workflows/runtime_commit_artifacts.yml1-66 .github/workflows/runtime_prereleases.yml1-66
CI 在各种配置中构建和测试 React。
| 发布渠道 | 环境 | 变体 | 持久模式 |
|---|---|---|---|
| stable | development | false | false |
| stable | production | false | false |
| experimental | development | false | false |
| experimental | production | false | false |
| www-classic | development | false | false |
| www-classic | production | false | false |
| www-classic | development | true | false |
| www-classic | production | true | false |
| www-modern | development | false | false |
| www-modern | production | false | false |
| www-modern | development | true | false |
| www-modern | production | true | false |
| xplat | development | false | false |
| xplat | development | true | false |
| xplat | production | false | false |
| xplat | production | true | false |
| stable | development | false | true |
| experimental | development | false | true |
来源:.github/workflows/runtime_build_and_test.yml222-248
React 版本管理集中在 ReactVersions.js 中。
来源:ReactVersions.js21-64 packages/shared/ReactVersion.js1-16
预发布版本会自动从主分支发布。
-canary-[commit_hash]-[date] 后缀。@next 标签发布到 npm。0.0.0-experimental-[commit_hash]-[date]。@experimental 标签发布到 npm。来源: .github/workflows/runtime_prereleases.yml1-66 scripts/release/utils.js50-72
官方发布遵循手动流程
ReactVersions.js 中的版本号@latest 标签将包发布到 npm来源: ReactVersions.js21-64 .github/workflows/runtime_releases_from_npm_manual.yml1-20
React 还为内部 Meta 平台生成构建
Facebook WWW (网页)
builds/facebook-www 分支Facebook React Native
builds/facebook-fbsource 分支来源: .github/workflows/runtime_commit_artifacts.yml66-76 .github/workflows/runtime_commit_artifacts.yml125-172
构建过程包括监控包大小的工具
这有助于通过防止意外的大小回归来维持性能。
来源: scripts/rollup/stats.js1-16 dangerfile.js41-52 dangerfile.js85-101