更便捷的css处理方式-PostCSS

一般来说介绍一个东西都是要从是什么,怎么用的顺序来讲。我感觉这样很容易让大家失去兴趣,先看一下postcss能做点什么,有兴趣的话再往下看,否则可能没有耐心看下去。让我们开始吧

postcss能做什么

补全css属性浏览器前缀

手写的代码可以是这样的:

.div{
display: flex;
}

postcss可以转换之后成了这样:

.div{
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}

检查css语法

    body{
color: #f0;
}

会有以下提示:

src/er.css
2:12 ✖ Unexpected invalid hex color "#f0" color-no-invalid-hex [18:27:28] 'css-lint' errored after 98 ms
[18:27:28] Error in plugin 'gulp-stylelint'
Message:
Failed with 1 error

拥抱下个版本规范的css 即css4

对于下个规范的css而言,变量,方法等功能的都会增加上去,你可以这样来定义一个变量:

:root {
--red: #d33;
}
a {
color: var(--red);
}

当然直接在现有浏览器上是跑不通的,就正如es2015刚开始一样,我们需要一个转化器来将其转成当前可用规范。postcss的插件就可以做到。

a{
color:#d33
}

除了上面之外还有其他很多功能,postcss及其插件都能提供。

什么是postcss

现在让我们回到最基本的问题,postcss是什么。

援引官网的定义,一种使用js来转化css的工具(A tool for transforming CSS with JavaScript)。其实我们更多的时候提到postcss是有两个含义的:

  1. postcss本身,也就是我们npm install时的安装部分
  2. 基于postCss的丰富插件系统。

    上文那些功能,都是基于postcss的插件提供的功能。

postcss本身并不直接用于处理样式,只有配合它的插件,才能完成相关的编译工作。

postcss不是预编译语言的替代品

我想你脑海里一直在复现两个名词,less/sass,开始的时候我也一样,认为postcss跟二者一样是一种css预编译语言或者起到类似作用的一种语言。postcss不是要取代哪一个,更多的是提供的一种补充,完全可以是互补的概念。

作为一个是使用js将css转化为AST然后进行处理的工具,完全不是预处理语言的替代品,postcss处理的必须是css文件,所以完全可以和预编译语言结合,使用预编译语言转化为css之后然后进行处理。

我一直认为两者不是互斥的关系,完全可以互补使用。

为什么需要postcss

大家可能有这么个疑问既然两者不互相冲突,目前我使用less/sass 也很容易满足我的需求,为什么要使用新的东西呢。我认为主要原因是其提供的丰富的插件功能,可以工作更加的简单化,便捷化,一句话,你只需要编写基本的css,其他的功能交给postcss就好。做了简单的对比可能更加清晰明了。

实现给css属性加上浏览器前缀的功能

对比一下less和postcss的实现:

1、 对于less而言,肯定是写一个方法

.flex-block() {
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
.test{
.flex-block()
}

2、使用postcss

.test{
display: flex;
}

只需要编译的时候使用autoprefixer处理就好。

可能一个属性的效果不是特别明显,要是有很多个属性需要处理呢?

.flex-block() {
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
.transform(){
//仅仅是举例子
}
.ccc(){
}
.test{
.flex-block()
.transform()
.ccc()
}

这时候postcss还是只需要如下:

.test{
display: flex;
transform:rotate(7deg);
}

这时候就能看出来postcss的便捷性了,我一直认为可以抽象公共化的东西完全没有必要去重复的去手动开发。

postcss工作原理

postcss本身是一个node模块,可以将css文件解析为抽象语法树(AST),将该树在多个插件方法传递,然后将AST转换为字符串返回,该字符串可以输出到目标文件中。传递过程中的插件可以选择是否改变该语法树,上诉改变可以通过sourcemap来记录。如下面的流程所示(借用w3cplus的一张图):

其实这里我们更应该关联起来的是babel,看一下功能:

  • 将未来规范的转化为当前规范的转义器
  • 实现相同,都是将源文件解析为AST然后经由插件处理。
  • 丰富的插件,满足不同的需求
  • 支持自定义插件的开发

当前工作流中引入postcss

大家可能会有这种想法,又是一种新的工具,我当前的开发框架中岂不是要大动。其实这种担心是没必要的。postcss是很容易引入当前的工作流中的。无论是webpack还是gulp,都有比较方便的方式。官方有详细的介绍文档

结束语

原先很早就看到postCss,当时太年轻认为是less的一种替代品罢了,所以一直没有去关注。了解之后感觉真的不错,至于如何使用这里就不去演示了,有兴趣的可以查看下我的简单示例希望更多的人使用。

参考文章

http://davidtheclark.com/its-time-for-everyone-to-learn-about-postcss/

http://julian.io/some-things-you-may-think-about-postcss-and-you-might-be-wrong/

更便捷的css处理方式-postcss的更多相关文章

  1. css处理工具PostCss

    在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中.这给开发人员带来了效率上 ...

  2. CSS引入方式的区别详解

    在web前端开发中,CSS是一种用来表现HTML或XML等文件样式的语言.很多处于web前端初学阶段的朋友,很多人都不知道CSS引入方式存在三种方法,css引入方式分别为标签内联书写.页面头部书写.外 ...

  3. 23----2013.07.01---Div和Span区别,Css常用属性,选择器,使用css的方式,脱离文档流,div+css布局,盒子模型,框架,js基本介绍

    01 复习内容 复习之前的知识点 02演示VS创建元素 03div和span区别 通过display属性进行DIV与Span之间的转换.div->span 设置display:inline   ...

  4. Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

    Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没 ...

  5. 前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法

    前端开发周报:CSS 布局方式与JavaScript动画库 1.常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局.Grid 布局.圣杯布局.双飞翼布局等.http: ...

  6. 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结

    史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...

  7. 项目复习期总结3:CSS引入方式,凝视,命名规范,背景,行高,文本属性

    文件夹: 1.CSS凝视的书写 怎么写?优点? 2.CSS引入方式  各种的优缺点 3.选择器的写法与选择器的优先级 4.CSS命名规范 5.背景,行高 6.文本(text与font开头)等全部属性 ...

  8. 更便捷的Mybatis增强插件——EasyMybatis

    easy-mybatis是一个对Mybatis的增强框架(插件).在Spring集成Mybatis的基础上,将项目开发中对数据库的常用操作统一化.使用本框架可以很便捷的对数据库进行操作,提高开发效率, ...

  9. HarmonyOS新能力让数据多端协同更便捷,数据跨端迁移更高效!

    作者:yijian,终端OS分布式文件系统专家:gongashi,终端OS分布式数据管理专家 HarmonyOS作为分布式操作系统,其分布式数据管理能力非常重要.我们也一直围绕持续为开发者带来全局&q ...

随机推荐

  1. HTML学习笔记 域元素(form表单、textarea文本域、fieldset域集合、input使用) 案例 第四节 (原创)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 一款很便捷很实用的框架——vue.js

    Hello,大家好!今天给大家带来一款十分好用的框架--vue.js! Vue.js是一套构建用户界面的渐进式框架.它 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 ...

  3. (转)Ubuntu 12.04 中安装和配置 Java JDK

    http://www.cnblogs.com/bluestorm/archive/2012/05/10/2493592.html 先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-7 ...

  4. mysql全日志(general log)的命令名称

    在源码sql/sql_parse.cc中定义 const LEX_STRING command_name[]={ { C_STRING_WITH_LEN("Sleep") }, { ...

  5. [转]Android应用安装包apk文件的反编译与重编译、重签名

    背景介绍: 最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission androi ...

  6. Java提高十七:TreeSet 深入分析

    前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...

  7. sklearn 划分数据集。

    1.sklearn.model_selection.train_test_split随机划分训练集和测试集 函数原型: X_train,X_test, y_train, y_test =cross_v ...

  8. npm模块管理器入门

    什么是 NPM npm 是 Node 官方提供的包管理工具,他已经成了 Node 包的标准发布平台,用于 Node 包的发布.传播.依赖控制.npm 提供了命令行工具,使你可以方便地下载.安装.升级. ...

  9. 【ElementUI】日期选择器时间选择范围限制

    ElementUI是饿了么推出的一套基于vue2.x的一个ui框架.官方文档也很详细,这里做一个element-ui日期插件的补充. 官方文档中使用picker-options属性来限制可选择的日期, ...

  10. php条件语句(二)

    switch 语句用于根据多个不同条件执行不同动作. PHP Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 switch 语句. 语法 switch (n){case label1 ...