webpack開發(fā)--postcss插件

PostCss 是一個(gè)CSS后處理工具

PostCss 是什么

????首先,聊PostCss之前喝滞,我們得知道什么是CSS后處理工具红竭。我們比較熟悉的Less,Sass,Stylus,這類工具都屬于CSS預(yù)處理工具通過特殊的規(guī)則变隔、文本格式最終生成CSS文件规伐。而PostCss則是對(duì)CSS進(jìn)行處理,最終生成CSS匣缘。
????多數(shù)人最早接觸和使用的應(yīng)該是Autoprefixer這款插件猖闪,Autoprefixer的功能是:以 Can I Use 上的 瀏覽器支持?jǐn)?shù)據(jù) 為基礎(chǔ),自動(dòng)處理兼容性問題肌厨。

#  Autoprefixer 處理前的CSS樣式
.container {
display: flex;
}
.item {
flex: 1;
}
#  Autoprefixer 處理后的CSS樣式
.container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.item {
-webkit-box-flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
}

通過使用Autoprefixer插件培慌,很大程度上節(jié)省了CSS重復(fù)樣式的編寫。Autoprefixer正是PostCss眾多插件中的一款柑爸,查找更多插件吵护,點(diǎn)這里

PostCss 處理Css過程

作為一款可安裝使用各類插件的工具表鳍,PostCss 提供的API還是很簡(jiǎn)潔明了的(吐槽一下Less,什么鬼玩意兒何址,API文檔都不寫的)

  • Css文件信息處理成樹型結(jié)構(gòu)的Js對(duì)象。
  • 根據(jù)配置插件的順序?qū)湫徒Y(jié)構(gòu)的Js對(duì)象 進(jìn)行操作进胯。
  • 最終將處理后獲得的樹型結(jié)構(gòu)的Js對(duì)象輸出為Css文件用爪。

那么關(guān)鍵點(diǎn)就在與Css被處理后生成的樹型結(jié)構(gòu)的Js對(duì)象,那么先讓我們看一看它的小裙裙里藏著什么胁镐。

PostCss 處理Css詳解
  • 下圖為一個(gè)很標(biāo)準(zhǔn)的Css偎血,有注釋、帶有@的媒體查詢盯漂、以及選擇器樣式颇玷。
    • 上面的Css最終會(huì)處理為下圖結(jié)構(gòu),通過打印信息我們可以發(fā)現(xiàn)樹型結(jié)構(gòu)的Js對(duì)象是一個(gè)名為Root的構(gòu)造函數(shù)就缆,而起樹型結(jié)構(gòu)的nodes節(jié)點(diǎn)下還有Commont帖渠,AtRuleRule構(gòu)造函數(shù)竭宰。
  • 樹型結(jié)構(gòu)的Js對(duì)象在最后會(huì)處理成名為Result的構(gòu)造函數(shù)空郊,如下圖份招,帶有css這個(gè)屬性,包含完整的Css信息狞甚,最終會(huì)被寫入到文件中锁摔。
PostCss 中的各種構(gòu)造函數(shù)

在上面部分關(guān)于 PostCss處理Css中,生成了很多構(gòu)造函數(shù)哼审。而 PostCss的神奇功能也都圍繞著這些構(gòu)造函數(shù)谐腰,接下來我們一一介紹。

  • Root: PostCss處理過的Css涩盾,整個(gè)處理過程基本上都在圍繞著Root十气,CommontAtRule春霍,Rule都是它的子節(jié)點(diǎn)砸西。

  • Commont: Css中的注釋信息,注釋的內(nèi)容在Commont.text下终畅。

    Commont

  • AtRule: 為帶@標(biāo)識(shí)的部分籍胯,name為標(biāo)識(shí)名稱,params為標(biāo)識(shí)參數(shù)离福。nodes為內(nèi)部包含的其他子節(jié)點(diǎn)杖狼,可以是CommontAtRule妖爷,Rule蝶涩,這讓我們可以自定義更多的規(guī)則,

    AtRule

  • Rule: 選擇器樣式部分絮识,一個(gè)選擇器代表一個(gè)Rule绿聘,選擇器對(duì)應(yīng)的樣式列表nodesDeclaration構(gòu)造函數(shù),

    Rule

  • Declaration: 為Css樣式屬性,prop為樣式屬性次舌,value為樣式值熄攘。可給Rule手動(dòng)添加樣式屬性彼念,也可以修改prop,value挪圾。上文提到的Autoprefixer就是通過clone當(dāng)前屬性,修改prop并添加到選擇器下逐沙。

    Declaration

  • Result: 通過root.toResult()方法可以獲取到帶有css全文本信息的Result對(duì)象哲思,也代表這我們 PostCss 單個(gè)插件到了尾聲。接下來直接將result.css寫入對(duì)應(yīng)的文件即可吩案。

如何使用 PostCss 插件

PostCss 插件有很多種使用方式棚赔,

  • 可以配合在postcss-loaderoptions配置各種插件
plugins: [
          themePlugin({}),
          autoprefixer({})
        ]
  • 也可以直接在Node程序中使用
postcss([themePlugin({})])
      .process(css, {from: ``, to: ``})
      .then(result => {
        // 根據(jù)配置文件themeList,分別處理對(duì)應(yīng)的文件,打包各css 文件
      })
      .catch(error => {
        throw new Error(error)
      })
如何編寫一個(gè) PostCss 插件

上文中,我們對(duì)Css處理后生成的Root以及其節(jié)點(diǎn)下的Commont靠益,AtRule丧肴,RuleDeclaration有了基本的認(rèn)識(shí)捆毫,那么我們是如何獲得Root闪湾,又將拿這些構(gòu)造函數(shù)做些什么呢冲甘。

var postcss = require('postcss');

module.exports = postcss.plugin('postcss-test-plugin', function (opts) {
  opts = opts || {};    // 處理 options    
  return function (root, result) {
    //遍歷所有的選擇器
    root.walkRules(function(rule) {
      //遍歷所有的屬性
      rule.walkDecls(function(decl) {
        //dect 是一個(gè)包含屬性-值對(duì)和一些操作方法的樣式對(duì)象绩卤,最重要的兩個(gè)屬性是decl.prop 屬性名和decl.value 屬性值.
        //過濾包含 overflow , overflow-x , overflow-y 的屬性
        rule.walkDecls(/^overflow-?/, function(decl) {
          if (decl.value === 'scroll') {
            //判斷是否已經(jīng)有-webkit-overflow-scrolling,防止重復(fù)添加      
            var hasTouch = rule.some(function(i) {
              return i.prop === '-webkit-overflow-scrolling';
            });
            if (!hasTouch) {
              rule.append({
                prop: '-webkit-overflow-scrolling',
                value: 'touch'
              });
            }
          }
        });

      });
    });
  };
});

通過上述插件代碼的示例江醇,其實(shí)已經(jīng)可以很清楚的知道編寫 PostCss 插件的思路濒憋。

  • 重點(diǎn)對(duì)象是RootCommont陶夜,AtRule凛驮,RuleDeclaration条辟,Result;
  • 遍歷方法黔夭,walkCommontswalkAtRules羽嫡,walkRules本姥,walkDels;
  • 節(jié)點(diǎn)操作(上面的構(gòu)造函數(shù)基本上都有以下類似的操作),append杭棵,clone婚惫,removetoString魂爪。更多操作方法

通過整體梳理先舷,從PostCss 是什么,做什么滓侍。到PostCss 插件的使用蒋川,以及編寫,應(yīng)該對(duì)PostCss 有了整體的認(rèn)識(shí)撩笆。PostCssAPI雖然沒有那么復(fù)雜捺球,但足夠我們做很多事情,讓前端工程化玩法更多浇衬。示例也只是一個(gè)簡(jiǎn)單的插件代碼懒构,還有很多像Autoprefixer一樣優(yōu)秀的插件,我們甚至可以用PostCss 插件像eslint一樣規(guī)范Css編寫耘擂。

  • 注意事項(xiàng):
    • postcss-loader默認(rèn)使用.postcsssrc.js文件的配置胆剧,postcss.config.js.postcsssrc.js同時(shí)存在是會(huì)優(yōu)先使用.postcsssrc.js中的配置
    • 編寫PostCss 插件時(shí),可能會(huì)有很多Node文件操作,請(qǐng)注意同步異步操作的適用情況秩霍,避免使用不當(dāng)篙悯,導(dǎo)致產(chǎn)出的css文件內(nèi)容錯(cuò)誤
    • vue-loader處理.vue文件時(shí),如果<style>標(biāo)簽帶有scoped铃绒,那么在經(jīng)過css-loader > postcss-loader > vue-loader 這一順序處理后鸽照,scoped標(biāo)記會(huì)在postcss-loader使用插件產(chǎn)出的css樣式運(yùn)轉(zhuǎn)到vue-loader處理時(shí)在csshtml標(biāo)簽處添加[data-v-hash碼] ,此時(shí)postcss-loader引用的PostCss 插件如果有導(dǎo)出類的操作颠悬,可能會(huì)導(dǎo)致scoped失效矮燎。并并且沒辦法在vue-loader之后再使用postcss這種思路。只能build的時(shí)候在webpack構(gòu)建鉤子赔癌,在處理完.vue文件后再處理相關(guān)的導(dǎo)出操作诞外,此時(shí)是完整的。(此處還有很多細(xì)節(jié)灾票,具體有問題峡谊,可單獨(dú)私聊。)
    • 新版的vue-loaderapi和老版本的有挺大的差別刊苍,請(qǐng)做好甄別既们。

后續(xù)看情況更新

有用的網(wǎng)址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啥纸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子埠忘,更是在濱河造成了極大的恐慌脾拆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莹妒,死亡現(xiàn)場(chǎng)離奇詭異名船,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旨怠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渠驼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鉴腻,你說我怎么就攤上這事迷扇。” “怎么了爽哎?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蜓席,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我课锌,道長(zhǎng)厨内,這世上最難降的妖魔是什么祈秕? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雏胃,結(jié)果婚禮上请毛,老公的妹妹穿的比我還像新娘。我一直安慰自己瞭亮,他們只是感情好方仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著统翩,像睡著了一般仙蚜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唆缴,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天鳍征,我揣著相機(jī)與錄音黍翎,去河邊找鬼面徽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匣掸,可吹牛的內(nèi)容都是我干的趟紊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼碰酝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霎匈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起送爸,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铛嘱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后袭厂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨吓,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年纹磺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帖烘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橄杨,死狀恐怖秘症,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情式矫,我是刑警寧澤乡摹,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站采转,受9級(jí)特大地震影響聪廉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一锄列、第九天 我趴在偏房一處隱蔽的房頂上張望图云。 院中可真熱鬧,春花似錦邻邮、人聲如沸竣况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丹泉。三九已至,卻和暖如春鸭蛙,著一層夾襖步出監(jiān)牢的瞬間摹恨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工娶视, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晒哄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓肪获,卻偏偏與公主長(zhǎng)得像寝凌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孝赫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容