去年秋季,我们的开发团队想要开始使用样式指南。 我们团队中增加了一位新成员,在他开始学习的过程中,我们意识到我们的项目文档有多么缺乏。 如果你曾经在文档薄弱的团队中担任过新开发者,你就会知道,在没有文档的情况下尝试熟悉十几个项目是多么令人困惑。
在决定样式指南方法时,我们提出了两个主要要求
- 低摩擦样式指南应该易于查找、易于阅读和易于维护。 能够融入我们现有的开发工作流程将非常棒。 为示例标记和文档文件添加新目录将不会那么棒。
- 平台无关我们最常使用 WordPress、Drupal 和 CakePHP,我们想要一个在所有三个平台上都能以相同方式运行的东西。 我们希望这易于维护,对我们来说,这意味着将文档与 CSS 保持在一起。
Node-KSS 的基础知识
为了实现平台无关、低摩擦样式指南的目标,我们选择了 kss-node,它本身是 Knyle Style Sheets (KSS) 的 Node.js 实现,这是一个 Ruby 库,它
…为团队提供了一种编写可维护、有文档的 CSS 的方法。 具体来说,KSS 是一种文档规范和样式指南格式。
基本原理是,您的样式指南是通过您在 CSS、SCSS、Sass、LESS 等中创建的注释生成的。
您编写一些像这样的 CSS
// Bold Button
//
// Use this class for a bolder, stronger looking button.
//
// Markup:
// <button class="btn btn-bold">Click Me</button>
//
// Styleguide Components.Buttons.bold
.btn.btn-bold {
position: relative;
font-weight: bold;
text-transform: uppercase;
}
并获得这样的精美输出

您可以根据自己的喜好组织文档,它还会为您生成一个漂亮的导航和文档结构

因为它存在于您的 CSS 中,所以更新它自然地适合现有的开发工作流程。 如果您更新了一些 CSS 属性,样式指南会自动更新。 如果您需要更新文档,文档文本就坐在您正在处理的组件的顶部。 即使您从未访问过生成的样式指南,您也会在每次打开 CSS 文件时看到样式指南。 低摩擦? 确定。
此外,由于我们在所有 Web 项目中都使用 CSS 和构建流程,因此它与我们需要的平台无关。
让我们开始吧!
初始设置
在您的项目目录中,您需要将 kss-node 安装为项目依赖项。 我们还将安装 michelangelo,这是一个用于样式指南的不错的主题
$ npm install --save-dev kss michelangelo
您可以通过运行以下命令来验证它是否已安装
$ ./node_modules/.bin/kss --version
我们将创建一个名为 kss-config.json
的文件来配置我们的 KSS 设置。
在您的文件中,创建如下所示的对象(请注意,我下面的注释仅供参考,为了获得最佳效果,请从您的配置文件中删除它们)
{
"title": "Title of the Style Guide",
// Source tells KSS where the CSS, Sass, or SCSS is that it should parse for documentation comments.
// Here we are assuming your sass is in a directory at the root level of your project.
"source": "sass/",
// Destination tells KSS where to compile your style guide to.
"destination": "styleguide/",
// Builder tells KSS where to look for a theme.
// If you aren't using michelangelo, you don't need this.
"builder": "node_modules/michelangelo/kss_styleguide/custom-template/",
// CSS gives KSS the path to your CSS, so it can pull your styles into the style guide.
// The path needs to be relative to your style guide destination.
// Here, our style guide is in /styleguide and our compiled css is at our project root.
"css": [
"../main.css"
],
// If you want to include any javascript files, add this block, with the path to your javascript file.
// Also relative to your style guide destination.
// Optional.
"js" : [
"../bundle.js"
]
}
这假设一个简单的项目目录树,如下所示
js/
sass/
bundle.js
index.html
main.css
您可以尝试通过运行以下命令来编译样式指南
$ ./node_modules/.bin/kss --config kss-config.json
如果您想要一个更简洁的命令来运行,请在 package.json
中的 scripts 块中添加一个脚本
"scripts": {
"kss": "kss --config kss-config.json"
},
现在,您可以运行 $ npm run kss
来编译您的样式指南。(我将在后面使用这种方法,但如果您愿意,也可以使用 $ ./node_modules/.bin/kss --config kss-config.json
)。
但是,由于我们还没有编写任何文档,因此您可能会收到以下消息
错误:在源文件中未发现 KSS 文档。
让我们通过记录我们的第一个组件来解决这个问题!
创建并记录一个简单的组件
我们将创建一个示例帖子标题组件。
这是我们的 CSS
.post-title {
font-size: 3em;
text-align: center;
font-family: fantasy;
}
为了创建我们的文档,我们将创建一个注释
// Post Title (this will be the title of your component)
//
// Large, **in charge**, and centered. (this is the description of your component. you can use markdown in here.)
//
// Markup (define the markup to be used in your styleguide):
// <h1 class="post-title">A Post Title</h1>
//
// Styleguide Components.article.post-title
// (ꜛ this controls the organization of your style guide. Here, I'm filing this component inside Components / Article / Post Title)
.post-title {
font-size: 3em;
text-align: center;
font-family: fantasy;
}
运行 $ npm run kss
,您的样式指南应该会编译! 您可以根据您提供的目标路径访问它。 在这个示例中,我们有一个静态站点,我将其编译到 /styleguide
中,因此这是我用来查找它的 URL。 以下是使用 michelangelo 主题时它应该是什么样子(我已经删除了括号中的注释)

以下是发生的事情
- KSS 为我们的帖子标题创建了一个文档部分,其中包含我们提供的标题、描述、标记和 CSS。 您可以看到渲染的 HTML 和 CSS 以及原始 HTML。
- KSS 看到我们将帖子标题嵌套在 Components / Article 下面,因此它创建了一个 Components 顶级部分和一个 Components.article 部分。 我们的帖子标题嵌套在这两者之下。
- KSS 根据这种层次结构生成了一个导航。
如果您想提供有关 Components 的更多信息,您可以提供一个文档块(实际上在 CSS 的任何地方都可以),如下所示
// Components
//
// Components are ingredients of our design system. They may be made up of smaller groups of styles.
//
// Styleguide Components
同样,您可以通过定义一个使用 Styleguide Components.article
方法定位该项目的文档块来提供有关 article 组件的更多信息
// Article
//
// An article is made up of a title, featured image, and some default
// typographic settings for links, italics, bold, and blockquotes.
//
// Styleguide Components.article
使用这些新的文档块,再次编译您的样式指南 ($ npm run kss
),您将看到您的大纲会更完整一些

记录组件状态和变体
我们的帖子标题组件非常简单,但我们需要在我们的样式指南中显示更复杂的信息。 KSS 可以轻松处理组件的变体以及交互式状态,例如 :hover
或 :focus
。 我们将记录一个按钮来显示这一点。
我们的按钮将为 :focus
和 :hover
提供不同的样式,以及一个小的变体和一个大的变体。 以下是我们将要使用的 CSS
.button {
padding: 1em 2em;
margin: .5em;
display: inline-block;
font-size: .9em;
font-family: Helvetica, sans-serif;
font-weight: bold;
text-transform: uppercase;
color: #f56476;
background-color: #fff;
border: 2px solid #f56476;
transition: .2s color, .2s background-color, .2s border-color;
}
.button:hover {
color: #fff;
background-color: #f56476;
}
.button:focus {
color: #3ddc97;
border-color: currentColor;
}
.button--small {
font-size: .5em;
}
.button--large {
font-size: 1.5em;
}
我们将像我们为帖子标题所做的那样格式化我们的文档,并添加两个补充内容:我们将向所有将获得修改器元素添加一个占位符类 {{modifier_class}}
,并将直接在我们标记的下方定义我们的状态/变体。 我们的注释块将如下所示(我已经添加了一些注释,括号中是说明)
// Buttons (title, same as before)
//
// Various button styles. (description, just as before)
//
// Markup: (we add the `{{modifier_class}}` to every element that has a modifier)
// Link Button
// <button class="button {{modifier_class}}">Button Element</button>
// <input class="button {{modifier_class}}" type="button" value="Input Button" />
//
// (a new modifiers section)
// :hover - When user hovers over button.
// :focus - When button is focused.
// .button--small - A small button.
// .button--large - A large button.
//
// Styleguide Components.button (organization, just as before)
您可以看到,我已经为我在 CSS 中声明的每个变体添加了一个变体。 格式为
// .class-name - Description
或
// :state - Description
编译样式指南后,您将获得以下新文档

您可以看到,您现在有了您在修饰符部分描述的每个状态和变体的示例,并应用了相应的 CSS。
这种技术也适用于比这个按钮更复杂的组件。 假设您有一个 .card
组件,其中包含内部的子元素,这些子元素需要在用户悬停在卡片上时更改。 要记录这一点,您只需将 {{modifier_class}}
添加到 .card
元素并像上面一样指定悬停状态。
组织
默认情况下,部分将按其标题的字母顺序组织。 例如,在上面的示例中,我们的按钮组件将出现在我们的文章组件之后。 但是,如果您想更改组件或其他部分的顺序,可以为组件提供权重。 权重越高,组件在其部分中越靠下。 权重越低,组件在其部分中越靠上。
使用 Sass 或 SCSS 时,我将组织注释放在 main.sass
或我导入部分的位置。 例如,在一个最近的项目中,我有一个 Typography 部分和一个 Elements 部分,它们都归档在 Base 顶级部分之下。 自然地,KSS 会按字母顺序组织这些部分,但我希望 Typography 首先出现。 以下是我在 main.sass
文件中更改权重的方式
// Typography
//
// Weight: 1
//
// Styleguide base.typography
@import "base/typography"
// Elements
//
// Weight: 2
//
// Styleguide base.elements
@import "base/elements"
调色板
我们正在使用的 Michelangelo 主题提供了一个很酷的调色板生成器。如果你正在使用 Sass 或 SCSS,你可以记录你的颜色变量名称,KSS 会格式化一个小的调色板块。
就像这样注释
// Highlight Colors
//
// Colors we use for higlighting states.
//
// $highlight-blue - #1460aa; primary blue
// $highlight-purple - #674172; secondary purple
// $highlight-red - #d50000; danger red
//
// Styleguide Base.colors
KSS 会创建一个调色板,方便你像这样参考

自动编译样式指南
与其每次修改 CSS 时都运行 $ npm run kss
,不如添加一个监视任务,以便每次我们的 CSS 文件发生变化时都重新生成样式指南。我将在下一步中介绍如何使用 npm Scripts 和 Grunt 来实现。
npm Scripts
我们已经使用 npm 脚本来构建样式指南,我们只需要添加一个脚本,它将监视我们的样式指南。
我们将使用 onchange 包。首先安装它
$ npm install onchange --save-dev
然后在我们的脚本对象中添加一个新的脚本
"scripts": {
"watch": "onchange 'sass/**/*.sass' -- npm run kss",
"kss": "kss --config kss-config.json"
},
监视任务告诉 onchange
监视我们在 glob 模式 ('sass/**/*.sass'
) 中指定的 文件,并且当它检测到更改时,运行我们在 --
后指定的命令:npm run kss
。
现在运行 $ npm run watch
将监视我们的 .sass
文件,并在每次检测到 Sass 中的更改时重新生成样式指南。
Grunt
KSS 有一个官方的 Grunt 插件,grunt-kss。你可以将其配置为监视你的 .sass
或 .scss
文件以查看更改,并在你开发时重新编译样式指南。
这是一个 Grunt 配置示例。使用此设置,你不需要单独的 kss-config.json
文件,所有配置都可以在你的 Gruntfile 中进行。
module.exports = function(grunt) {
grunt.initConfig({
kss: {
options: {
title: 'Title of the Style Guide',
builder: "./node_modules/michelangelo/kss_styleguide/custom-template/",
css: [
"../path/to/compiled/css.css",
],
js: [
"../path/to/compiled/javascript.js",
]
},
dist: {
src: "path/to/css/src",
dest: "styleguide/",
}
},
watch: {
sass: {
files: [
'./path/to/**/*.sass'
],
tasks: ['kss']
},
}
});
grunt.loadNpmTasks('grunt-kss');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('dev', ['kss', 'watch']);
}
运行 $ grunt dev
将首先生成样式指南,然后监视我们的 .sass
文件以查看更改,并在检测到更改时重新生成样式指南。
总结
在官方 KSS 仓库 中还有更多关于注释解析和其他功能的详细信息,这些功能我在本文中没有提及。本文已经提供了足够的信息让你开始使用,但有一些内容我没有深入介绍,包括自定义主页、实验/弃用标志和预处理器的帮助程序。
如果你想更进一步,可以开发自己的样式指南来代替我们使用的 Michelangelo 主题。查看 使用自定义模板的文档 以了解更多信息。
Benjamin,
谢谢!谢谢!谢谢!:-D
这正是我一直在寻找但没有时间找到的东西…… ;-)
期待将它整合到我的构建过程中,尽管是使用 Gulp。
J
太棒了!很高兴我能帮上忙。那里有一个 gulp-kss 插件,但我没有使用过。看起来它可能已经过时,不再支持,所以你可能有机会创建一个新的!
我看到了那个 Ben,我同意它可能有点过时了!:-D
我还发现了这个小东西:https://www.triplet.fi/blog/avoiding-unnecessary-gulp-plugins/,它可能会改变我处理大多数第三方集成到我的构建过程中的方式!
我们拭目以待…… ;-)
干杯,
J
嗨 Jon,作为一个 Gulp 用户(一个初学者 :)),我设法让它与 kssNode 协同工作,就像你链接的文章中解释的那样。这是我的仓库链接,如果它有所帮助 https://github.com/lucijanblagonic/polar-starter
干杯!
Benjamin,
我发现这篇文章很有趣,我现在正在公司创建样式指南。
我很好奇你使用这种注释样式创建模板时的体验,例如一些分组的表单输入或示例页面。
根据我的经验,它非常适合分组元素,但我没有将它用于渲染页面。
对于分组的表单输入,我通常会将基本表单元素样式保存在位于
base/inputs.sass
中的部分。它将包含基本输入样式。我会将任何类型的分组输入样式保存在像components/form-instance.sass
这样的部分中,并且该组件将有自己的单独文档。你还可以为组件包含 Javascript,有时在使用 React 进行项目时,我会包含一个 React 将绑定到的元素以渲染组件,以及 React 生成的 HTML 的注释版本。这样我就可以获得组件的工作版本,但如果需要,也可以参考标记。这是一个示例。
就像我上面说的,我没有将它用于渲染页面,我不确定这是否是最好的工具。我认为你最终会写很多额外的注释和示例标记,这些标记会弄乱你的 Sass/SCSS。
Ben,
这篇博文写得很好。KSS 提高了我们 CSS 的可维护性。
它在为我们提供样式表的可视化参考方面做得很好。创建贴纸表太费时,而且总是过时。
期待你更多的文章!
哦,太棒了!我将尽快从 styleguidejs 切换过来。这看起来棒极了。
一直给我错误,我对 node/npm 还不太熟悉。如果你的说明对像我这样的人来说更清晰一点就好了。我不明白为什么我不断收到错误 :(
无效的 JSON 配置文件:kss-config.json
嗨 Roger,
我建议尝试对你的 kss-config.json 文件进行 lint,以确保其中没有错误。这是一个基于 Web 的 linter。你可以将文件内容复制粘贴到那里,然后单击 lint,它将显示任何错误。
你可能需要删除我添加的注释以备注释,并检查确保没有丢失的逗号或引号。
绝对需要从 JSON 文件中删除注释。即使你在脚本中告诉它忽略它们('–//’),它仍然会出错。你可能需要在文章中指出这一点。我花了一个小时试图弄清楚,以为注释没有理由会导致问题……真是奇怪。
我在文章中对我的评论做了一个注释,感谢你的提示!
太棒了!感谢回复。感谢你的精彩博文。我现在正在尝试将它集成到我的工作流程中。
我遇到了一个问题,
{{modifier_class}}
无法填充,要么被替换为空白、[modifier]
或{{modifier_class}}
。你能帮忙解决一下,因为我在网上找不到太多关于这个问题的信息。嗨 Draz,
如果你问的是
{{modifier class}}
在生成的样式指南的示例 HTML 标记中无法填充 - 我认为这是有意为之的。如果你看一下这个例子,你可以看到标记示例在标记中保留了
[modifier class]
,而生成的示例则按预期显示了每个类/状态的差异。如果你在让示例显示方面遇到问题,你可以检查文档注释中标记和修饰符部分之间的间距。确保标记和修饰符列表之间没有文本。
希望这能稍微解决一些问题!
嘿 Benjamin,非常感谢!我将在刚完成的项目中实施它,这个自动生成的文档将是锦上添花!
一个问题:有没有办法清除无用的生成文件?我发现当你添加注释并生成页面后,然后删除或替换它们(例如:拼写错误、不再使用的样式等),生成的 文件不会消失。它们从索引中删除,但 .html 仍然存在。我们能自动清除它们吗?
嗨,Sarah - 这是一个有趣的问题。我不知道除了删除目录并重新编译之外,还有没有办法自动清除旧的生成文件。
话虽如此,根据你的部署流程,这可能不是必需的。对于我们来说,我们一直告诉 git 忽略编译后的样式指南。样式指南本身不在我们的 git 仓库中。当我们部署到 staging 或 production(我们使用 capistrano)时,所有 旧文件都会被删除,并用来自 git 仓库的新文件集替换。然后我们运行任何编译,比如 Sass 或 KSS。这样一来,每次我们都会获得一个全新的样式指南版本,如果理解正确的话,所以那些旧文件根本不存在。
一篇关于 KSS 样式指南的非常详尽的文章 - 我很喜欢。我喜欢米开朗基罗主题以及它们如何为样式指南生成配色方案。太棒了。
我也有过一些使用 KSS 样式指南的经验,我们用它来为 WordCamp Europe 创建一个主题,我甚至写了一篇关于它的文章。也许你会觉得它有用:https://2017.europe.wordcamp.org/2017/05/09/using-style-guides-for-modular-wordcamp-designs/
WordCamp Europe 样式指南在 GitHub 上开源提供,并带有 gulp 构建流程,请查看:https://github.com/lucijanblagonic/wceu-2017
太棒了!我正在开始使用它,想办法在我的公司中实现它。这可以为我们节省很多问题和麻烦。
只有一点,在第一个块注释的示例中,当使用标记时,浏览器将其呈现为 HTML,并且下一行注释被破坏了。
谢谢 Alejandro,不知道那里发生了什么,但我现在已经修复了。
所以它将每个 // 视为文档?我更喜欢 Hologram 的更具体的语法。
它只将包含指定样式指南中位置的行的注释块视为文档,例如
如果没有那行,注释块不会被包含为文档。