解释什么是 Atomic Design — 由 Brad Frost 于 2013 年提出的界面设计方法论,借用原子、分子和有机体的隐喻来构建 UI 组件的层次结构。与基于页面的方法不同(界面按屏幕设计),Atomic Design 将 UI 分解为最小的可重用元素(原子),并从它们构建更复杂的结构。根据 Brad Frost(2016)的说法,该方法论被 67% 的大公司(包括 IBM、Airbnb 和 Google)的设计系统所使用。
要点
Atomic Design — 创建分层界面系统的方法论,其中每个 UI 元素属于五个层次之一:原子(基本元素)、分子(原子的组合)、有机体(复杂模块)、模板(页面框架)和页面(带数据的具体屏幕)。这个类比来自化学:原子结合成分子,分子结合成有机体,有机体结合成模板,模板填充内容后成为页面。
该方法论由网页设计师 Brad Frost 于 2013 年提出,以回应“页面思维”的问题——即每个新屏幕都是从零开始设计,不考虑现有组件。在《Atomic Design》(2016)一书中,Frost 描述了该方法在大公司项目中的应用:IBM、GE、Starbucks。根据 Nielsen Norman Group(2022)的数据,Atomic Design 通过重用现成组件将新屏幕的设计时间缩短 30–50%。
Atomic Design — 与其说是一种技术,不如说是一种 UI 组织哲学。它不依赖于特定的框架,既适用于 Web(React, Vue),也适用于移动开发(Jetpack Compose, SwiftUI)。在 IT Sectr,我们使用 Atomic Design 为客户构建设计系统:在设计阶段识别原子组件,并将其转移到 Compose/SwiftUI 的代码组件中。
Atomic Design 的每个层次都解决自己的任务,并有严格的职责范围。原子 — 界面最小的构建模块,无法在不失去意义的情况下进一步分解:按钮、文本字段、图标、标签、复选框。原子不包含业务逻辑,不依赖于上下文。它们定义基本的视觉特征:颜色、大小、间距、排版。
分子 — 两个或多个原子的组合,形成简单的功能单元。带标签和错误消息的输入字段 — 分子。带图片、名称和价格的商品卡片 — 分子。分子可以包含基本逻辑(显示/隐藏错误),但不包含业务流程。分子是组件在不同屏幕之间变得可重用的第一个层次。
有机体 — 由分子和原子组成的复杂界面模块,实现应用的特定功能。登录表单(电子邮件字段、密码字段、提交按钮、"忘记密码"链接)— 有机体。带 Logo、搜索和导航的页眉 — 有机体。有机体可以包含业务逻辑并访问 API,但仅在其功能范围内。
模板 — 页面框架,确定有机体在屏幕上的位置而不包含具体内容。模板定义网格、列、内容区域 — 代码级别的线框图。模板不包含数据,只包含占位符。它们允许在填充内容之前评估页面结构。
页面 — 应用的具体屏幕,模板填充了真实数据。在此层次上检查组件在真实内容下的表现(长字符串、数据缺失、错误)。页面是最终用户唯一看到的层次。页面级别的更改不应影响原子、分子和有机体——如果需要更改组件,更改在其级别上进行,页面自动接收更改。
优势 Atomic Design 在界面扩展时显现。统一的组件库保证视觉一致性:按钮在所有屏幕上看起来相同,因为它是同一个原子。根据 Brad Frost(2016)的数据,采用 Atomic Design 的公司通过重用现成的分子和有机体将新屏幕的开发时间缩短 30–50%。
| 特征 | Atomic Design | 基于页面的方法 |
|---|---|---|
| 组件重用 | 高(原子、分子、有机体) | 低(每个屏幕从零开始) |
| 视觉一致性 | 有保障 | 手动控制 |
| 创建新屏幕的速度 | 高(从现成模块组装) | 低(从零开始设计 + 编码) |
| 实施复杂度 | 高(需要组件目录) | 低(熟悉模型) |
| 可测试性 | 高(每个原子隔离) | 集成(整个屏幕一起) |
局限 — Atomic Design 不描述如何管理应用状态。该方法论只回答"如何组织 UI 组件"的问题,但不涉及业务逻辑、路由和数据处理。第二个局限 — 边界确定的困难:分子在哪里结束,有机体从哪里开始?在实践中边界模糊,不同团队可能对同一组件进行不同分类。建议在设计标记和组件目录(Storybook, Jetpack Compose Preview)中固定规则。
第三个局限 — 对小型项目过度抽象。如果应用由 5 个屏幕组成,创建原子和分子的层次结构是多余的工作。当屏幕数量超过 20 个且组件在不同页面上重用时,Atomic Design 才变得有益。
Atomic Design 和 Feature-Sliced Design (FSD) 解决不同的任务,可以一起使用。Atomic Design 是组织 UI 组件的方法论,FSD 是组织业务层和整个应用的方法论。Atomic Design 回答"如何将 UI 分解为可重用部分",FSD 回答"如何围绕业务功能组织代码"。它们不竞争:可以拥有具有 features 和 entities 层的 FSD 结构,并在每一层内使用 Atomic Design 来组织 UI 组件。
| 标准 | Atomic Design | Feature-Sliced Design |
|---|---|---|
| 领域 | UI 组件 | 应用架构 |
| 分组单位 | 化学隐喻(原子 → 分子 → 有机体) | 业务功能(切片) |
| 依赖关系 | 从原子到页面(自下而上) | 从 app 到 shared(自上而下) |
| 数据处理 | 未描述 | 通过 model + api 段 |
| 扩展 | 水平(更多组件) | 垂直(更多功能) |
典型组合:FSD 定义应用的模块结构(层、切片),Atomic Design — 每个切片内 UI 组件的内部结构。例如,feature.auth 切片包含分子(LoginForm, PasswordInput)和有机体(AuthPage),按照 Atomic Design 规则组装。共享层包含在所有功能中可重用的原子(Button, Input, Label)。
Jetpack Compose 和 SwiftUI 通过组件组合自然地支持 Atomic Design 层次结构。原子在 Compose 中 — 基本的 @Composable 函数:AppButton、AppTextField、AppCheckbox。每个函数接收定制参数(颜色、大小、状态),不包含业务逻辑。原子在共享层定义并作为 UI-kit 导出。
分子 — 组合多个原子的 @Composable 函数:LabeledTextField(标签 + 输入字段 + 错误消息)、ProductCard(图片 + 名称 + 价格)。分子可以包含基本状态(字段有效性),但不访问 API 或 ViewModel。它们在不同有机体中可重用。
有机体 — 功能级别的 @Composable 函数:LoginForm(用于电子邮件的 LabeledTextField + 用于密码的 LabeledTextField + 发送 AppButton + 恢复链接)。有机体通过 Intent 函数与 ViewModel 交互,可以包含业务逻辑。在 SwiftUI 中,类似的层次结构通过 @ViewBuilder 和自定义 View 结构构建。
在 SwiftUI 中,原子 — 自定义 View 结构 AppButton,分子 — HStack 上带标签的输入字段,有机体 — 登录表单。这种结构允许在所有屏幕上重用组件——原子的更改(按钮颜色)自动应用到所有屏幕。Atomic Design 与设计系统的结合保证了界面的一致性,无需手动控制每个屏幕。
常见问题
五个层次是建议,不是规则。许多设计系统(Material Design, IBM Carbon)使用 3 或 4 个层次:基本组件、复合组件和模板。主要规则 — 每个组件属于一个层次,可以在后续层次中重用。如果您发现项目中的"分子"和"有机体"层次没有区别——合并它们。原子和页面是唯一强制性的层次。
原子通过视觉测试(快照测试、Compose Preview)— 检查具有指定属性的按钮是否正确渲染。分子作为原子的组合进行测试 — 检查状态(错误、成功、禁用)。有机体需要集成测试 — 检查与 ViewModel 的交互(表单提交、数据加载)。在 IT Sectr,我们使用 Compose Test 用于 Android,XCTest 用于 iOS;视觉测试使用 Paparazzi(Android)和 SnapshotTesting(iOS)。
可以,但效率降低。没有设计系统和设计标记,原子没有统一的风格——每个开发人员创建自己的原子,使用任意的颜色和间距,导致视觉混乱。Atomic Design 和设计系统是互补的概念:Atomic Design 确定层次结构,设计系统确定视觉语言。建议一起实施:先设计标记(颜色、排版、间距),然后原子,接着分子和有机体。
"原子区"——原子数量超过合理限度(100+)的情况,找到所需组件比从头编写花费更多时间。解决方案——按功能同地放置原子:仅由一个功能使用的原子存储在该功能内部,而不是共享层。共享层只放置全局原子(Button, Text, Input)。根据 Brad Frost 的说法,同地放置在没有失去重用的情况下将共享原子数量减少 60–70%。
Atomic Design 最初是界面设计方法论(design),但在现代实践中也用于组织代码(code)。在设计工具(Figma, Sketch)中,原子是库组件;在代码中是函数和类。该方法论不区分 design 和 code——原子在原型和实现中是相同的。在 IT Sectr,我们使用 supernova.io 来同步设计原子和代码原子,消除了原型和最终界面之间的偏差。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。