我坚信文档应该尽可能地靠近代码。根据我的经验,这是长期有效唯一的选择。外部文档、笔记和维基最终都会过时、被遗忘和丢失。
文档一直是我头疼的问题。处理文档编写不佳的代码库就像一颗定时炸弹。它使入职过程变得乏味。另一种看待不良文档的方式是,它有助于培养 低卡车系数(即,“团队中必须被卡车撞倒多少人才会使项目陷入严重困境”)。
最近,我加入了一个项目,该项目拥有超过 1500 页的文档,这些文档是用……Microsoft Word 编写的。它已经过时且杂乱无章。一场真正的灾难。一定有更好的方法!
我之前也讨论过这个文档问题。不久前,我在 CSS-Tricks 上的文章 良好记录的 CSS 代码库是什么样的? 中简单地提到了它。现在,让我们深入探讨以编程方式记录代码的选项。特别是 CSS。
类似于 JSDoc,在 CSS 世界中,可以通过 /* comments */
在源代码中描述组件。一旦代码通过这种方式用注释进行描述,就可以生成项目的**动态样式指南**。我希望我已经足够强调**动态**这个词,因为我相信这是成功维护的关键。根据我的经验,通过这种方式记录代码可以立即获得许多好处
- 团队开始使用通用词汇,显著减少了沟通问题和误解。
- 组件的当前视觉 UI 状态始终存在。
- 有助于将前端代码库转换为描述良好的模式库,且工作量最小。
- 作为开发游乐场很有用。
有时有人认为以文档为中心的开发方法非常耗时。我不会否认这一点。人们应该始终在构建功能和编写文档之间寻求平衡。例如,在我当前所在的团队中,我们使用敏捷方法来构建内容,并且每个冲刺中都有一段时间专门用于完成缺少的文档。
当然,有时工作的软件优于全面的文档。这完全没问题,只要相关人员**意识到并制定了项目如何长期维护的计划**。
现在让我们看一下 CSS 中最流行的文档选项
Knyle 样式表 (KSS)
KSS 是一种文档规范和样式指南格式。它试图提供一种方法,以便团队在编写可维护的、有文档记录的 CSS。由于其流行、表达力和简单性,我网络中的大多数开发人员都在使用它。
KSS 格式是人类可读的且机器可解析的。因此,它旨在帮助自动创建动态样式指南。

类似于 JSDoc,在 KSS 中,CSS 组件在源代码中以注释的形式进行描述。每个 KSS 文档块包含三个部分:元素的功能或外观描述、修饰符类或伪类的列表以及它们如何修改元素,以及元素在样式指南中的位置参考。以下是其外观
// Primary Button
//
// Use this class for the primary call to action button.
// Typically you'll want to use either a `<button>` or an `<a>` element.
//
// Markup:
// <button class="btn btn--primary">Click Me</button>
// <a href="#" class="btn btn--primary">Click Me</a>
//
// Styleguide Components.Buttons.Primary
.btn--primary {
padding: 10px 20px;
text-transform: uppercase;
font-weight: bold;
bacgkround-color: yellow;
}
Benjamin Robertson 详细描述了他使用 kss-node 的经验,kss-node 是 KSS 的 Node.js 实现。此外,还有许多生成器使用 KSS 符号从样式表生成样式指南。值得一提的一个流行选项是 SC5 样式生成器。此外,它们的文档语法扩展了选项,以引入包装器标记、忽略样式表中某些部分的处理以及其他不错的增强功能。
其他有时有用(但在我看来大多很花哨)的东西是
- 使用设计器工具,您可以通过 Web 界面直接编辑 Sass、Less 或 PostCSS 变量。
- 每个设备上都有样式的实时预览。
谁知道呢,它们可能对某些用例有益。这是一个 SC5 的交互式演示。

与 JavaScript 世界不同,在 JavaScript 世界中 JSDoc 占据主导地位,仍然有很多工具不使用 KSS 约定。因此,让我们探索我了解的两种替代方案,根据流行度、最近的更新和我的主观意见进行排名。
MDCSS
如果您正在寻找简单、简洁的解决方案,mdcss 可能是答案。这是一个交互式演示。要添加一段文档,请编写一个以三个破折号 ---
开头的 CSS 注释,如下所示
/*---
title: Primary Button
section: Buttons
---
Use this class for the primary call to action button.
Typically you'll want to use either a `<button>` or an `<a>` element
```example:html
<button class="btn btn--primary">Click</button>
<a href="#" class="btn btn--primary">Click Me</a>
```
*/
.btn--primary {
text-transform: uppercase;
font-weight: bold;
background-color: yellow;
}
文档部分的内容由 Markdown 解析并转换为 HTML,这非常不错!此外,文档部分的内容可以自动从另一个文件导入,这对于更详细的解释非常有用
/*---
title: Buttons
import: buttons.md
---*/

每个文档对象可以包含许多属性,例如标题(当前部分的标题)、唯一名称、上下文以及 其他一些属性。
其他一些我关注的工具,具有非常相似的功能是
Nucleus
Nucleus 是一个用于基于 原子设计 组件的动态样式指南生成器。Nucleus 从 DocBlock 注释中读取信息。
原子设计是一种编写模块化样式的指南,在(生物)化学尺度上投射不同级别的复杂性。这导致选择器特异性低,并允许您将复杂实体组合成简单的元素。如果您不太熟悉原子设计,那么在开始时学习曲线可能会让人感到有些不知所措。Nucleus 的实体包括
- 核素:本身不可直接使用的样式(混合、设置、变量)。
- 原子:单类元素或选择器规则(按钮、链接、标题、输入……)。
- 分子:一个或多个嵌套规则,但每个规则不超过一个原子
- 结构:最复杂的类型,可能包含多个分子或其他结构。
- ……以及 更多。
我们在本文中使用的按钮示例代表一个**原子**——样式表中一个非常基本的元素(单类元素或选择器)。为了将其标记为原子,我们需要使用 @atom
标记对其进行注释,后跟组件的名称
/**
* @atom Button
* @section Navigation > Buttons
* @modifiers
* .btn--primary - Use this class for the primary call to action button.
* @markup
* <button class="btn">Click me</button>
* <button class="btn btn--primary">Click me</button>
* <a href="#" class="btn btn--primary">Click Me</a>
*/
.btn--primary {
text-transform: uppercase;
font-weight: bold;
bacgkround-color: yellow;
}

这是一个 交互式演示。
结论
在以编程方式记录 CSS 的工具或通用语法定义方面,还没有明确的赢家。
一方面,KSS 似乎处于领先地位,因此我认为对于长期项目来说,值得考虑它。我的直觉是它会持续很长时间。另一方面,不同的语法选项和工具(如 Nucleus 和 MDCSS)也看起来很有前景。我建议您在短期项目中尝试它们。
需要注意的是,本文中介绍的所有工具都可能很好地完成工作,并且看起来足够可扩展。因此,请尝试它们并选择最适合您团队的工具。
如果您知道或有使用任何这些工具或其他值得了解的工具的经验,请在下面的评论中分享,我将不胜感激!
我认为 Nucleus 与“原子 CSS”关系不大,你可能指的是“原子设计”,并链接到http://atomicdesign.bradfrost.com/。
无论如何,对于“原子 CSS”,我们有这个在线工具。
是的,正确!感谢你指出这一点,我刚刚修复了它。
我们的团队使用 Fabricator。它更多的是用于构建 UI 工具包,但它包括文档和现实生活中适用的模板
https://fbrctr.github.io/
我的待办事项清单上有 KSS。使用“styleguidejs”已经很久了,尽管它的名字如此,它是一个 CSS 样式指南生成器。无论你使用什么,这些东西都非常方便,尤其是在团队合作时。
好吧,这些是你提到的几个很好的观点,Chris。我一直发现我的样式表的文档是一个非常艰巨的任务。看起来是一个非常好的起点。谢谢!
我正在使用http://fractal.build/ 并且运行良好
曾经有一个名为 CSSDoc 的提案,它与 JSDoc 非常相似。不幸的是,官方网站似乎已离线(http://cssdoc.net/)。我找到的唯一一份现存文档是一篇德语博客文章:http://webkrauts.de/artikel/2007/stylesheets-kommentieren-mit-cssdoc
这可能是这篇文章的一个有趣的补充。
这是一个有趣的发现!我将看看是否可以找到有关此项目的信息。遗憾的是,它可能已被放弃…… :(
有人可以推荐他/她最喜欢的文本编辑器和 KSS 的**主题**吗?(在我的情况下是 ST2 或 Atom)
在整天处理这些“混合类型”文件时,看到原本 Sass 高亮显示的代码中出现纯灰色 HTML 代码变得非常无效。:/
我想知道,是否有任何工具没有那么依赖于样式指南生成,可以集成到现有的视图中?
老实说,我非常沮丧,因为所有现有的文档工具都太武断,并且包含了它们自己的生成器,甚至最终导致了Vandoc的概念。我很乐意听到你的反馈。
我同意上面 Serj 的观点。现有的工具对源目录结构过于武断,难以集成到现有项目中,并且无法很好地处理复杂的 JS 组件。
出于这些原因,我创建了LivingStyleGuides.com。它从任何文件中提取 Markdown 注释块——CSS、Sass、JS、React、Markdown 等——并生成一个与你的应用程序完全分离的动态样式指南。只需添加Bootstrap 的 Less 源代码中的 Stylemark 文档,你就可以快速创建一个Bootstrap 样式指南,其中包含与官方样式指南相同的信息。
它使用Stylemark,它类似于 MDCSS/aigis,但增加了多语言示例和每个示例的自定义 CSS、JS 和 HTML 等功能
Nucleus 仍然存活吗?它有两个 PR(其中一个来自我们),一个 PR 有一个月历史了。两者都失败了,因为 Travis 似乎没有正确设置。没有任何反馈。此外,提交活动似乎非常低。
https://github.com/holidaypirates/nucleus/pulls
并非如此。好吧,只要我们处理经典的、类似 JavaDoc 的文档,它就是王者,但最近在 JavaScript 中,有更好的(或被认为是更好的)方法来生成“文档”,并为编译器构建线索。TypeScript 的类型注释就是一个例子。对于其余部分,代码应该不言自明,当这还不够时,测试应该阐明函数的目标。
无论如何,CSS 几乎不存在这样的东西,所以这就是本文派上用场的地方。