create-rslib 脚手架系统

系统定位

packages/create-rslib 提供 create-rslib CLI,用于快速创建基于 Rslib 的库项目。它不直接参与 Rslib 构建链路,但决定新用户项目的初始结构、默认配置和可选工具组合。

入口文件是 packages/create-rslib/src/index.ts。底层复用 create-rstack 的 create 能力。

模板体系

基础模板列表在 TEMPLATES 中维护:

模板语言场景
node-dual-jsJavaScriptNode ESM 加 CJS 双格式包
node-dual-tsTypeScriptNode ESM 加 CJS 双格式包
node-esm-jsJavaScriptNode 纯 ESM 包
node-esm-tsTypeScriptNode 纯 ESM 包
react-jsJavaScriptReact 组件库
react-tsTypeScriptReact 组件库
vue-jsJavaScriptVue 组件库
vue-tsTypeScriptVue 组件库
svelte-jsJavaScriptSvelte 组件库
svelte-tsTypeScriptSvelte 组件库

用户显式传 --template 时,会调用 parseTemplateName。如果模板名没有以 -ts 或 -js 结尾,默认补 -ts;如果只传 ts 或 js,会报错。

交互式选择

未传模板时,getTemplateName 会依次询问:

  1. 项目类型:Node pure ESM、Node dual、React、Vue、Svelte。
  2. 语言:TypeScript 或 JavaScript。

最终模板名格式是 {templateName}-{language}。

Lint 模板映射

create-rstack 支持 ESLint 和 Rslint 模板映射。Rslib 的映射逻辑是:

项目模板ESLint 模板Rslint 模板
React对应 react-js 或 react-ts对应 react-js 或 react-ts
Vue对应 vue-js 或 vue-tsvanilla-js 或 vanilla-ts
Svelte对应 svelte-js 或 svelte-tsvanilla-js 或 vanilla-ts
Nodevanilla-js 或 vanilla-tsvanilla-js 或 vanilla-ts

额外工具叠加

extraTools 会在基础模板生成后继续合并工具模板。

React Compiler

条件:模板以 react- 开头。

行为:

  • 从 template-react-compiler/{templateName} 复制文件到目标目录。
  • 合并 package.json。
  • 将工具目录加入 AGENTS.md 搜索目录。

Rspress

条件:模板以 react-ts 开头。

行为:

  • 从 template-rspress/{templateName} 复制文件到目标目录。
  • 合并 package.json。
  • 读取生成项目 package name。
  • 替换 docs/Button.mdx 和 tsconfig.json 中的 {{ packageName }}。
  • 将工具目录加入 AGENTS.md 搜索目录。

Storybook

条件:模板以 react 或 vue 开头。

行为:

  • 从 template-storybook/{templateName} 复制文件到目标目录。
  • 合并 package.json。
  • 将工具目录加入 AGENTS.md 搜索目录。

Agent Skills 注入

脚手架可选择安装以下 skills:

Skill条件
rslib-best-practices总是可选
rstest-best-practices总是可选
rspress-custom-theme选择 Rspress 工具时
rspress-description-generator选择 Rspress 工具时

这些 skills 来自 rstackjs/agent-skills,目的是让新项目天然带有维护和文档生成指导。

维护流程

新增或调整模板时建议按顺序检查:

  1. 更新 TEMPLATES 或交互式选项。
  2. 确认模板目录存在,并包含必要的 package.json、rslib.config.*、rstest.config.*。
  3. 如果模板适配 ESLint 或 Rslint,需要更新映射逻辑。
  4. 如果模板可叠加额外工具,确认 extraTools.when 条件和目标目录一致。
  5. 更新 packages/create-rslib/test 中的测试。
  6. 运行 create-rslib 单元测试或针对性生成项目验证。

常见风险

  • 模板名和目录名不一致会导致交互可选但复制失败。
  • 额外工具使用 package.json merge,版本冲突要在模板层处理。
  • Rspress 工具依赖 package name 占位符替换,新增文件中若有占位符也要加入替换列表。
  • 修改 parseTemplateName 会影响 CLI 非交互用法,必须保留默认 ts 的用户体验,除非做 breaking change。