system2-cover-cn.png

这是 Scanat 设计系统系列的第二篇。 Part 1 记录最初的 0→1 搭建与文件架构调整; 这一篇记录系统运行三年后的重新治理,以及治理完成后如何把 Token 和组件规范继续推进到现有前端体系。

Snapshot

角色 设计系统架构 · DesignOps · 规范制定与执行 · AI Agent 协作
项目类型 设计系统治理与工程化交付
平台 Web · Mobile App · iPad App
使用者 内部设计、产品与开发团队
团队 由我负责整体治理;使用 Figma Agent 辅助诊断、批量整理与复查
时间跨度 设计系统治理约 1.5 个月;工程化交付随后持续推进
我的贡献 1. 重新整理 Token、组件属性和图层命名;
  1. 建立通用组件 / 业务组件的分类与维护规则;
  2. 为 Modal、Sheet、Panel 等组件重新设计母组件 + 业务子组件架构;
  3. 为通用组件补充使用说明并建立后续治理流程;
  4. 建立 Token 导出流程,整理现有 BootstrapVueNext 组件与 Token 的样式绑定,并通过 Storybook / Showcase 展示。 | | 当前状态 | Figma 侧治理完成;180+ Token 已进入导出流程,正在逐步整理通用组件的 Token 绑定与 Storybook / Showcase 展示 |

<aside>

Storybook · Showcase ↗

</aside>

TL;DR

刚入职建立的设计系统持续使用三年后,随着产品功能、Web / App 组件数量和 Figma 能力变化,组件库里逐渐并存多种历史写法。命名、属性、图层结构和通用组件 / 业务组件的边界再次出现差异。

我用约 1.5 个月重新治理 Web 和 App 两套组件库:先统一底层 Token 与命名规则,再逐类检查真实组件,重点重构 Modal、Sheet、Panel 这类“外壳稳定、内容多变”的组件,并把文档、Agent 复查和后续新建 / 修改流程固定下来。治理完成后,我继续把设计系统推进到代码侧:建立 Token 导出流程,并整理现有 BootstrapVueNext 组件如何绑定 Scanat Token,通过 Storybook / Showcase 做样式展示和交付。

1. Problem

主要问题

第一版设计系统持续使用三年后,Web / App 组件数量增加,Figma 的 Variables、Properties、Slot 等能力也陆续变化,组件库中开始并存多种历史写法。主要问题集中在四类:

system2-01.png

约束

治理需要在正常产品工作中完成,由我一人负责,无法删除历史组件后整体重做。因此方案需要支持逐步改造旧组件,同时约束后续新增组件。


2. Approach 方法与决策

这次工作分为五个阶段,从 Figma 侧治理一直延伸到工程化交付。

阶段一:统一底层规则并建立规范

先整理颜色、文字、圆角、阴影和间距等基础 Token,同时统一明显的命名、分组和重复问题。Figma Agent 用于扫描和批量检查,最终保留哪些 Token、如何分组仍根据实际产品使用判断。

根据扫描和整理检查结果,确定组件名、Property、Variant Value 和图层命名的基础规则。第一版只覆盖可以明确判断的部分,后续在真实组件中遇到新的边界情况再补充。

system2-03.png

阶段二:逐类检查真实组件

按组件类别检查 Web 和 App 两套组件库,重点看分类是否合理、Variant / Property 是否一致、图层是否有意义,以及旧结构是否仍适合当前产品。

Figma Agent 主要负责扫描、批量命名和复查;组件是否合并、拆分,以及通用和业务边界怎么划分仍由我根据实际使用场景判断。

system2-04.png

阶段三:重构组件层级与维护方式

组件被进一步分成两类:跨业务复用的通用 Component,以及具体功能中稳定复用的业务 Pattern / Component。判断依据不是组件长得是否相似,而是它在不同业务中的复用方式和维护责任。

其中 Modal、Sheet 和部分 Panel 是这一阶段调整最多的一组,这类组件的问题是共用相似外壳,但业务内容差异较大,而且会在多个产品页面重复出现。每个业务场景都建立完整组件会造成大量重复;只保留通用外壳,又难以同步维护业务内容。这三年内尝试了3种调整方法:

方案 做法 实际问题
尝试一 每个业务面板单独建立完整组件 组件数量持续增加,仅 Web 编辑器面板就有 17 个,公共结构也容易逐渐出现差异
尝试二 合并相近的大组件,把不同内容拆成内部子组件 子组件数量增加,很多业务内容很难得到清晰、稳定的通用命名
尝试三 通用组件只保留外壳,所有内容通过 Slot 替换 业务内容失去统一实例;同一面板出现在几十个页面时,内容修改需要逐页复制,容易遗漏

system2-02.png

最终总结前三次经验,决定采用“通用母组件 + 业务子组件 + Slot”的分层方式:母组件只维护稳定外壳,业务子组件承载具体内容,正式 UI 页面再引用业务子组件。这样外壳和业务内容可以分别更新,同时保留实例同步能力。

Slot 只作为连接稳定框架与可替换内容的实现方式,不再承担业务内容本身的维护。

system2-05.png

阶段四:组件说明与后续治理

治理完成后,为通用组件补充设计和开发共同参考的使用说明,并把新建 / 修改组件的分类、制作、Agent 复查和文档步骤固定下来。

system2-06.png

阶段五:推进到工程化交付

Figma 侧治理完成后,我继续处理设计系统与代码之间的衔接。开发侧实际使用 Vue + Tailwind + BootstrapVueNext,并计划继续复用现有组件库,因此这里不再重新实现一套 Vue 组件,而是把 Scanat 的设计规范接到现有组件样式上。

第一步是建立可重复执行的 Token 导出流程。使用 Claude Code 读取 Figma 中的颜色、文字、间距、圆角、边框、尺寸和阴影,输出 CSS 与 JSON。目前已有 180+ Token 进入流程。

system2-08-new.png

第二步是逐个整理通用组件的 Token 绑定。Claude Code 辅助读取组件结构,识别背景、文字、边框、圆角、间距和不同状态分别由哪些 Token 控制,再用现有 BootstrapVueNext 组件展示实际样式。

system2-09.png

只有 Token 文件并不足以完成交付,因此 组件与 Token 的绑定关系成为这一阶段的主要内容。Storybook / Showcase 用来集中展示 Foundations、组件样式和 Token 绑定结果,作为设计与开发共同查看实际效果的入口。

<aside> 🔗

查看 Storybook / Showcase

</aside>

这套协作方式是我自己先验证出来的。在正式整理之前,我用少量 Token 和几个组件做了一版可运行的工程化 demo,拿给开发看。开发认可这个方向后,我们商定了具体分工:

这套模式的直接收益是 Token 绑定效率明显提升,也推动了组件本身的规范化。这部分代码此前先后经过 4 位不同前端的手,写法比较杂,通过统一的 Token 绑定关系,写法逐步收敛了下来。


3. Outcome


4. Reflection

  1. 设计系统最初搭好的结构并不能保证后续一直一致。产品会变化,Figma 的能力也会变化,需要定期重新判断旧组件是否还适合当前的工具和产品结构。
  2. Modal / Sheet / Panel 前三种方案分别解决了一部分问题,同时又制造了新的维护成本。最终方案不是把所有内容统一成一种组件,而是把稳定的外壳和变化的业务内容放到不同层级维护。
  3. 以前几次整理更偏向“把当前组件整理干净”。这一次额外补了规范、文档和后续新建 / 修改步骤,让治理继续进入之后的日常需求流程。
  4. Figma Agent 很适合做扫描、批量命名、检查属性等重复工作,但组件应该怎么分类、Variant 是否应该拆开,以及业务内容和通用组件之间的边界,仍然需要根据产品中的真实使用方式判断。
  5. 工程化不等于重新写一套组件。确认现有技术栈后,这次交付重点转向 Token 输出、组件绑定和样式对照。对设计系统来说,能够进入真实开发环境,比单独维护一套设计师实现的组件代码更重要。