基于 pnpm workspaces + Turborepo 构建的共享基础设施包 Monorepo。
# 安装依赖(同时通过 lefthook 自动配置 Git 钩子)
pnpm install
# 构建所有包
pnpm build
# 运行所有测试
pnpm test
# 并行启动所有包的开发监听模式
pnpm dev
.
├── templates/ # 新建包的代码生成模板(plop)
│ └── package/ # package 脚手架模板
├── packages/ # 共享基础设施包
│ ├── biome-config # 统一的 Biome 代码检查/格式化配置
│ ├── ts-config # 统一的 TypeScript 编译配置
│ ├── tsdown-config # 统一的 tsdown 构建配置
│ ├── vitest-config # 统一的 Vitest 测试配置
│ ├── commitlint-config # 统一的 commitlint 提交规范
│ └── storage # 企业级浏览器存储工具(localStorage / sessionStorage)
└── apps/ # 内部应用(不发布到 npm)
├── storybook # 组件预览(Storybook 10 + Vite)
└── typedoc # API 文档站点
所有包均使用 @iap/ 作用域。
| 命令 | 说明 |
|---|---|
pnpm build |
构建所有包 |
pnpm build:affected |
仅构建自上次提交以来变更的包 |
pnpm dev |
启动所有包的监听模式 |
pnpm test |
运行所有测试 |
pnpm lint |
使用 Biome 检查所有包 |
pnpm type-check |
运行 TypeScript 类型检查 |
pnpm new-package |
交互式脚手架新建包(基于 plop) |
pnpm changeset |
创建变更集以备版本发布 |
pnpm version-packages |
根据变更集升级包版本 |
pnpm publish-packages |
构建并发布包到 npm |
pnpm check-cycles |
检测包之间的循环依赖 |
pnpm dedupe |
对 lockfile 中的依赖去重 |
运行交互式脚手架命令:
pnpm new-package
按提示选择包类型、填写包名和描述,工具会自动生成包含 package.json、tsconfig.json、biome.json、tsdown.config.ts、vitest.config.ts 及初始 src/index.ts 的完整包结构。
包类型说明:
| 类型 | 是否发布 | 说明 |
|---|---|---|
utils |
是 | 纯 TypeScript 工具库 |
components |
是 | React 组件库 |
domain |
是 | 业务领域逻辑包 |
internal |
否 | 内部工具包,不对外发布 |
@iap/biome-config统一的 Biome 代码检查与格式化配置。
// biome.json
{ "extends": ["@iap/biome-config"] } // 基础配置
{ "extends": ["@iap/biome-config/react"] } // React 项目
{ "extends": ["@iap/biome-config/next"] } // Next.js 项目
{ "extends": ["@iap/biome-config/node"] } // Node.js 项目
@iap/ts-config统一的 TypeScript 编译器配置。
// tsconfig.json
{ "extends": "@iap/ts-config/base" } // 基础配置
{ "extends": "@iap/ts-config/react" } // React 项目
{ "extends": "@iap/ts-config/node" } // Node.js 项目
@iap/tsdown-config统一的 tsdown 构建配置。同时输出 ESM 和 CJS 格式,含类型声明文件、sourcemap 及代码压缩。
// tsdown.config.ts
import { baseConfig } from '@iap/tsdown-config'
export default { ...baseConfig, entry: ['src/index.ts'] }
// React 包(自动外部化 react/react-dom):
import { reactConfig } from '@iap/tsdown-config'
// Node.js 包(目标平台 node18,不压缩):
import { nodeConfig } from '@iap/tsdown-config'
@iap/vitest-config统一的 Vitest 测试配置。强制要求行、函数、分支、语句的测试覆盖率均不低于 80%。
// vitest.config.ts
import { mergeConfig } from 'vitest/config'
import { nodeConfig } from '@iap/vitest-config/node' // Node 环境
import { reactConfig } from '@iap/vitest-config/react' // jsdom 环境
export default mergeConfig(nodeConfig, {})
@iap/commitlint-config统一的 commitlint 提交消息规范,格式如下:
[topic]: 描述内容(至少 5 个字符)
# 示例:
[feat]: add gift pack theme update
[fix]: resolve login redirect loop
[refactor]: simplify payment flow handler
执行 pnpm install 时自动安装钩子。
| 钩子 | 检查内容 |
|---|---|
pre-commit |
对暂存文件执行 Biome 自动修复;禁止源码中出现中文字符 |
commit-msg |
通过 commitlint 校验提交消息格式 |
本仓库使用 Changesets 管理版本,包发布到 GitLab Packages 私有 npm 源,构建与发布流程由 Jenkins 执行。
每次功能开发完成后,在推送前创建变更集:
# 1. 交互式选择受影响的包和版本类型(patch / minor / major)
pnpm changeset
# 2. 提交生成的 .changeset/*.md 文件
git add .changeset/
git commit -m "[chore]: add changeset"
git push
# 消费 .changeset/ 记录,更新 package.json 版本号和 CHANGELOG.md
pnpm version-packages
git add .
git commit -m "[chore]: version packages"
git push
代码推送后,在 Jenkins 手动触发 sdk-publish Job,流水线自动执行:
安装依赖 → 类型检查 → 代码检查 → 单元测试 → 构建 → 发布到 GitLab Packages
详细配置见 constraint/publish.md。