组件库与设计系统:从设计令牌到 Storybook 落地

很多团队把"设计系统"理解成"一套好看的组件",结果做出来的是散落的 UI 库,而不是能支撑产品长期演进的系统。真正意义上的设计系统,是设计语言、组件规范、文档与测试的完整工程:它让不同页面长得一致、让新功能开发更快、让设计与代码保持同频。对 SaaS 与内容站这类需要频繁迭代界面的产品,这是回报最高的前端投资之一。

本文归属前端搭建分类。若你的组件体系要落地到具体框架,可结合React 19Vue 3Web Components 开发指南;视觉风格上可参考Tailwind CSS v4

第一层:设计令牌(Design Tokens)

令牌是设计系统的最小单元——颜色、间距、字号、圆角、阴影、层级等,都以具名变量存在,而不是散落在代码里的魔法数字。前端落地最常用 CSS 自定义属性

:root {
  --color-primary: #2563eb;
  --space-1: 4px;  --space-2: 8px;  --space-4: 16px;
  --radius-md: 8px;
  --font-body: 16px;
}

.card {
  padding: var(--space-4);
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
}

令牌带来两个直接收益:主题化(暗色模式、品牌换肤只需覆盖变量)与一致性(间距、圆角不再因人而异)。令牌还应区分语义层(如 --color-danger)与基础层(如 --color-red-500),让业务代码只依赖语义令牌。

令牌管道:从设计稿到代码

令牌要真正成为"单一事实来源",建议走代码生成而不是手工复制:用 Figma 的 Tokens Studio 插件维护令牌,导出为 JSON,再用 Style Dictionary 编译成 CSS、SCSS 或 Tailwind 主题。一个最小配置:

{
  "source": ["tokens/color.json", "tokens/spacing.json"],
  "platforms": {
    "css": { "transformGroup": "css", "buildPath": "build/", "files": [{ "destination": "tokens.css", "format": "css/variables" }] },
    "tailwind": { "transformGroup": "tailwind", "buildPath": "build/", "files": [{ "destination": "tokens.tailwind.js", "format": "javascript/module" }] }
  }
}

跑一次 npx style-dictionary build,所有平台共享同一份令牌定义,改一个颜色,CSS 变量与 Tailwind 主题同步更新,从根上杜绝"设计稿和代码对不上"。对于没有专职设计工程师的团队,这套管道是把设计规范落到代码的最省力方式。

第二层:组件规范与 API 设计

组件库的价值取决于规范是否明确。写组件前先定义:

  • Props 契约:参数命名、默认值、受控/非受控、事件回调;
  • 变体(variants):size、tone、state 等枚举统一枚举,避免同义不同名;
  • 组合方式:优先"组合优于配置"——用子组件拼接(如 Card.Header/Card.Body),而不是几十个开关参数;
  • 可访问性:键盘操作、焦点管理、ARIA 语义内置进组件(详见无障碍指南)。

遵循"单一职责 + 可组合",组件才能在不同页面安全复用,而不是为每个新页面"复制粘贴改一版"。

第三层:用 Storybook 开发与文档化

Storybook 是组件的"前端工作坊":让开发者在隔离环境里构建 UI 组件与页面,不需要跑通整个应用。核心概念是"story"——组件的一个渲染状态;一个组件可以有很多 story,每个描述一种状态(空态、加载态、错误态、不同尺寸)。安装后自动生成:

npm create storybook@latest
  • Stories:以 CSF 格式编写,配合 Args/Controls 可交互地调整参数实时预览;
  • Docs/Autodocs:Storybook 能分析组件自动生成文档,配合 MDX 形成设计系统站点;
  • Testing:story 天然是测试起点——交互测试、视觉回归(配合 Chromatic)与快照测试都可以基于 story 复用;
  • Sharing:可将 Storybook 发布托管,并嵌入 Notion、Figma,让设计与产品团队直接查看可用状态。

Storybook 支持 React/Vue/Svelte/Web Components 等主流框架(Vite/Webpack 构建均可),是团队"一个组件库、一套文档、一套测试"的常见底座。

用 Storybook 写一个最小示例

以一个 Button 为例,用 CSF(Component Story Format)写一个带 Args 控制的 story:

// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta = {
  title: 'Core/Button',
  component: Button,
  argTypes: { size: { control: 'select', options: ['sm', 'md', 'lg'] } },
} satisfies Meta<typeof Button>;

export default meta;
type Story = StoryObj<typeof meta>;

export const Primary: Story = {
  args: { size: 'md', label: '保存', disabled: false },
};

在 Storybook 里,你可以实时切换 sizelabeldisabled 观察不同状态,无需启动整个应用;这个 story 同时也是交互测试(play 函数)与视觉回归(Chromatic 快照)的起点。组件行为被"文档化地测试",改坏任何一个状态,CI 里立刻红。

第四层:可复用性与演进

设计系统要长期存活,需要治理机制:

  1. 版本化与语义化版本:组件库独立发包,breaking change 走主版本升级;
  2. 变更流程:新增组件先提"组件提案",评审 API 与视觉一致性后再实现;
  3. 文档即规范:用法、边界、弃用说明都写进 story 与 MDX,避免口头约定;
  4. 持续收集反馈:用使用统计发现"高频但没被抽象"的模式,反向沉淀进系统。

落地路径与常见误区

给中小团队一个可执行的节奏,避免"一口吃成胖子":

  1. 第 1-2 周:只建令牌与 5-8 个基础组件(Button、Input、Card、Badge、Modal 等),接入 Storybook 与 Chromatic;
  2. 第 3-6 周:随真实业务抽象领域组件(如 ProductCardEmptyState),把高频模式沉淀下来;
  3. 持续:每新增一个页面先看组件库里有没有可复用的,没有就先抽象再实现。

三个最常见的误区:把组件库当成"样式大全"(只有 CSS 没有行为与无障碍);用几十个布尔参数堆出一个"万能组件"(应组合而非配置);跳过文档(半年后没人知道某个组件该不该用)。避开这三点,设计系统才可能真正存活。

参考:Storybook 官方文档 https://storybook.js.org/docs/、Style Dictionary https://styledictionary.com/、W3C Design Tokens 社区组 https://www.w3.org/community/design-tokens/

16IDC 观察

对中小团队而言,设计系统的正确打开方式是**"自底向上"逐步沉淀**:先搭好令牌与基础组件,再随业务抽象出领域组件,而不是一开始就铺一大套。这样成本可控、见效快。把 Storybook 作为文档与测试的统一入口,配合前端搭建分类中的框架实践,组件库会自然长成团队的基础设施。

原文来源:https://storybook.js.org/docs/get-started