Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

开发一个psotcss插件 #6

Open
alowkeyguy opened this issue Mar 18, 2019 · 0 comments
Open

开发一个psotcss插件 #6

alowkeyguy opened this issue Mar 18, 2019 · 0 comments

Comments

@alowkeyguy
Copy link
Owner

alowkeyguy commented Mar 18, 2019

类型

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输出,在一些简单的处理中可以用这种方法。

写在最后:

参考:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant