掌握互连设计令牌的艺术
在使用设计系统时,实现设计令牌之间的无缝连接对于跨平台的一致性至关重要。 🧩 但是,当您的代币在编译过程中失去其层次结构时会发生什么?这是许多开发者面临的挑战。
想象一下,将您的设计标记精心构建为三个级别:原始、语义和特定,却发现在使用样式词典处理后,它们失去了相互依赖性。结果呢?您的语义和特定标记最终会得到原始值,从而破坏了预期的层次结构。
根据我自己的经验,我在为多个操作系统准备设计令牌时遇到了这个问题。我需要一个解决方案,保留 JSON 文件的互连结构,同时确保输出针对实施进行优化。 🚀
在本指南中,我将引导您了解如何配置样式词典来维护这些关系,确保您的令牌按预期保持互连。无论您是设计代币的新手还是解决类似问题的新手,这些见解都将非常宝贵。让我们深入了解一下! 😊
命令 | 使用示例 |
---|---|
StyleDictionary.registerTransform | 在样式词典中注册自定义转换。在本例中,它用于创建令牌的命名约定,通过组合类别、类型和项目来保留其层次结构。 |
StyleDictionary.registerFormat | 注册自定义格式以将令牌输出为结构化 JSON。这可以更灵活地确保编译期间令牌的互连。 |
transformer | 定义令牌的自定义转换逻辑。该示例使用转换器将标记属性(类别、类型、项目)连接成分层字符串。 |
formatter | 指定在构建过程中应如何输出令牌。在此脚本中,它将标记格式化为带有缩进的 JSON 字符串。 |
StyleDictionary.extend | 扩展样式词典的默认配置以包括源文件、平台和转换等自定义设置。对于模块化至关重要。 |
JSON.stringify | 将 JavaScript 对象转换为 JSON 字符串。此处使用它来格式化带有缩进的标记输出,以提高可读性。 |
json.dump | Python命令用于将Python对象(设计令牌)序列化为JSON格式。它在脚本中用于导出互连令牌,同时维护其层次结构。 |
chai.expect | 它是 Chai 断言库的一部分,用于单元测试中,以验证编译的标记是否保持所需的层次结构和关系。 |
fs.readFileSync | 在 Node.js 中同步读取文件。这用于将编译的设计令牌加载到单元测试脚本中以进行验证。 |
recursive function (Python) | 旨在迭代嵌套字典(分层 JSON)同时保留结构的函数。 Python 示例中处理标记的关键。 |
掌握分层设计令牌导出
在提供的脚本中,主要目标是维护跨多个级别(原始、语义和特定)的设计标记的层次结构。使用样式字典,我们引入自定义转换和格式,以确保在导出过程中保留标记之间的关系。例如,“registerTransform”方法使用基于类别、类型和项目属性的结构化格式来自定义令牌名称的生成方式。这种分层命名确保了令牌编译之间的清晰度和一致性。 🛠️
另一个关键功能是“registerFormat”方法,它可以将令牌导出到结构化 JSON 文件中。这种格式保留了原始输入中定义的令牌关系,从而更容易在各种平台中实现它们。想象一下,在一个大型项目中工作,其中“原色”等语义标记引用“blue-500”等原始标记——在编译期间保留这种关系对于防止实现错误至关重要。通过利用这些功能,样式词典成为维护令牌完整性的强大工具。
在基于 Python 的脚本中,我们使用递归函数来浏览嵌套字典,在设计标记转换期间保留层次结构。例如,如果“button.primary.background”标记引用“color.primary”标记,则该函数确保这些关系保持不变。此方法对于需要在 JavaScript 生态系统之外使用设计令牌的团队特别有用,因为 Python 为处理 JSON 文件提供了极大的灵活性。 🚀
最后,在 JavaScript 脚本中使用 Chai 集成单元测试添加了关键的验证层。这些测试确保令牌不仅可以正确编译,而且可以保留其预期的关系。例如,一项测试验证语义标记是否按预期引用原始值,而另一项测试则确保所有三个级别(原始、语义和特定)都存在于编译的输出中。通过这些脚本和实践,设计系统可以有效地扩展,同时保持跨平台的一致性,避免潜在的陷阱并节省开发时间。 😊
如何使用样式字典维护设计标记中的层次结构
基于 JavaScript 的解决方案,利用样式字典进行设计令牌管理
// Import the Style Dictionary package
const StyleDictionary = require('style-dictionary');
// Define the custom transform to maintain token hierarchy
StyleDictionary.registerTransform({
name: 'custom/name-hierarchy',
type: 'name',
transformer: (token) => {
return [token.attributes.category, token.attributes.type, token.attributes.item]
.filter(Boolean)
.join('.');
}
});
// Define the custom format for interconnected design tokens
StyleDictionary.registerFormat({
name: 'custom/json-structured',
formatter: ({ dictionary }) => {
return JSON.stringify(dictionary.tokens, null, 2);
}
});
// Configure Style Dictionary with your custom settings
const StyleDictionaryConfig = {
source: ['tokens//*.json'],
platforms: {
web: {
transformGroup: 'custom/name-hierarchy',
buildPath: 'build/web/',
files: [{
destination: 'tokens.json',
format: 'custom/json-structured'
}]
}
}
};
// Extend and build the Style Dictionary
const SD = StyleDictionary.extend(StyleDictionaryConfig);
SD.buildAllPlatforms();
使用 Python 验证和导出互连的设计令牌
一种基于 Python 的方法,用于在保留层次结构的同时处理 JSON 设计标记
import json
# Load design tokens from a JSON file
with open('tokens.json', 'r') as file:
tokens = json.load(file)
# Function to recursively maintain hierarchy
def maintain_hierarchy(data):
structured_tokens = {}
for key, value in data.items():
if isinstance(value, dict):
structured_tokens[key] = maintain_hierarchy(value)
else:
structured_tokens[key] = value
return structured_tokens
# Process tokens to maintain hierarchy
structured_tokens = maintain_hierarchy(tokens)
# Export processed tokens to a new JSON file
with open('structured_tokens.json', 'w') as file:
json.dump(structured_tokens, file, indent=2)
使用单元测试测试设计令牌编译
基于 JavaScript 的单元测试,用于验证样式词典的输出
const fs = require('fs');
const { expect } = require('chai');
// Load the compiled tokens
const tokens = JSON.parse(fs.readFileSync('build/web/tokens.json', 'utf-8'));
describe('Design Token Compilation', () => {
it('should preserve the hierarchy in tokens', () => {
expect(tokens.semantic).to.have.property('primary');
expect(tokens.semantic.primary).to.equal(tokens.primitive.colorBlue);
});
it('should include all levels of tokens', () => {
expect(tokens).to.have.property('primitive');
expect(tokens).to.have.property('semantic');
expect(tokens).to.have.property('specific');
});
});
跨平台保留代币关系
使用设计令牌时被忽视的一个方面是确保它们与各种平台(例如 Web、iOS 和 Android)的兼容性。虽然像 Style Dictionary 这样的工具很强大,但它们需要仔细配置以确保令牌保留其预期结构。例如,像“button.primary”这样的语义标记应该引用像“color.blue”这样的原始标记,而不是硬编码它们的值。这种互连性允许开发人员在原始级别进行更改,并查看所有依赖令牌反映的更新。 🌐
为了实现特定于平台的兼容性,可以为每个输出定制自定义转换和格式。这确保了令牌不仅一致,而且还针对平台的本机样式约定进行了优化。例如,iOS 可能需要“.plist”格式的令牌,而 Web 开发人员更喜欢 JSON 或 CSS 变量。使用这些专门的输出可以保持令牌完整性,同时简化不同团队的实施。通过关注这些方面,团队可以创建可扩展的、与平台无关的设计系统。 🚀
另一个关键考虑因素是集成版本控制和协作工作流程。通过将令牌文件存储在版本控制的存储库中并将其与 CI/CD 管道相结合,可以自动测试和部署令牌的更新。这确保了代币在各个平台上保持最新状态,无需人工干预,最大限度地减少错误并保持设计系统的完整性。这种自动化不仅节省时间,而且支持不断壮大的团队处理复杂的令牌层次结构。 😊
互连设计令牌常见问题解答
- 什么是设计令牌层次结构?
- 层次结构涉及将标记结构化为原始、语义和特定等级别。例如,语义标记 "button.primary" 可能引用一个原始标记 "color.blue-500"。
- 自定义转换在样式词典中如何工作?
- 自定义转换,创建于 StyleDictionary.registerTransform,定义如何处理标记,例如将类别和类型等属性组合成分层名称。
- 样式词典支持哪些格式?
- 样式词典支持 JSON、CSS 和特定于平台的输出。开发人员可以定义自定义格式 StyleDictionary.registerFormat 以满足他们的需求。
- 为什么语义标记很重要?
- 语义标记如 "text.primary" 提供一个抽象层,允许对原始标记进行更改,例如 "color.black" 不改变所有依赖样式。
- 设计令牌可以与版本控制集成吗?
- 是的,将令牌存储在存储库中可以实现协作和跟踪。使用 CI/CD 进行自动化构建可确保令牌跨平台保持一致。
代币管理的有效技术
确保互连设计令牌的正确结构对于现代设计系统的一致性至关重要。通过利用诸如 风格词典,开发人员可以创建无缝工作流程,在导出过程中保留令牌层次结构。这些方法可以节省时间并减少实施错误。 😊
自定义格式和集成 CI/CD 管道可增强可扩展性和跨平台兼容性。无论是在 Web 还是本机应用程序上工作,这些方法都使团队能够维护可靠、灵活的系统。专注于自动化流程和清晰的配置为稳健的设计令牌管理奠定了基础。
先进设计令牌管理资源
- 综合指南 样式词典文档 ,详细介绍了令牌配置和高级使用技巧。
- 从文章中深入了解令牌层次结构 “设计令牌和主题” ,提供可扩展设计系统的实用技巧。
- 多平台代币出口的灵感 CSS 技巧:使用设计标记 ,提供跨平台兼容性的最佳实践。