前端工程化日益成熟今天,咱們對於工具愈來愈深的封裝。無論是從vue-cli
的3.0
版本起,仍是umi
、bigfish
等前端腳手架,對於webpack
都封裝在內,對於工程化無疑是高效的,但也在必定程度上讓新手們者失去了從零配置一個項目的機會,因此不少時候仍是但願能透過大神們的框架,研究一下底層結構。css
PostCSS是一個經過JS插件轉換樣式表的工具,它自己並非一門新的CSS語言,而是一個平臺或者是生態心態,提供插件擴展服務即JS API,開發者能夠根據這些接口,定製開發插件,目前比較流行的插件工具如:Autoprefixer
、Stylelint
、CSSnano
。html
大體步驟:前端
在PostCSS中有幾個關鍵的處理機制:vue
Source string → Tokenizer → Parser → AST → Processor → Stringifiernode
將源css字符串進行分詞webpack
舉個例子:git
.className { color: #FFF; }
經過Tokenizer後結果以下:github
[ ["word", ".className", 1, 1, 1, 10] ["space", " "] ["{", "{", 1, 12] ["space", " "] ["word", "color", 1, 14, 1, 18] [":", ":", 1, 19] ["space", " "] ["word", "#FFF" , 1, 21, 1, 23] [";", ";", 1, 24] ["space", " "] ["}", "}", 1, 26] ]
以word
類型爲例,參數以下:web
const token = [ // token 的類型,如word、space、comment 'word', // 匹配到的詞名稱 '.className', // 表明該詞開始位置的row以及column,但像 type爲`space`的屬性沒有該值 1, 1, // 表明該詞結束位置的row以及column, 1, 10 ]
通過Tokenizer以後,須要Parser將結果初始化爲ASTvue-cli
this.root = { type: 'root', source: { input: {css: ".className { color: #FFF; }", hasBOM: false, id: "<input css 1>"}, start: { line: 1, column: 1 } , end: { line: 1, column: 27 } }, raws:{after: "", semicolon: false} nodes // 子元素 }
通過AST以後,PostCSS提供了大量JS API給插件用
插件處理後,好比加瀏覽器前綴,會被從新Stringifier.stringify
爲通常CSS。
PostCSS更多的是提供平臺能力,賦能js的處理。