系统架构

总体分层

Rslib 的运行时架构可以分为五层:

层级代表文件职责
入口层packages/core/src/cli/index.tspackages/core/src/index.ts初始化 CLI 或暴露编程式 API
配置加载层packages/core/src/loadConfig.tspackages/core/src/cli/init.ts查找配置文件、加载 env、合并 CLI 参数
Rslib 编排层packages/core/src/createRslib.ts创建 Rslib 实例,提供 build、inspect、mf-dev
配置派生层packages/core/src/config.ts将每个 lib 转成 Rsbuild environment
插件执行层packages/core/src/css/*asset/*exe/*packages/plugin-dts/src/*在 Rsbuild 或 Rspack 生命周期中处理 CSS、资源、dts、exe 等产物

架构图

配置模型

Rslib 的顶层配置继承 Rsbuild 配置,同时要求 lib 是非空数组。每个 lib 是一个“库目标”,常见字段包括:

字段作用
idenvironment 名称。没有显式 id 时会根据格式生成,如 esmcjsesm0
format输出格式,支持 esmcjsumdiifemf
bundle是否打包,默认 truefalse 进入 bundleless 路径
source.entry构建入口;bundleless 可使用 glob
autoExtension根据格式自动选择 .mjs.cjs.js 等扩展名
autoExternal根据 package.json 依赖自动 external
redirectbundleless 中重写 JS、style、asset、dts 引用路径
dts声明文件生成配置
shimsCJS 或 ESM 互操作 shim
experiments.exe基于 Node SEA 生成可执行文件

packages/core/src/types/config.ts 是维护配置类型的主文件。类型注释中也维护了很多默认值说明,修改运行时默认值时需要同步类型注释和用户文档。

多 Environment 模型

Rslib 使用 Rsbuild environments 表达多格式输出。composeRsbuildEnvironments 的流程是:

  1. composeCreateRsbuildConfig 遍历 lib 数组。
  2. 每个 lib 与共享 Rsbuild 配置合并。
  3. composeLibRsbuildConfig 根据格式、target、bundle、entry、dts 等字段生成派生配置。
  4. 内置常量配置、派生配置和用户配置合并成最终 environment config。
  5. 生成 environment id,并检查重复 id。

配置合并优先级

composeCreateRsbuildConfig 明确保留了合并顺序:

优先级配置来源含义
createConstantRsbuildConfigRslib 内置最佳实践,如 chunkSplit、buildCache、extensionAlias、默认 target
composeLibRsbuildConfig根据 Rslib 特有字段推导出的 Rsbuild 和 Rspack 配置
用户配置用户直接写入的 Rsbuild 字段,去掉 lib 专属字段后参与最终合并

这个顺序很重要:派生配置需要覆盖部分内置默认值,而用户仍应能覆盖大多数底层 Rsbuild 配置。维护时不要随意调整合并顺序,否则会改变用户配置的优先级契约。

插件与生命周期

Rslib 主要复用 Rsbuild 插件机制:

插件或模块生命周期作用
BundlePluginonBeforeEnvironmentCompilebundle 模式下阻止 preserve JSX
EntryChunkPluginRspack hooks注入 CJS 下 import.meta.url shim,并在 bundleless watch 中登记目录依赖
pluginLibCssprocessAssetsmodifyBundlerChainbundleless 中替换 CSS extract loader 和插件,删除全局 CSS 虚拟 JS 资产
pluginLibAssetmodifyBundlerChain区分 JS 资产和 CSS 资产,默认 preserve asset import
pluginDtsonBeforeEnvironmentCompileonAfterBuild生成和后处理声明文件
ExePluginonAfterEnvironmentCompileJS 构建成功后生成单文件可执行程序

数据流和产物流

关键维护原则

  • 修改 config.ts 时要同时考虑 format、target、bundle、multi compiler 和 --lib 裁剪。
  • 修改 externals 顺序要谨慎。当前顺序是 warn、用户 externals、auto external、target externals、bundleless externals,bundleless 重写依赖前面步骤先放行或命中。
  • 修改 dts 插件时要分别验证普通 tsc、composite、build、watch、bundle、isolated 和 tsgo 分支。
  • 修改输出文件名或扩展名时要同时检查 JS、CSS、asset、dts redirect,避免 bundleless import 指向不存在的文件。