我最近在一些工作流当中采用了PostCSS —— Meteor工作流、简单的React和Webpack工作流。我知道我必须得去使用它,因为所有人都很兴奋地去用,而且它也确实从没让我失望过。你将会看到一些我还没不太知道PostCSS是什么之前的一些想法。
这里是你可能有的一些对PostCSS的想法:
- 你可能觉得它是个预处理器替代品
- 你可能感觉很难把它加进现在的工作流
- 你可能并不知道自己已经在使用它,通过Autoprefixer插件
- 你可能觉得自己并不需要它
我尽力一条条阐述清楚。这些仅仅是我个人的观点,当然,肯定也有很多人和我想法类似。
你可能觉得它是个预处理器替代品
当然它不是,PostCSS是一个使用特殊附加语法读取你的CSS代码,再处理它最后返回普通CSS代码的JavaScript工具。那这对你来说有什么意义?意义就是你还是可以用喜欢的预处理器,你也可以在这些预处理器没效果的地方使用PostCSS,比如检测、添加前缀和CSS4的特性。意味这你能以PostCSS plugin的形式去写一些逻辑,它会按你让它做的去做。你可以在这里postcss.part找到许多为PostCSS提供的插件,但是PostCSS最强大的地方是你可以为它编写你自己的自定义插件。这点很牛因为这很模块化。请看一下官方文档plugin development documentation。
只用记住它不是一个预处理器替代品,尽管你想让它去替代它确实也能。有个很好的例子,看一下PreCSS Plugin的包,这就是一个很多PostCSS Plugin构成的工具集合,它能替代你的Sass预处理器。
习惯了使用Sass或者Stylus,你还是能使用它,预处理之后你还是能用PostCSS的插件去处理它。
你可能感觉很难把它加进现在的工作流
你可能在使用一些构建工具,比如Gulp、Grunt、webpack。如果这样,你只用安装合适的插件就行。你将会找到和它相关的Grunt tasks、Gulp tasks,和Webpack loaders。
它非常模块化和灵活,你只要选择自己真正需要的插件,你不用像安装预处理器一样安装所有的功能。
你可能并不知道自己已经在使用它,通过Autoprefixer插件
有趣的是很多人一直都在用Autoprefixer但他们并不知道,事实上,这个场景下他们用的是PostCSS。Autoprefixer就是一个PostCSS插件,负责拿到你的CSS,检查它的浏览器兼容性,添加特定的必要的头部给你的CSS声明。这是一个很好的例子说明PostCSS plugins在做什么。
有几个预处理器插件实现了Autoprefixer,最常用的是autoprefixer-stylus和less-plugin-autoprefix 。他们只是在底层利用了PostCSS和Autoprefixer plugin。
你可能觉得自己并不需要它
有一些人觉得自己只用Sass和Stylus就够了,我能理解他们,因为确实一些情况下这就足够了。但是,让我看看一些情况下我们的预处理器并不能满足需求。
第一,Autoprefixer 插件的例子。
第二,Stylelint。Stylelint是一个非常棒的PostCSS插件,提供了对CSS检测的工具,和很多配置项。
第三,Lost Grid System。Lost Grid System是一个很棒的栅格系统,被写成了一个PostCSS插件。
最后一个例子是CSSNext。使用这个PostCSS插件,你可以用将来的CSS4语法。
当我们谈论PostCSS的时候,我们在谈论什么
当我们在说PostCSS的时候,我们可能在交替地讨论以下两种情况:
- PostCSS本身,你可以运行npm install postcss会得到的
- PostCSS这个工具支持的插件体系
这个工具本身是一个NodeJs模块,将CSS解析成AST(抽象语法树),传递这个AST给一些插件内的方法,最后再将它转回字符串,你就可以将它输出到文件中。AST经过的函数可能会也可能不会转化它,同时source-map会生成以跟踪任何的改变。
AST提供了一个很简单直接的Api,开发者能用它来开发plugin。比如,你可以通过css.eachRule()用到每一个设置进文件规则,或者通过rule.eachDecl()拿到每一个声明,通过rule.selector获取规则集,通过atRule.name获取规则名称。你会发现,PostCSS让你很容易去操作CSS源码。
PostCSS可以为各种阅读和操作你的CSS的插件提供强大的支持。
记住一点,PostCSS本身和它的插件体系,都不和Sass和Less有直接类似的地方。但是,将一些相关的将用户友好stylesheets转化成浏览器友好stylesheets的插件绑定在一起,它们就有了和预处理器相似的作用。
但是也请记住,这些插件体系的补充内容。没有哪个插件或包是或者能代表PostCSS。
本文翻译自 julian.io/some-things… 和 davidtheclark.com/its-time-fo…