css插件,开发一个psotcss插件

节点类型

postcss会将我们的css生成ast,然后会去遍历它,在遍历的过程中会传给我们一些不同类型的节点对象,我们主要需要了解的几个类型:

css ast主要有3种父类型

AtRule: @xxx的这种类型,如@screen

Comment: 注释

Rule: 普通的css规则

还有几个个比较重要的子类型:

decl: 指的是每条具体的css规则

rule:作用于某个选择器上的css规则集合

这是test的地方的,不熟悉ast的可以先了解一下:css ast结构

postCss操作方法

postCss为我们提供了一些方便的操作方法

遍历

walk: 遍历所有节点信息,无论是atRule、rule、comment的父类型,还是rule、 decl的子类型

walkAtRules:遍历所有的atRule

walkComments:遍历所有的注释节点

walkDecls:遍历所以的属性

walkRules:遍历所有的css代码块

root.walkDecls(decl => {

decl.prop = decl.prop.split('').reverse().join('');

});

postcss在遍历的过程中,会将当前遍历的对象的cell传给回调函数,该参数是对应的rule,decl或者comment等Constructor等构造函数的实例,根据遍历的节点不同,该实例可能会有如下属性:

nodes: css规则的节点信息集合

decl: 每条css规则的节点信息

prop: 样式名,如width

value: 样式值, 如10px

type: 类型

source: 包括start和end的位置信息,start和end里都有line和* column表示行和列

selector: type为rule时的选择器

name: type为atRule时@紧接rule名,譬如@import 'xxx.css'中的import

params: type为atRule时@紧接rule名后的值,譬如@import 'xxx.css'中的xxx.css

text: type为comment时的注释内容

同样还有继承的一些方法,给我操作css的, 比如操作每条具体css属性的declaration:

after

before

cleanRaws

clone

cloneAfter

cloneBefore

error

next

prev

raw

remove

replaceWith

root

toString

warn

postcss plugin

postcss插件如同babel插件一样,有固定的格式

export default postcss.plugin('postcss-plugin-name', function (opts) {

opts = opts || {};

return function (root, result) {

// 处理逻辑

};

});

注册个插件名,并获取插件配置参数opts

返回值是个函数,这个函数主体是你的处理逻辑,有2个参数,一个是root,css ast的根节点。另一个是result,返回结果对象,譬如result.css,获得处理结果的css字符串,result.message包含组件里创建的warnings和自定义信息,result.warn()创造一个warning实例并将其加入到result.message中,result.warnings()获得所有创建过的warning。

注意组件的异常信息处理,不要直接console,因为一些 postcss 处理器会过滤掉console的输出导致异常信息丢失,用node.warn或者node.error创造CssSyntaxError 实例,会自动带上源码中的位置信息帮助debug,加到异常信息队列里。

直接调用postcss下的方法

可以用postcss.parse来处理一段css文本,拿到css ast,然后进行处理,再通过调用toResult().css拿到处理后的css输出,在一些简单的处理中可以用这种方法。

写在最后:

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值