核心构建流程

从命令到构建

CLI 入口位于 packages/core/bin/rslib.js,最终调用 packages/core/src/cli/index.ts 中的 runCLIrunCLI 做三件事:

  1. 初始化 NODE_ENVbuildinspect 默认生产模式,其他命令默认开发模式。
  2. 根据 --log-level 提前设置日志级别。
  3. 打印版本问候并注册命令。

命令定义在 packages/core/src/cli/commands.ts。当前主要命令包括:

命令行为关键方法
rslibrslib build生产构建,可传 --watchrslib.build
rslib inspect输出 Rslib、Rsbuild、Rspack 配置rslib.inspectConfig
rslib mf-dev启动 Module Federation 格式的 dev serverrslib.startMFDevServer

CLI 参数覆盖

packages/core/src/cli/init.ts 负责将 CLI 参数覆盖到配置上。流程如下:

覆盖规则集中在 applyCliOptions

CLI 参数覆盖目标
--format每个 lib.format
--bundle--no-bundle每个 lib.bundle
--entry每个 lib.source.entry
--syntax每个 lib.syntax
--dts--no-dts每个 lib.dts
--target每个 lib.output.target
--externals每个 lib.output.externals
--dist-path每个 lib.output.distPath.root
--tsconfig每个 lib.source.tsconfigPath

parseEntryOption 支持两种 entry 写法:name=path 显式命名,或直接传路径并根据 basename 生成名称。如果多个隐式 entry basename 冲突,会追加序号。

配置加载

packages/core/src/loadConfig.ts 包含两个公共能力:

  • defineConfig:只做类型辅助,原样返回配置或配置函数。
  • loadConfig:查找并加载 rslib.config.*

默认查找顺序为:

  1. rslib.config.mjs
  2. rslib.config.ts
  3. rslib.config.js
  4. rslib.config.cjs
  5. rslib.config.mts
  6. rslib.config.cts

如果用户显式传 --config,则只解析该路径并在不存在时报错。如果没有配置文件,CLI 会创建一个默认 config.lib = [{}],让纯 CLI 参数也能完成构建。

createRslib 实例

packages/core/src/createRslib.ts 是编程式 API 的核心。它返回的 RslibInstance 包含:

方法用途
build生成 environments,创建 Rsbuild 实例并执行 build
inspectConfig生成 environments 并调用 Rsbuild inspectConfig,同时返回 Rslib 原始配置
startMFDevServer只筛选 format: "mf" 的 environments,启动 dev server
onAfterCreateRsbuild注册 Rsbuild 实例创建后的回调
getRslibConfig返回当前 Rslib 配置对象

createRslib 还会处理 env 文件:

  • options.loadEnv 开启时,调用 Rsbuild 的 loadEnv
  • 将 public env vars 合并到 config.source.define
  • 将 env file paths 存进 _privateMeta.envFilePaths,watch restart 时可纳入监听。
  • 在 build 或 dev server close 时执行 env cleanup。

Build 流程

Watch 模式下,CLI 会增加一个 rslib:on-after-build 插件,在首次编译后输出“watching for changes”日志。CLI 还会通过 restart.ts 监听配置文件和 env 文件变化,重启构建实例。

Inspect 流程

inspectConfig 的目的不是执行构建,而是让维护者看到 Rslib 经过派生后的 Rsbuild 和 Rspack 配置。它会:

  1. 设置 NODE_ENV 或指定 inspect mode。
  2. 调用 composeRsbuildEnvironments
  3. 创建 Rsbuild 实例。
  4. 调用 rsbuildInstance.inspectConfig
  5. extraConfigs 中附带 Rslib 原始配置。
  6. 返回字符串化后的 rslibConfig 以及 Rsbuild inspect 结果。

此外,applyDebugInspectConfigPlugin 会在 DEBUG 包含 rslib key 时自动把 Rslib、Rsbuild、Rspack 配置写入磁盘,便于定位配置派生问题。

Module Federation Dev Server

startMFDevServer 只针对 format: "mf"

  1. 设置 NODE_ENV=development
  2. 生成 environments 和带格式信息的 environment 列表。
  3. 如果传入 --lib,只选择对应 id 的 MF environment。
  4. 没有找到 MF environment 时抛出明确错误。
  5. 创建 Rsbuild dev server,并把 close 函数注册给 restart 系统。

这一设计避免非 MF library environment 被误用于 dev server,因为普通库构建不需要 Rsbuild 应用 dev server。

公共 API 出口

packages/core/src/index.ts 明确定义 @rslib/core 的公共 API。维护时应把这里视为稳定边界:

  • CLI:runCLI
  • 实例:createRslib
  • 配置:defineConfigloadConfigloadEnvmergeRslibConfig
  • 类型:RslibConfigLibConfigFormatDtsBuildOptions
  • Rsbuild 透传:rsbuild namespace、RspackrspackRsbuildPlugin