资讯动态

从设计令牌到组件化:构建企业级设计系统的工程实践

发布时间:2026/8/21 10:49:42 来源:尧图企业网站定制
1. 项目概述一个设计系统的诞生与价值最近在整理团队过去一年的项目文档发现一个很有意思的现象凡是那些开发周期短、上线后用户反馈好、后续迭代顺畅的项目背后都有一个共同点——它们都严格遵循了我们内部搭建的一套设计系统。这套系统我们内部称之为“基石”Foundation而它的开源版本就是今天想和大家深入聊聊的Jaywalker-not-a-whitewalker/DesignSystem。你可能觉得设计系统不就是一套UI组件库吗比如Ant Design、Material-UI拿过来用不就行了确实在项目初期直接使用成熟的第三方库是最高效的选择。但随着业务复杂度指数级上升团队规模扩大你会逐渐发现“拿来主义”的局限性品牌视觉无法深度融入、业务组件沉淀困难、设计开发协作像在“传纸条”、不同产品线间的体验割裂感越来越强。这个时候一个量身定制、贯穿产品灵魂的设计系统就不再是“锦上添花”而是“雪中送炭”的工程必需品。DesignSystem项目正是为了解决这些问题而生的。它不是一个简单的组件仓库而是一套完整的、用于构建数字产品的一致性的单点事实来源Single Source of Truth。它包含了从设计理念、视觉语言色彩、字体、间距、圆角、到可交互的React/Vue组件、以及配套的设计工具插件Figma/ Sketch Libraries、开发文档和使用指南的完整体系。它的核心目标是让设计变得可预测让开发变得可复用让产品体验变得一致且高效。无论你是独立开发者、创业团队的前端负责人还是大厂里疲于应付各种定制化需求的设计师理解并实践一套设计系统的构建思路都将极大地提升你的产出质量和团队协作效率。2. 设计系统的核心架构与设计决策构建一个设计系统远不是把按钮、输入框的代码堆在一起那么简单。它需要自上而下的顶层设计和自下而上的工程实践相结合。我们的DesignSystem主要分为四层设计令牌Design Tokens、基础组件Base Components、复合组件Composite Components和模式与文档Patterns Documentation。2.1 设计令牌系统的基石与“单一数据源”设计令牌是整个系统中最抽象、也最核心的一层。你可以把它理解为连接设计与开发的“翻译官”和“合同”。它用代码通常是CSS变量或JavaScript对象来定义所有视觉原语比如颜色、字体、间距、阴影等。为什么不用直接的CSS值或Sass变量早期的尝试中我们确实用过Sass变量。但很快问题就出现了设计师在Figma里改了主色我们需要手动同步更新Sass变量文件然后通知所有开发者更新依赖、重新构建。这个过程极易出错且无法保证所有产品线同步更新。设计令牌通过建立“命名-值”的映射关系并利用工具链自动同步到代码库和设计工具确保了“单一数据源”。在我们的系统中一个颜色令牌的定义是这样的// design-tokens/colors.js export const colors { // 语义化命名而非视觉描述 primary: { 50: #e6f7ff, 100: #bae7ff, 500: #1890ff, // 品牌主色 600: #096dd9, }, neutral: { 0: #ffffff, 100: #f5f5f5, 900: #262626, }, feedback: { success: #52c41a, warning: #faad14, error: #ff4d4f, } };然后在CSS或CSS-in-JS中通过主题提供者来消费/* 通过CSS变量使用 */ :root { --color-primary-500: #1890ff; } .button-primary { background-color: var(--color-primary-500); }关键决策语义化命名 vs 视觉化命名。我们坚决采用了语义化命名如primary,text-primary,background-success而不是blue-500,gray-800。这是因为业务品牌色可能会变今天蓝色明天可能绿色但“主要操作按钮”这个语义是稳定的。语义化命名极大地提升了系统的可维护性和主题切换能力。2.2 基础组件与复合组件的分层策略基础组件是系统的原子它们是无状态的、纯粹的、只负责最基础的交互和展示。例如Button、Input、Icon。它们的所有样式都完全依赖于设计令牌不包含任何业务逻辑。基础组件的封装哲学我们遵循“开放闭合原则”。组件对外提供清晰的、基于设计令牌的API如variant‘primary’,size‘medium’内部实现则对外封闭。例如Button组件内部会根据传入的variant去映射对应的颜色令牌和间距令牌开发者无需关心具体的色值是多少。// 基础Button组件使用示例 Button variantprimary sizelarge onClick{handleClick} 确认提交 /Button复合组件则是由基础组件组合而成用于解决特定的、复杂的交互场景例如DatePicker、DataTable、Form with Validation。这一层可以适当包含一些业务逻辑但应尽量保持通用性。我们通常将业务强相关的组件放在具体项目的仓库中而非设计系统主库以保证核心系统的稳定和纯净。分层的好处是显而易见的当需要修改全局的边框圆角时你只需要更新border-radius相关的设计令牌所有基于该令牌的Button、Card、Modal都会自动更新。当需要构建一个新的业务页面时你可以像搭积木一样快速组合基础组件和复合组件无需从零开始写样式和基础交互。2.3 工具链与协作流程的整合设计系统若想成功必须融入日常工作流而不是一个需要额外“遵守”的规范。我们为此搭建了关键的工具链设计同步工具如 Style Dictionary 或 Theo将设计令牌从中心化的JSON或JS文件中自动生成适用于WebCSS变量、SCSS、iOSSwift、AndroidXML的格式并同步至Figma等设计工具。设计师在Figma中使用的样式库与代码库中的令牌完全同源。组件文档站如 Storybook 或 Docz这是系统的“门户”。它不仅展示组件外观和API更重要的是提供可交互的演示和代码示例。我们强制要求每个组件的PR都必须更新对应的Storybook story这相当于可视化的单元测试。版本化与发布流程设计系统采用语义化版本SemVer进行发布。任何破坏性变更Breaking Change都必须升级主版本号。我们通过Changesets工具管理版本更新日志确保使用者能清晰了解变更内容和影响范围。踩坑心得文档的即时性比完整性更重要。初期我们追求大而全的文档结果维护成本极高很快文档就落后于代码。后来我们转变思路采用“代码即文档”和“文档驱动开发”。组件的Props类型定义TypeScript Interface就是最准确的API文档Storybook中的交互示例就是最直观的使用指南。鼓励开发者在编写组件时同步编写最基本的文档示例这比事后补一份长篇大论要有效得多。3. 核心组件的设计与实现细节以系统中最典型、也最复杂的两个组件——Button和Modal——为例拆解其设计实现中的关键细节。3.1 Button组件不仅仅是样式封装一个健壮的Button组件需要考虑的远不止颜色和圆角。可访问性A11y是首要考量按钮必须能被键盘聚焦tabindex“0”并通过回车或空格键触发需要提供清晰的aria-label给屏幕阅读器特别是在只有图标的情况下按钮的禁用状态disabled不仅要视觉上变灰还要设置aria-disabled“true”并阻止所有交互事件。状态管理的完整性一个按钮至少包含默认default、悬浮hover、点击active、聚焦focus、禁用disabled五种状态。每种状态的颜色对比度都需要符合WCAG标准确保色觉障碍用户也能清晰辨识。我们使用设计令牌来定义这些状态.button { background-color: token(‘color-primary-500’); color: token(‘color-neutral-0’); } .button:hover { background-color: token(‘color-primary-600’); } .button:focus-visible { /* 注意使用focus-visible而非focus */ outline: 2px solid token(‘color-primary-300’); outline-offset: 2px; } .button:disabled { opacity: 0.6; cursor: not-allowed; }加载状态的处理异步操作时按钮应切换为加载状态并防止重复提交。我们通过在按钮内部集成一个状态管理来实现对外暴露loading这个布尔值prop。在加载状态下按钮文字变为加载中提示并显示一个微型的旋转指示器同样使用设计令牌定义的颜色。3.2 Modal模态框组件管理与性能的平衡模态框是全局性的UI组件其设计难点在于状态管理和渲染性能。状态管理的全局性我们摒弃了在每个需要弹窗的页面都放置一个Modal组件标签的做法。而是采用了一个全局的ModalProvider配合一个useModal的Hook。在任何子组件中你只需要调用const { openModal } useModal()然后传入弹窗的内容组件和配置即可。ModalProvider会负责在DOM的顶层如#root的同级渲染弹窗避免z-index和样式继承问题。性能优化模态框的内容可能很复杂。我们使用React的lazy和Suspense来实现内容组件的动态加载。只有当弹窗被触发时相关的代码块才会被加载。同时我们确保模态框在关闭时其内容组件能被正确卸载释放内存。动画与用户体验模态框的入场和退场动画必须流畅且不阻塞主线程。我们使用CSSkeyframes或transition来实现淡入和上滑动画并确保animation-fill-mode设置正确。更重要的是需要管理好焦点focus trap打开时焦点应移至弹窗内的第一个可交互元素关闭时焦点应回到触发它的按钮上。这通常需要借助useRef和useEffect来手动管理。实操要点处理Modal的滚动锁定。当模态框打开时背景页面应禁止滚动。一个常见的错误是简单地为body添加overflow: hidden。这在桌面端有效但在移动端可能会使页面整体向左偏移因为滚动条消失。更健壮的做法是在打开模态框时计算当前页面的滚动位置然后给body添加一个fixed定位并手动将其top值设为-${scrollTop}px以模拟锁定在原位的效果。关闭时再恢复。社区库body-scroll-lock很好地解决了这个问题。4. 设计系统的落地、推广与维护挑战构建系统只是第一步让团队愿意用、喜欢用、坚持用才是真正的挑战。4.1 渐进式落地策略我们反对“一刀切”的强制迁移。取而代之的是“渐进式接纳”策略“试点”项目选择一个正在启动的中等规模新项目作为试点。与项目团队紧密合作全程使用设计系统并收集第一手的反馈和问题。这个项目的成功将成为最好的宣传案例。“双轨制”并行对于庞大的存量项目我们提供“双轨制”方案。允许在项目的某些新模块或重构部分中引入设计系统与旧样式共存。我们提供了详细的“适配层”指南帮助开发者处理样式覆盖和冲突问题。提供迁移工具和指南开发了简单的代码转换脚本Codemod可以将一些常用的旧组件类名自动替换为新的设计系统组件。同时提供详尽的迁移对比文档展示旧写法与新写法的对比并清晰列出收益体积减小、性能提升、一致性更好。4.2 建立反馈与贡献闭环一个封闭的系统终将死亡。必须建立开放的反馈和贡献机制。我们在内部Git仓库设立了design-system项目并设置了清晰的贡献指南CONTRIBUTING.md。任何开发者都可以提交Issue报告bug或提出新组件需求也可以提交Pull Request。我们引入了“需求评审会”制度每周对收集到的需求进行讨论和优先级排序。对于被采纳的、尤其是非核心团队提交的PR我们会给予公开表扬和奖励激励社区贡献。版本沟通至关重要每次发布新版本我们不仅发布更新日志还会通过内部博客、技术分享会等形式重点介绍**“为什么”要做这个变更**以及**“如何”平滑升级**。对于破坏性变更我们会提前一个主版本发布弃用警告Deprecation Warning并给出明确的迁移时间表。4.3 长期维护的纪律维护设计系统是一场马拉松需要严格的纪律。代码质量门禁所有PR必须通过ESLint、Stylelint、TypeScript类型检查以及所有单元测试测试覆盖率要求90%。我们使用Visual Regression Testing视觉回归测试如Chromatic来捕捉任何意外的UI变更。设计评审Design Review任何新的设计令牌或组件在进入开发前必须经过核心设计团队的设计评审确保其符合系统的设计语言和扩展性。开发评审Code Review所有代码必须经过至少两名核心维护者的Review重点审查API设计是否简洁、可访问性是否完备、性能是否有隐患。定期“健康检查”每季度我们会进行一次系统性的“健康检查”包括分析最常用的组件和最少用的组件、收集用户满意度调查、审计代码库的依赖和技术债、评估文档的清晰度。根据检查结果制定下一季度的优化计划。常见陷阱过度抽象与“瑞士军刀”组件。早期我们曾设计过一个超级弹窗组件试图通过无数个props来满足所有场景表单弹窗、确认弹窗、详情弹窗、全屏弹窗……。结果就是API极其复杂难以维护和使用。后来我们领悟到设计系统的目标是提供好的积木而不是预建所有房子。现在我们更倾向于提供简单、稳定、组合性好的基础组件Modal, Form, Card让业务层去组合它们。一个组件只做好一件事并把它做到极致。5. 衡量设计系统成功的核心指标投入了这么多精力如何证明设计系统的价值不能只靠感觉需要有数据支撑。开发效率指标组件复用率统计核心组件如Button, Input在项目中被使用的次数。复用率的提升直接意味着重复劳动的减少。UI开发时间对比使用系统前后完成一个标准列表页或表单页的平均前端工时。理想情况下应有显著下降。设计到开发的交付时间测量从设计稿标注完成到前端实现出可交互UI的平均时间。设计系统通过减少沟通和样式调整应能缩短这个周期。产品一致性指标视觉一致性审计得分定期从线上产品随机抽样页面检查颜色、字体、间距、组件等是否符合设计令牌规范给出一个量化得分。用户调研反馈在用户访谈或问卷中加入关于产品视觉和交互一致性的问题观察正面反馈的趋势。代码健康度指标CSS体积变化监控使用设计系统后项目打包产物中CSS的体积变化。由于样式复用和按需加载总体积应有下降。重复样式规则使用工具扫描项目统计重复定义的样式规则数量应随着系统推广而减少。无障碍问题数使用自动化无障碍测试工具如axe-core扫描由于系统组件内置了可访问性整体问题数应呈下降趋势。团队协作指标设计稿与实现的一致性通过像Zeplin、Figma Compare这样的工具自动检测实现界面与设计稿的像素差异差异度应越来越低。关于UI样式问题的沟通次数统计团队沟通工具如Slack、钉钉中关于“这个颜色对不对”、“这个间距是多少”这类问题的讨论频率频率降低意味着系统运行良好。建立这些指标的看板并定期向团队和领导汇报不仅证明了设计系统的投资回报率ROI也能帮助团队发现问题持续优化系统本身。构建和维护一个设计系统就像经营一个产品。它需要清晰的愿景、持续的投入、对用户的深刻理解以及拥抱变化的灵活性。Jaywalker-not-a-whitewalker/DesignSystem这个项目记录了我们从零到一从一到N的完整历程。它带来的最大回报不仅仅是更快的开发速度和更一致的界面更是一种团队协作范式的升级——设计师和开发者基于同一套语言和事实进行协作将创造力从重复的劳动中解放出来聚焦于解决更复杂的业务和用户体验问题。如果你正在经历团队规模增长或产品矩阵扩张带来的协同之痛那么现在就是开始投资设计系统的最佳时机。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价