《从零构建企业级组件库与设计系统的完整指南》,适用于前端工程师在以下场景使用:(1)...
设计系统构建器: 结构化的建设准备组件库和设计系统指南是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
一份结构清晰的指南,用于构建可投入生产的组件库与设计系统。涵盖架构设计、设计令牌(tokens)、组件开发、文档编写、主题定制(theming)、测试策略及发布流程。
| 目标 | 从这里开始 |
|---|---|
| 搭建单体仓库(monorepo) + 构建配置 | 架构 |
| 定义设计令牌 | references/tokens.md |
| 开发组件 | references/component-patterns.md |
| Storybook 配置 | references/storybook-setup.md |
| 主题定制 / 暗色模式 | references/theming.md |
| 测试策略 | references/testing-strategy.md |
| 发布流水线 | references/release-pipeline.md |
使用 pnpm workspaces + Turborepo 管理单体仓库。
my-design-system/ ├── packages/ │ ├── tokens/ # 设计令牌(CSS 变量、JS 对象) │ ├── icons/ # SVG 图标组件 │ ├── components/ # 核心 UI 组件 │ ├── themes/ # 主题定义 │ └── utils/ # 共享工具函数(cn、clsx 等) ├── apps/ │ └── docs/ # Storybook 文档站点 ├── package.json # 根工作区配置 ├── pnpm-workspace.yaml ├── turbo.json └── tsconfig.base.json
# 初始化单体仓库 mkdir my-design-system && cd my-design-system pnpm init pnpm add -D turbo -w # 创建 workspace 配置文件 echo "packages:n - 'packages/*'n - 'apps/*'" > pnpm-workspace.yaml
turbo.json —— 任务流水线配置:
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"dev": { "cache": false, "persistent": true },
"test": { "dependsOn": ["^build"] },
"lint": {}
}
}
| 工具 | 适用场景 | 说明 |
|---|---|---|
| Vite + vite-plugin-dts | React/Vue 组件 | 构建速度快,优先支持 ESM |
| tsup | 工具类包(utility packages) | 零配置,默认同时输出 CJS 与 ESM |
| Rollup | 需精细控制构建行为的场景 | 配置复杂度更高 |
推荐的 packages/components/package.json 示例:
{
"name": "@myds/components",
"version": "0.1.0",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
},
"scripts": {
"build": "tsup src/index.ts --format cjs,esm --dts",
"dev": "tsup src/index.ts --format cjs,esm --dts --watch"
}
}
设计令牌是视觉决策的唯一事实来源(single source of truth)。
请阅读 references/tokens.md,了解完整的令牌 Schema、命名规范、CSS 变量模式,以及多品牌令牌示例。
# 安装 Style Dictionary(令牌转换工具) pnpm add -D style-dictionary -w
令牌源文件存放在 packages/tokens/src/ 目录下。Style Dictionary 将其转换为 CSS 变量、JS/TS 常量,以及平台专属输出(如 iOS、Android)。
核心令牌类别包括:color、typography、spacing、border-radius、shadow、z-index、motion。
每个组件都应遵循一致的约定,以保障长期可维护性。
请阅读 references/component-patterns.md,获取详细模式说明:文件组织结构、Props API 设计、复合组件(compound components)、多态组件(polymorphic components)、无障碍(accessibility)要求,以及文档模板。
anyforwardRef —— React 中所有叶节点(leaf)组件均需支持aria-* 属性 —— 禁止发布任何不符合无障碍标准的组件data-testid —— 必须提供,以支持端到端(E2E)测试Button/ ├── Button.tsx # 组件实现 ├── Button.types.ts # Props 接口与类型导出 ├── Button.test.tsx # 单元测试 + 交互测试 ├── Button.stories.tsx # Storybook 示例 └── index.ts # 公共入口(barrel export)
Storybook 是主要的文档编写与开发环境。
请阅读 references/storybook-setup.md,了解完整配置方案:插件安装、Autodocs、MDX 页面、Controls 控制面板、Storybook UI 主题定制,以及部署方式。
cd apps/docs pnpm dlx storybook@latest init # 提示时选择 React + Vite
必备插件:
@storybook/addon-essentials(Controls、Actions、Docs、Viewport)@storybook/addon-a11y(无障碍审计)@storybook/addon-themes(主题切换)storybook-addon-pseudo-states(hover/focus/active 等伪状态模拟)请阅读 references/theming.md,了解完整主题架构:CSS 自定义属性(custom properties)策略、暗色模式实现方式(媒体查询 vs 类名控制)、React 的 ThemeProvider 模式,以及 Vue 3 的 provide/inject 方案。
令牌定义的是语义别名(semantic aliases),指向基础值(primitives):
/* 基础值 */
--color-blue-500: #3b82f6;
/* 语义化(具备主题感知能力) */
[data-theme="light"] { --color-primary: var(--color-blue-500); }
[data-theme="dark"] { --color-primary: var(--color-blue-400); }
组件仅引用语义令牌 —— 不得直接引用基础值。
请阅读 references/testing-strategy.md,了解完整的测试金字塔模型:单元测试(Vitest)、交互测试(Testing Library)、视觉回归测试(Chromatic/Percy),以及无障碍自动化检测。
[视觉回归测试] ← Chromatic / Percy
[交互测试] ← @testing-library/react
[单元测试 / 逻辑测试] ← Vitest
每个组件的最低测试要求:
请阅读 references/release-pipeline.md,了解完整发布流程:Changesets 配置、版本管理策略、自动生成变更日志(changelog)、CI/CD 流水线,以及 npm 发布机制。
pnpm add -D @changesets/cli -w pnpm changeset init
典型工作流:
pnpm changeset —— 创建 changeset(描述变更内容)pnpm changeset version —— 提升版本号 + 更新 CHANGELOG.mdpnpm changeset publish —— 发布至 npm大部分模式同样适用于 Vue 3,仅需少量适配:
defineProps() 并配合 TypeScript 泛型expose() 替代 React 的 forwardRefprovide/inject 替代 React Context@vue/test-utils + Vitest| 层级 | React | Vue 3 |
|---|---|---|
| 单体仓库(Monorepo) | pnpm + Turborepo | pnpm + Turborepo |
| 构建工具 | tsup / Vite | tsup / Vite |
| 设计令牌 | Style Dictionary | Style Dictionary |
| 文档 | Storybook 8 | Storybook 8 |
| 单元测试 | Vitest + Testing Library | Vitest + @vue/test-utils |
| 视觉回归测试 | Chromatic | Chromatic |
| 发布管理 | Changesets | Changesets |
| CSS 方案 | CSS Modules / CSS-in-JS | CSS Modules / scoped SFC |
相关专题
热门下载
相关下载
精品课程
共86课时 | 27.3万人学习
共18课时 | 6.1万人学习
共31课时 | 4.9万人学习