Design System
React
TypeScript
Component Library
Storybook
UI/UX

现代设计系统:使用 React 和 TypeScript 构建可扩展的组件库

了解如何创建和维护可扩展的设计系统。从设计令牌到可重用组件、文档和治理。

现代设计系统:使用 React 和 TypeScript 构建可扩展的组件库

设计系统改变了组织构建一致且高效的数字产品的方式。本指南涵盖了从基础知识到成熟[设计系统0]的操作的所有内容,较少关注语法,而更多关注支持规模的决策。

什么是设计系统?

[设计系统1] 不仅仅是一个组件库。它是一个生命系统,由一些相互加强的层组成。

第一层是设计标记,存储可重用设计决策的变量:语义调色板(主要、中性、成功、警报和错误状态)、间距比例、版式(系列、尺寸、粗细和行高)。令牌是视觉真相的单一来源:在一个地方更改原色蓝色应该在整个产品中传播。当这些决策成为数据,而不是遍布整个代码的价值观时,一致性就不再取决于个人纪律。

第二层是组件库,一组可重用且可访问的组件(按钮、字段、卡片、模式)。这里的价值在于标准化:每个组件都封装了变体(主要、次要、轮廓、重影、危险)、尺寸、加载状态和图标支持。一个精心设计的按钮可以立即解决数十个由每个开发人员自己做出的决定。

第三层是动态文档。像 Storybook 这样的工具允许您单独查看每个组件及其控件和变体并与之交互。文档不是[设计系统2]的附件,而是产品的一部分。如果一个组件存在但没有人知道如何正确使用它,那么它在实践中就不存在。

组件库架构

代码的组织反映了职责的分离。常见的 monorepo 安排将关注点分配到独立的包中:专用于设计令牌(颜色、间距、排版)的包、组件库的包(每个组件及其代码、测试、故事和入口点)、图标系统的单独包以及文档站点的包。这种分离允许每个部分独立进行版本控制和发展,而无需更改图标来强制重建整个库。

类型系统在此架构中起着核心作用。严格输入主题、颜色、间距、排版、断点、阴影和边框半径,确保在编译时捕获合同之外的任何消耗。精心设计的主题提供程序从这些标记生成 CSS 变量,并将它们公开给组件树,并且访问挂钩在提供程序外部使用时会抛出显式错误,从而消除了一整类无声错误。

复合组件

组合模式(复合组件)解决了具有相互依赖部分的组件问题,例如协调触发器、内容和项目的选择器。该组件公开了每个上下文共享状态的子组件,而不是充满属性的整体 API。其结果是一个富有表现力的 API,消费者可以在其中组装他们需要的结构(触发器、内容、单个项目),同时保持行为和风格的凝聚力。灵活性的到来并不需要放弃一致性。

辅助功能

可访问性不是严肃设计系统的可选功能,而是基本要求。两个轴值得持续关注。

第一个是 ARIA 和键盘导航。对话框等交互式组件需要正确的角色和属性、屏幕阅读器的描述性标签以及可预测的打开和关闭行为。依赖成熟的可访问原语可以避免对已经解决的问题进行糟糕的重新发明。

二是焦点管理。打开模式时,焦点必须转到第一个内部元素并保持包含在那里(焦点陷阱),返回到关闭时触发它的元素。这种对大多数用户来说看不见的关怀使得该产品对于那些仅使用键盘导航或依赖辅助技术的人来说是可用的。

测试策略

发展设计系统的信心来自于测试。在组件级别,除了运行自动[可访问性4]审核(在发生违规时使构建失败)之外,还值得检查渲染、事件处理、加载状态、禁用状态和变体的正确应用。

在视觉层面上,回归测试将屏幕截图与批准的基准进行比较,捕获功能测试未检测到的意外外观变化。这两个层面的结合涵盖了行为和外观,这是[设计系统5需要确保的两个维度。

文档和治理

文档站点集中了知识:对于每个组件,它描述了何时使用它,同样重要的是,何时不使用它;展示活生生的例子;列出属性;和记录 [辅助功能 6 保证(最小对比度、可见焦点、与屏幕阅读器的兼容性、尊重减少运动偏好)。

治理定义了贡献过程。在接受新组件之前,需要一份清单:完整的类型、属性文档、单元测试覆盖范围、[可访问性7 测试、涵盖主要用例的故事、经过验证的响应行为、适用时的深色主题支持、书面文档以及工程和设计批准。清晰的命名约定,组件采用 PascalCase 格式,属性采用 CamelCase 格式,类采用 kebab-case 格式,减少摩擦和歧义。

在代码风格中,原则是准确键入(更喜欢文字联合而不是过于泛型的类型)并记录每个属性的意图。在性能方面,通常的预防措施适用:记住纯组件,按需加载图标和插图,并最大限度地减少不必要的重新渲染。

版本控制和发布

设计系统是一个被其他产品使用的产品,因此需要严格的语义版本控制。破坏合同的变更(删除属性、更改 API)是主要的。向后兼容的添加(新组件、具有默认值的属性)是次要的。错误修复、[可访问性8缺陷、风格问题,都是补丁。变更集管理工具可自动执行发布和变更日志生成,并且具有构建编排功能的 monorepo 框架可协调所有包的构建、测试和 lint。

结论

实施良好的[设计系统9]是一项长期投资,可以加速开发、确保一致性、提高质量、便于维护并与组织一起扩展。

成功更少取决于技术,更多地取决于组织因素:设计、工程和产品之间的一致性;不断迭代,因为设计系统永远不会“准备好”;模范文档,因为没有文档记录的内容就不存在; [自动化测试10让人们有信心做出改变;并将设计系统视为内部产品。


您正在构建一个[设计系统11?分享您的挑战和经验!

另请阅读

  • [React Hook Form 复杂表单的 UX 最佳实践12
  • [使用 Shadcn/UI、Radix 和 Lucide-react 开发 React 插件:完整指南13
  • [带有 Lit 的 Web 组件:可重用 UI 实用指南14
  • [带有模块联盟的微前端:实用指南15
  • [使用 Strapi 和 Next.js 构建自定义 Headless CMS16
  • [现代 GraphQL API:模式设计、性能和有效模式17