-
postcss-import:用于导入其他 CSS 可重用模块。注意:虽然用法和看起来都和传统 CSS 的 @import 非常接近,但它们不是一样的东西。最大的差别在于 postcss-import 可以直接引用到位于 node_modules 下的 npm package,这是我们得以在 addon 之间共享资源的基础所在。
因为 addon 和 dummy 是不同的目录结构,因此解析可以 import 的样式规则也略有区别,ui-foundation 保持了绝大多数的引用规则一致,下面这张表格解释了在各种情况下如何引用来自 ui-foundation 提供的样式组件:
项目 | 针对自身 | 针对 dummy 项目 |
---|
ui-foundation | @import "./extends"; | @import "extends"; |
其他 addon | @import "extends"; | @import "extends"; |
其他 app | @import "extends"; | 没有 dummy |
此外,尽管 postcss-import 也能像普通的 @import 一样导入各种样式文件,但是 ui-foundation 不推荐这么做。原因是所有的 postcss 插件其实都是 CSS Modules 技术栈的组成部分,往往引用的第三方样式并不希望把类名本地化,因此会出现出乎意料的副作用。对于第三方样式,比如 normalize.css 等,ui-foundation 都是使用 ember-cli-node-assets 导入的,不和 CSS Modules 技术栈牵扯。
简言之,postcss-import 在 ui-foundation 中的作用主要是引用可复用的 extends(下面介绍),尽可能不要用于其他场合。
-
postcss-nesting:用于实现兼容 CSS 标准的嵌套样式解析。
-
postcss-extend:用于实现类似于 sass 的 placeholder 功能。**注意:placeholder 和 mixin 开起来很像,但它们有本质的不同。mixin 是扩展目标选择符的内容,而 placeholder 则是定义了可共享的内容,扩展 placeholder 的选择符会合并在一起,而不是各自分开。**在实践中,placeholder 适用于固定规则的可重用样式片段,由于它不会复制自身所以非常节省最终样式的尺寸;而 mixin 最大的优点是可以传递变量动态生成不同的内容,但并不适合共享固定规则的样式片段,因为它会不断复制自己。
@import "extends";
.alpha {
color: seagreen;
@extend abs-center;
}
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
.alpha {
color: seagreen;
@extend abs-center;
}
.beta {
@extend abs-center;
color: skyblue;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s {
color: seagreen;
}
._beta_15x03s {
color: skyblue;
}
.alpha {
color: seagreen;
@extend abs-center;
}
.beta {
@extend .alpha;
color: skyblue;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s, ._beta_15x03s {
color: seagreen;
}
._beta_15x03s {
color: skyblue;
}
.alpha {
@extend abs-center;
}
.alpha:first-child {
color: seagreen;
}
.alpha a:active {
color: skyblue;
}
.beta {
@extend .alpha;
}
._alpha_15x03s, ._beta_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s:first-child, ._beta_15x03s:first-child {
color: seagreen;
}
._alpha_15x03s a:active, ._beta_15x03s a:active {
color: skyblue;
}
ui-foundation 包含的 extends.css 是一个定义 placeholder 的例子,有两种定义方法:
@define-extend placeholder {
}
.alpha {
@extend placeholder;
}
%placeholder {
}
.alpha {
@extend %placeholder;
}
它们的区别主要是:后者拥有前者所有的特性,同时,后者可以1)定义可以晚于使用;2)后者可以重复扩展,也就是用 placeholder 去扩展 placeholder,从而构造组合片段;3)定义和引用的时候名字前面必须有 %
符号;4)可以在嵌套规则内定义和使用,比如 @media
内等等。因此,ui-foundation 推荐一般使用第二种定义方法。
-
post-css-variables:用于定义 CSS 变量。注意:因为我们需要跨项目的共享/覆盖变量设置,因此 ui-foundation 的 CSS 变量不是写在 .css 文件里,而是写在构建脚本的配置项里。defaults.js 提供的是这些变量的默认值,在其他 addon/app 里增加/覆盖它们的方法在安装说明部分有更具体的描述。
.alpha {
color: var(--primary);
}
.alpha {
color: seagreen;
}
.alpha {
--primary: skyblue;
color: var(--primary);
--secondary: lightgray;
background-color: var(--secondary);
}
.alpha {
color: skyblue;
background-color: lightgray;
}
-
postcss-merge-rules:很多 PostCSS 插件会生成分散的样式规则,比如说:
.alpha {
color: seagreen;
@extend %abs-center;
}
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
}
._alpha_15x03s {
color: seagreen;
}
这个插件的作用就是将这样的结果合并起来,提高可阅读性并减少文件体积。其最终结果是:
._alpha_15x03s {
display: flex;
justify-content: center;
align-items: center;
color: seagreen;
}
-
postcss-discard-empty:用于剔除空的样式声明。空声明主要来自于嵌套语法,比如说:
.parent {
&-alt { }
& .child { }
}
.parent {}
.parent-alt { }
.parent .child { }
-
postcss-discard-comments:用于剔除 CSS 注释。如果有想要在最终结果中保留的注释,可以这样写:
-
postcss-discard-duplicates:用于合并重复的样式声明,比如:
h1 {
margin: 0 auto;
margin: 0 auto
}
h1 {
margin: 0 auto
}
h1 {
margin: 0 auto;
}