设计 Token 体系搭建:从前端变量到跨平台一致性的工程化实践

发布时间:2026/9/12 8:44:21

设计 Token 体系搭建:从前端变量到跨平台一致性的工程化实践 设计 Token 体系搭建从前端变量到跨平台一致性的工程化实践一、设计师在 Figma 里改了一个色值前端要在 37 个文件里改 89 处如果你经历过这个场景你需要一个设计 Token 体系。设计 TokenDesign Token这个概念被提出快十年了但在国内前端团队的落地情况依然不乐观。问题不在于不知道 Token 是什么而在于怎么在工程里把它用起来而不只是一堆 JSON 文件。设计 Token 的本质是将设计决策抽象为平台无关的变量然后通过转译工具生成各平台Web、iOS、Android、Flutter的原生代码。它让设计师在 Figma 改一个主色这件事的工程影响从全局搜索替换变成改一行 JSON自动生成所有平台的代码。这篇文章我会从 Token 的层级设计、命名规范、转译工具链、CI 集成四个维度给你一套可以直接照搬的 Token 体系搭建方案。二、设计 Token 的层级架构为什么需要三层很多人直接把 Figma 里的色值写成 CSS 变量这就跳过了最重要的语义层// 错误基础值和语义值混在一起 { color-primary: #3B82F6, color-primary-hover: #2563EB }这种结构的致命问题是当你想在暗黑模式下把主色从#3B82F6换成#93C5FD时你需要改的是语义 Token而不是基础色值。如果基础和语义混在一起你就失去了一个值关联多个语义的灵活性// 正确三层分离 // primitives.json { blue: { 500: { value: #3B82F6 }, 600: { value: #2563EB }, 300: { value: #93C5FD } } } // semantics.json { color: { primary: { value: {blue.500} }, primary-hover: { value: {blue.600} }, primary-on-dark: { value: {blue.300} } } } // 暗黑模式只需要这一层 // semantics-dark.json { color: { primary: { value: {blue.300} }, primary-hover: { value: {blue.200} } } }三、Token 体系的完整工程实现命名规范使用 CTICategory / Type / Item结构[category]-[type]-[item]-[variant]-[state] 示例 color-background-primary-hover font-size-heading-xl spacing-layout-section-gap radius-component-button shadow-elevation-card完整的 Token Map 示例{ color: { text: { primary: { value: {color.neutral.900} }, secondary: { value: {color.neutral.600} }, disabled: { value: {color.neutral.400} }, inverse: { value: {color.neutral.0} } }, background: { primary: { value: {color.neutral.0} }, secondary: { value: {color.neutral.50} }, overlay: { value: rgba(0, 0, 0, 0.5) } }, border: { default: { value: {color.neutral.200} }, focus: { value: {color.blue.500} }, error: { value: {color.red.500} } } }, spacing: { xs: { value: 4px }, sm: { value: 8px }, md: { value: 16px }, lg: { value: 24px }, xl: { value: 32px }, 2xl: { value: 48px } }, radius: { sm: { value: 4px }, md: { value: 8px }, lg: { value: 16px }, full: { value: 9999px } }, shadow: { sm: { value: 0 1px 2px rgba(0,0,0,0.05) }, md: { value: 0 4px 6px rgba(0,0,0,0.07) }, lg: { value: 0 10px 25px rgba(0,0,0,0.1) } } }使用 Style Dictionary 做转译Style Dictionary 是设计 Token 领域最成熟的转译工具Amazon 开源已维护 7 年。// build-tokens.js const StyleDictionary require(style-dictionary); const sd StyleDictionary.extend({ source: [ tokens/primitives/**/*.json, tokens/semantics/**/*.json, ], platforms: { /** CSS 变量输出 */ css: { transformGroup: css, buildPath: dist/css/, files: [ { destination: tokens.css, format: css/variables, options: { outputReferences: true, // 保留引用关系 }, }, ], /** 暗黑模式通过>/* dist/css/tokens.css (构建产物) */ :root { --color-text-primary: #1A1A2E; --color-text-secondary: #64748B; --color-background-primary: #FFFFFF; --color-background-secondary: #F8FAFC; } [data-themedark] { --color-text-primary: #E2E8F0; --color-text-secondary: #94A3B8; --color-background-primary: #0F172A; --color-background-secondary: #1E293B; } /* 或使用 prefers-color-scheme */ media (prefers-color-scheme: dark) { :root:not([data-themelight]) { --color-text-primary: #E2E8F0; --color-text-secondary: #94A3B8; --color-background-primary: #0F172A; --color-background-secondary: #1E293B; } }Token 变更的 CI 检查# .github/workflows/token-check.yml name: Design Token Consistency Check on: pull_request: paths: - tokens/** jobs: check: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Build Tokens run: npx style-dictionary build - name: Check Token Changes run: | # 检测是否有意外的 Token 变更 git diff --exit-code dist/ || { echo ⚠️ Token 构建产物有变更请提交 dist/ 目录 exit 1 } - name: Validate Token References run: node scripts/validate-token-refs.js - name: Check Contrast Ratios run: node scripts/check-contrast.js - name: Generate Token Changelog run: node scripts/token-diff.js token-changelog.md - name: Comment on PR uses: actions/github-scriptv7 with: script: | const fs require(fs); const changelog fs.readFileSync(token-changelog.md, utf8); github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: ## 设计 Token 变更清单\n\n${changelog} });四、常见踩坑与避坑指南Token 太多没人知道该用哪个建议控制在 80-120 个语义 Token。多了就说明你的层级设计有问题或者有 Token 该合并。设计师不在 Figma 里用 Token 名这是落地最大的障碍。解决方案是使用 Figma Tokens 插件让设计师在 Figma 里直接用 Token 名和代码一一对应。Token 命名是政治问题spacing-md还是spacing-3color-primary还是color-brand这类命名分歧本质是团队对什么是设计语言的共识问题。建议先定规范文档再建 Token。跨平台 Token 不可能 100% 一致iOS 的 SF Pro 字体和 Android 的 Roboto 字体渲染不同同一个 Token 值会产出视觉差异。接受 95% 的一致性5% 让平台特性接管。五、总结设计 Token 体系不是一堆 JSON 文件 一个 SD 构建脚本它是设计决策的工程化。三层架构基础 → 语义 → 组件保证了灵活性CTI 命名规范保证了可读性Style Dictionary 保证了多平台一致性。最重要的是——当这个体系真正运转起来之后设计师改了一个色值的工程影响从改 89 处代码变成了改一行 JSON 跑一次构建。这才是设计系统该有的样子。作者李慕杰Leo / 8limujie一个花了三年时间、终于让设计师和前端对色值的定义达成共识的前端匠人
延伸阅读

更多相关文章

2026/9/10 8:38:51

YOLO铁锈腐蚀识别系统:工业检测的AI解决方案

1. 项目背景与核心价值在工业设备维护和基础设施管理中,金属锈蚀问题一直是困扰运维人员的难题。传统的人工巡检方式不仅效率低下,而且受限于人眼识别精度,往往难以发现早期锈蚀。我们团队开发的这套基于YOLO的铁锈腐蚀识别系统,正…

2026/9/8 1:56:44

LLM网关项目复盘:多模型统一接入层的架构设计与工程挑战

LLM网关项目复盘:多模型统一接入层的架构设计与工程挑战 一、多模型的"巴别塔"问题 一个AI应用同时使用了5个LLM Provider(OpenAI、Anthropic、DeepSeek、通义千问、Moonshot)。每个Provider有自己的SDK、请求格式、响应格式、错误…

2026/9/10 12:12:33

UnityEditor命名空间报错全解析:从编译原理到项目结构优化

1. 项目概述:当UnityEditor“消失”时 如果你在Unity编辑器里写脚本,尤其是那些用来扩展编辑器功能、创建自定义工具窗口或者自动化流程的脚本,那么“not exist in the namespace ‘UnityEditor‘”这个报错,大概率是你绕不开的一…

2026/9/12 8:40:12

AI Agent全栈开发指南:从基础原理到生产级项目实战

1. 先弄清楚 AI Agent 到底在解决什么问题去年这个时候,还有人在群里问 AI Agent 是不是又一个概念泡沫。到了 2026 年,这个问题基本没人问了——招聘平台上挂着「agent 开发」字样的岗位翻了不止一倍,面试里开始出现「你怎么设计一个多智能体…

2026/9/12 8:40:12

AI工程化落地:用OpenSpec与OPSX构建规范驱动的开发工作流

开发 AI 应用两年多,我最大的感触不是模型不够聪明,而是工程化太松散。单看一次代码生成,AI 确实惊艳,但一旦进入多轮修改、多人协作、跨会话交接,就会出现“前面说好的需求,后面全忘了”的情况。后来接触到…

2026/9/12 8:40:12

山林边缘火灾预警系统:YOLOv8/v11实战部署与多模型协同设计

1. 这不是个“玩具项目”,而是一套能真正在山林边缘跑起来的火灾预警系统我去年在云南普洱一个国有林场驻点三个月,跟着护林员巡山时亲眼见过两次小规模火情——一次是雷击引燃枯枝,另一次是游客丢弃未熄灭的烟头。火苗蹿起来不到两分钟&…

2026/9/12 8:40:11

AI Agent记忆系统设计:四层架构与工程落地实践

1. 项目概述:为什么“让 Agent 记住你”不是功能升级,而是范式切换你有没有试过和某个 AI 助手聊了二十分钟,从查天气、订咖啡、改简历,再到讨论下周会议的 PPT 结构,它全程都记得你刚说“我讨厌蓝色系配色”&#xff…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码