夜雨聆风学习资料网

ARTICLE · 1010295

组件库搭建指南:设计规范 + 组件文档 + 前端实现思路

组件库搭建指南:设计规范 + 组件文档 + 前端实现思路
COMPONENT LIBRARY GUIDE

         组件库搭建指南       

         设计规范 · 组件文档 · 前端实现思路       

Design TokenFigmaReact / Vue
设计工程化系列阅读约 15 分钟

       上一篇我们聊了 B 端页面从需求到交付的完整流程,其中提到了「组件库落地」这个环节。这篇文章把它展开,从零讲清楚怎么搭建一套能用、好用、可持续维护的组件库。     

       组件库不是设计师在 Figma 里画几个按钮就完了。它需要三个层面的支撑:设计规范(定义长什么样)、组件文档(说明怎么用)、前端实现(让设计稿变成代码)。这三者缺一不可。     

       下面我们逐个拆开来讲。     

全文目录
一、设计规范:组件库的基石
1.1 Design Token 体系 / 1.2 色彩 / 1.3 字体 / 1.4 间距与栅格 / 1.5 圆角与阴影
二、组件文档:让所有人都能正确使用
2.1 组件分类 / 2.2 文档结构 / 2.3 命名规范 / 2.4 版本管理
三、前端实现:从设计稿到可用代码
3.1 技术选型 / 3.2 目录结构 / 3.3 组件开发范式 / 3.4 主题方案 / 3.5 与设计工具的衔接
四、常见问题与避坑指南

一、设计规范:组件库的基石

Design Specification

       设计规范是组件库的「宪法」。所有组件的视觉表现,都必须从这套规范中派生出来。如果规范不清晰,组件就会各自为政,最后变成一堆拼凑的零件,而不是一套系统。     

1.1 Design Token 体系

一切规范的起点

       Design Token 是组件库最底层的设计资产。它把颜色、字号、间距等视觉属性抽象成一组可命名、可复用、可映射到代码的变量。     

       为什么要用 Token 而不是直接写色值?因为 Token 是设计和开发之间的公共语言。设计师说「这个按钮用 color-primary」,开发知道是 var(--color-primary),两边对得上。     

【图片示意:Design Token 三层结构】
基础 Token(Global Token)
blue-500: #1f6feb / gray-100: #f6f8fa / spacing-4: 16px
↓ 映射
语义 Token(Semantic Token)
color-primary / color-text-secondary / spacing-md
↓ 应用
组件 Token(Component Token)
button-bg-primary / input-border-color / card-padding

       三层 Token 的关系:     

基础 Token:最原始的值,如 blue-500 = #1f6feb。不直接用在组件上。
语义 Token:赋予含义的别名,如 color-primary = blue-500。表达的是「做什么」而不是「是什么」。
组件 Token:绑定到具体组件的属性,如 button-bg-primary = color-primary。换主题时只需改语义 Token,组件自动跟着变。       

1.2 色彩系统

少即是多

       B 端色彩系统的核心原则:主色少,功能色准,中性色够用就行。     

【图片示意:色彩系统一览】
主色(品牌色)
Primary
#1f6feb
Hover
#388bfd
Active
#0c5bbf
功能色
成功
#238636
警告
#d29922
错误
#f85149
信息
#1f6feb
中性色(灰阶)
900
800
700
600
500
400
300
200
100
50
注意:中性色不要只定义 3-4 个灰阶就完事。B 端界面大量使用灰色,至少需要 8-10 个层级。另外,文字色建议分三级:标题色(gray-900)、正文色(gray-700)、辅助色(gray-500)。       

1.3 字体系统

稳定比好看更重要

       B 端字体选择的首要原则:系统默认字体优先。不要为了好看引入自定义字体——B 端页面文字量大,自定义字体的加载时间会严重影响首屏体验。     

【图片示意:字体系统规范】
语义名称
字号
字重
行高
使用场景
Display
24px
700
32px
页面大标题
Heading 1
20px
600
28px
模块标题
Heading 2
16px
600
24px
卡片标题 / 小节标题
Body
14px
400
22px
正文内容 / 表格文字
Caption
12px
400
18px
辅助说明 / 时间戳 / 标签
Small
12px
400
16px
表格辅助信息 / 单位
字体栈推荐:font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;       

1.4 间距与栅格

4px 基准,一切皆倍数

       间距系统是 B 端设计中最容易出错、也最影响视觉一致性的部分。规则很简单:所有间距值必须是 4 的倍数。     

【图片示意:间距阶梯】
Token 名称
值
使用场景
spacing-xs
4px
图标与文字间距、紧凑标签内边距
spacing-sm
8px
表单项内间距、小元素间隔
spacing-md
12px
卡片内边距、按钮内边距
spacing-lg
16px
模块间距、内容区 padding
spacing-xl
24px
页面边距、大区块间距
spacing-2xl
32px
页面级区块分隔

       栅格方面,B 端常用的是 24 栏栅格,内容区最大宽度通常为 1200px 或 1440px。侧边栏宽度固定(通常 200-240px 折叠态 64px),内容区自适应。     

1.5 圆角与阴影

微小的差异,巨大的秩序感

       圆角建议定义 3-4 级就够了:     

【图片示意:圆角阶梯】
radius-sm
2px
按钮/输入框
radius-md
4px
卡片/弹窗
radius-lg
8px
大面板/容器
radius-full
9999px
标签/头像

       阴影建议定义 3 级:     

shadow-sm:0 1px 2px rgba(0,0,0,0.06) — 卡片、下拉菜单
shadow-md:0 4px 12px rgba(0,0,0,0.08) — 弹窗、浮层
shadow-lg:0 8px 24px rgba(0,0,0,0.12) — 模态框、全屏弹层       
设计规范小结
         一套完整的设计规范应包含:
         · Design Token 体系(基础层 → 语义层 → 组件层)
         · 色彩系统(主色 + 功能色 + 8-10 级灰阶)
         · 字体系统(5-6 级字号阶梯)
         · 间距系统(4px 基准,6-8 级阶梯)
         · 圆角(3-4 级)与阴影(3 级)
         · 图标规范(尺寸、线宽、风格统一)       

二、组件文档:让所有人都能正确使用

Component Documentation

       设计规范定好了,接下来要把每个组件的使用方式文档化。好的组件文档不只是给设计师看的,产品、开发、测试都需要能看懂。     

2.1 组件分类

       B 端组件库通常把组件分为以下几类:     

【图片示意:组件分类体系】
分类
包含组件
说明
通用
Button / Icon / Typography / Link
最基础的原子组件,被其他所有组件依赖
布局
Grid / Layout / Space / Divider
页面结构和间距控制
数据录入
Input / Select / DatePicker / Form / Upload / Switch / Checkbox / Radio
用户输入和表单场景
数据展示
Table / Tag / Badge / Descriptions / Tree / Statistic / Tooltip
信息的展示和阅读
反馈
Modal / Drawer / Message / Notification / Alert / Popconfirm / Skeleton
操作结果和系统状态反馈
导航
Menu / Tabs / Breadcrumb / Steps / Pagination / Dropdown
页面导航和层级指引

       实际项目中,还会有一类「业务组件」——基于通用组件组合而成、承载特定业务逻辑的高阶组件。比如「审批流程节点」「高级搜索面板」「数据筛选器」等。     

2.2 单个组件的文档结构

       每个组件的文档应该包含以下内容,缺一不可:     

【图片示意:组件文档结构模板】
Button 按钮
通用 · 基础组件
① 概述
一句话说明组件的用途
② 示例
组件的多种状态和变体截图
③ API / 属性表
所有 props 的名称、类型、默认值、说明
④ 使用场景
什么时候用、什么时候不用
⑤ 设计规范
尺寸、间距、颜色等视觉约束
⑥ 交互说明
hover、click、disabled、loading 等状态描述
⑦ 变更记录
版本号、修改日期、修改内容

       以 Button 为例,API 属性表应该长这样:     

属性
类型
默认值
说明
type
string
'default'
primary / default / dashed / text / link
size
string
'middle'
large / middle / small
disabled
boolean
false
是否禁用
loading
boolean
false
是否加载中
icon
ReactNode
-
按钮内的图标
onClick
function
-
点击回调

2.3 命名规范

       组件命名是设计师和开发最容易扯皮的地方。建议在项目启动时就定好规则:     

Figma 图层命名:采用 BEM 风格,如 btn / btn--primary / btn__icon
前端组件命名:PascalCase,如 Button / Button.Group / DatePicker.RangePicker
CSS 类名:kebab-case + 命名空间前缀,如 .my-btn / .my-btn--primary / .my-btn__icon
Token 命名:层级-类别-语义-状态,如 color-bg-primary-hover / spacing-component-padding

2.4 版本管理

       组件库一定要做版本管理,否则迟早会乱。建议:     

         · 遵循 语义化版本号(SemVer):主版本.次版本.修订版本
         · 主版本(1.0 → 2.0):不兼容的 API 变更
         · 次版本(1.0 → 1.1):新增组件或功能,向下兼容
         · 修订版本(1.0.0 → 1.0.1):Bug 修复、样式微调
         · 每次发布附带 Changelog,说明改了什么、影响哪些组件
         · Figma 组件库用 Page 或 Section 区分版本,或使用 Figma 的 Branch 功能       
组件文档小结
         好的组件文档应该做到:
         · 每个组件有完整的 7 段式文档结构
         · API 属性表覆盖所有 props,含类型、默认值、说明
         · 命名规则在项目开始时就定好,全团队统一执行
         · 版本号和 Changelog 跟踪每次变更       

三、前端实现:从设计稿到可用代码

Frontend Implementation

       设计规范和组件文档解决了「是什么」和「怎么用」的问题,前端实现解决的是「怎么做成代码跑起来」的问题。     

3.1 技术选型

       组件库的技术选型需要考虑几个维度:     

维度
选项
建议
框架
React / Vue 2 / Vue 3
跟团队主栈保持一致
语言
JavaScript / TypeScript
强烈推荐 TypeScript,类型定义就是文档
样式方案
CSS Modules / Less / Sass / CSS-in-JS / Tailwind
Less + CSS Modules(可维护性好、隔离性强)
构建工具
Webpack / Rollup / Vite / Father
Father(antd 团队出品)或 Rollup
文档工具
Storybook / Dumi / Styleguidist
Dumi(React)/ VitePress(Vue)
测试
Jest + Testing Library / Vitest
Jest + @testing-library/react

3.2 目录结构

       一个典型的组件库目录结构:     

【图片示意:组件库目录结构】
my-ui/ ├── components/            // 组件源码 │   ├── button/ │   │   ├── index.tsx      // 组件实现 │   │   ├── index.less     // 组件样式 │   │   ├── index.test.tsx // 单元测试 │   │   ├── index.md       // 组件文档 │   │   └── interface.ts   // 类型定义 │   ├── input/ │   ├── table/ │   └── ... ├── styles/                // 全局样式 │   ├── tokens.less        // Design Token │   ├── reset.less         // 样式重置 │   └── mixins.less        // 样式函数 ├── docs/                  // 文档站源码 ├── .umirc.ts              // 文档站配置 ├── package.json ├── tsconfig.json └── README.md 

       关键原则:每个组件一个文件夹,所有相关文件(实现、样式、测试、文档、类型)都放在一起。这样维护的时候不用满项目找文件。     

3.3 组件开发范式

       以 React + TypeScript 为例,一个 Button 组件的基本写法:     

         components/button/interface.ts       
export interfaceButtonProps {   type?: 'primary' | 'default' | 'dashed' | 'text' | 'link';   size?: 'large' | 'middle' | 'small';   disabled?: boolean;   loading?: boolean;   icon?: React.ReactNode;   onClick?: (e: React.MouseEvent) => void;   children?: React.ReactNode; } 
         components/button/index.tsx       
import React from'react'; import classNames from'classnames'; import { ButtonProps } from'./interface'; import'./index.less';  constprefixCls = 'my-btn';  constButton: React.FC<ButtonProps> = ({   type = 'default',   size = 'middle',   disabled = false,   loading = false,   icon,   onClick,   children, }) => {   const cls = classNames(prefixCls, {     [`${prefixCls}--${type}`]: type,     [`${prefixCls}--${size}`]: size,     [`${prefixCls}--disabled`]: disabled,     [`${prefixCls}--loading`]: loading,   });    return (     <buttonclassName={cls} disabled={disabled} onClick= {onClick}>       {loading && <spanclassName="${prefixCls}__loading" />}       {icon && <spanclassName="${prefixCls}__icon">{icon}</span>}       <span>{children}</span>     </button>   ); };  export default Button; 

       几个关键点:     

1. 类型定义和实现分离:interface.ts 单独放类型,方便其他组件引用。
2. 样式类名用前缀:避免全局污染,如 my-btn--primary 而不是 .primary。
3. 属性有默认值:保证组件在不传任何 props 时也能正常渲染。
4. classnames 库:动态拼接类名的标准做法,比手动拼字符串干净得多。
5. 组件导出方式:default export 用于单组件,命名 export 用于类型。       

3.4 主题方案

       B 端组件库经常需要支持换肤——同一套组件在不同客户那里需要不同的品牌色。实现主题切换有三种主流方案:     

方案一:CSS 变量(推荐)
           把所有 Design Token 定义为 CSS 自定义属性,切换主题时只需替换根元素上的变量值。         
/* 默认主题 */:root {   --color-primary: #1f6feb;   --color-bg: #ffffff; } /* 深色主题 */[data-theme="dark"] {   --color-primary: #388bfd;   --color-bg: #0d1117; }
优点:原生支持、性能好、运行时切换无闪烁。缺点:低版本 IE 不支持。
方案二:Less/Sass 变量编译时替换
           把 Token 定义为 Less 变量,构建时通过 modifyVars 参数生成不同主题的 CSS 文件。适合需要兼容 IE 的项目。缺点是无法运行时切换,需要加载不同的样式文件。         
方案三:CSS-in-JS(styled-components / emotion)
           通过 ThemeProvider 注入主题对象,组件内部通过 props 读取主题值。灵活性最高,但有一定运行时开销,且对 SSR 场景需要额外处理。         

3.5 与设计工具的衔接

       设计和开发之间最大的痛点是信息不同步。设计师改了一个颜色,开发不知道;开发发现某个交互实现不了,反馈不回去。解决这个问题需要建立几条通道:     

【图片示意:设计-开发协作流程】
Figma 设计稿
Token + 组件
→
Token 同步工具
Figma Tokens / Style Dictionary
→
代码 Token 文件
tokens.less / tokens.ts
Figma 组件
Auto Layout + Variants
→
标注/切图工具
Figma Dev Mode / 蓝湖
→
前端组件代码
React / Vue 组件

       具体来说,推荐以下几个实践:     

1. Token 双向同步:使用 Figma Tokens 插件管理 Token,定期导出为代码变量;代码端改了 Token 也要回写到 Figma。
2. 组件命名一致:Figma 里的组件名和代码里的组件名必须完全对应。Button 就是 Button,不要设计师叫「按钮」开发叫 Btn。
3. 定期走查对齐:每两周做一次设计走查,对比设计稿和线上实现的差异,记录偏差清单。
4. 共享组件 API 文档:把组件文档放在设计师和开发都能访问的地方(如 Notion / Confluence / 内部文档站)。       
前端实现小结
         组件库前端实现的核心要点:
         · 选型跟团队主栈走,TypeScript 必选
         · 每个组件一个文件夹,实现/样式/测试/文档/类型放在一起
         · 类型定义(interface)单独文件,方便复用
         · 主题方案推荐 CSS 变量(兼容性允许的话)
         · 和设计工具之间建立 Token 同步 + 命名一致 + 定期走查的协作机制       

四、常见问题与避坑指南

踩过的坑就不用再踩了

Q1:组件库一上来就想做到完美,结果迟迟不能交付
不要追求一步到位。先覆盖最高频使用的 20 个核心组件(Button、Input、Select、Table、Form、Modal、Menu、Tabs、Pagination、Tag 等),能支撑 80% 的业务页面就行。剩下的组件随业务迭代逐步补充。       
Q2:设计师和开发对组件的理解不一致
组件评审会是解决这个问题的最有效方式。在开发每个新组件之前,设计师和开发一起过一遍:这个组件有哪些变体?有哪些状态?交互细节是什么?边界情况怎么处理?对齐之后再开工。       
Q3:组件库更新了,业务项目不升级
         这是组件库推广中最常见的阻力。几个办法:
         · 向下兼容:尽量不在小版本中做破坏性变更
         · 变更日志透明:每次更新都发 Changelog,标注影响范围
         · 自动化检测:用 CI 脚本检测项目中使用的组件版本,落后太多就发告警
         · 定期升级日:每月固定一天作为「组件库升级日」,集中处理升级工作       
Q4:组件库该放在哪里维护?
         推荐独立 Git 仓库 + npm 私有包发布。设计文件在 Figma 中维护,用一个专门的「组件库」团队文件。代码仓库和设计文件通过命名规则和文档链接关联。如果团队规模小,至少做到代码仓库独立,不要和业务代码混在一起。       
Q5:怎么衡量组件库的建设成果?
         几个可量化的指标:
         · 组件覆盖率:业务页面中使用组件库组件的比例(目标 > 80%)
         · 页面搭建效率:一个新页面从设计到上线的平均耗时是否下降
         · 设计还原度:走查时发现的偏差数量是否逐月减少
         · 组件复用率:单个组件在多少个页面中被使用       

最后

         组件库建设这件事,说到底是工程思维在设计领域的落地。       

         它不是画几套好看的页面就完了,而是要把设计决策系统化、可复用、可演进。设计规范定义标准,组件文档降低沟通成本,前端实现保证落地质量——三者形成闭环,组件库才能真正发挥价值。       

         最后分享一个判断组件库是否成功的简单标准:一个新来的设计师或开发,能不能在半天之内,只靠看文档就用组件库搭出一个完整的页面?

         如果能,说明你的组件库做得不错。如果不能,回去检查一下,大概率是文档的问题。       

如有疑问,欢迎在评论区交流。
— END —

相关学习资料