webpack處理文件內(nèi)容——編寫postcss8.0插件

此篇為webpack處理文件內(nèi)容——babel插件保姆級教學(xué)姐妹篇

前言

本文旨在編寫出postcss8.0插件眶诈,將css中的http:替換成https:亮元。

AST

把代碼轉(zhuǎn)成AST:https://astexplorer.net/#/2uBU1BLuJ1

  • 代碼
.hello {
    color: green;
    font-size: 64px;
    background:url(http://xxxxxxx) no-repeat fixed;
    background-size: 100% auto;
}
  • AST


    background

    我們要分析的這個backaground節(jié)點的type為decl。

  • AST節(jié)點類型
    實際上PostCSS將CSS解析為節(jié)點樹之后扁位,節(jié)點有5種type

Root:樹頂部的節(jié)點鸣奔,代表CSS文件虱痕。
AtRule:語句以@like@charset "UTF-8"@media (screen) {}。開頭
Rule:內(nèi)部帶有聲明的選擇器钝尸。例如input, button {}括享。
Declaration:鍵值對,例如color: black珍促;
Comment:獨立評論铃辖。選擇器中的注釋,規(guī)則參數(shù)和值存儲在節(jié)點的raws屬性中猪叙。

————
為什么要更新postcss呢娇斩?
postcss 8.0有好多很棒的改進,詳細(xì)的看PostCSS 8.0:Plugin migration guide穴翩。

比如之前運行插件犬第,即使只改了一點點,它也會遍歷CSS包的整個抽象語法樹芒帕,如果有很多個PostCSS插件就會遍歷很多次歉嗓,速度慢。

所以這次的大版本還是十分值得更新的背蟆。
————

配置

我的插件叫postcss-tran-http-plugin鉴分,這個postcss-是那個官方文檔強調(diào)的命名方式。

  • 特別地
    現(xiàn)在postcss 8.0改變了寫插件的方式带膀,如果之前項目有裝過postcss冠场,可以卸了裝個新的。
npm uninstall postcss
npm install postcss --save-dev
  • webpack.config.js
    use的執(zhí)行順序是右到左
module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader', 'postcss-loader'],
            },
        ]
}
  • package.json
{
  "peerDependencies": {
    "postcss": "^8.0.0"
  }
}

peerDependencies是為了cover這個場景:
有人要用我寫的postcss插件本砰,需要安裝postcss碴裙。用這個方法去指定我所要求的那個postcss版本,以避免版本不匹配可能造成的bug。

  • postcss.config.js
    之前這個plugins是個對象舔株,打包出錯特地翻了一下文檔才發(fā)現(xiàn)變成數(shù)組了莺琳。
module.exports = {
    plugins: [
          require('./plugins/postcss-tran-http-plugin.js')
    ]
}

插件編寫

module.exports = (opts) => {
    return {
        postcssPlugin: 'postcss-tran-http-plugin',
        Declaration(decl) {
            console.log('Declaration');
            let oldVal = decl.value;
            if (oldVal.match(/http:\/\/([\w.]+\/?)\S*/)) {
                let newVal = oldVal.replace(/http:\/\//g, 'https://');
                decl.value = newVal;
            }
        },
    };
};
module.exports.postcss = true;
  • 簡單說一下
    跟babel插件一樣,針對不同的type類型有不同的處理函數(shù)载慈。
    上面我們說到這個節(jié)點類型為Declaration惭等,也就是鍵值對。
    讀值用decl.value办铡,然后給他直接賦值成新的值就ok了辞做。

結(jié)果

  • 代碼
// style.css 
body {
    background: darkcyan;
}
.hello {
    color: green;
    font-size: 64px;
    background:url(http://xxxxxxx) no-repeat fixed;
    background-size: 100% auto;
}
  • 打包后


寫postcss插件其實還好,節(jié)點類型不多寡具,修改也簡單秤茅。
值得關(guān)注的就是升級到8.0之后postcss.config.js、插件編寫童叠、依賴庫的引用都有變動框喳。

參考:
今天!從零開始調(diào)試webpack PostCSS插件
Writing a PostCSS Plugin
http://echizen.github.io/tech/2017/10-29-develop-postcss-plugin
https://www.cnblogs.com/wonyun/p/9692476.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厦坛,一起剝皮案震驚了整個濱河市五垮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杜秸,老刑警劉巖放仗,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撬碟,居然都是意外死亡匙监,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門小作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亭姥,“玉大人,你說我怎么就攤上這事顾稀〈锫蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵静秆,是天一觀的道長粮揉。 經(jīng)常有香客問我,道長抚笔,這世上最難降的妖魔是什么扶认? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮殊橙,結(jié)果婚禮上辐宾,老公的妹妹穿的比我還像新娘狱从。我一直安慰自己,他們只是感情好叠纹,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布季研。 她就那樣靜靜地躺著,像睡著了一般誉察。 火紅的嫁衣襯著肌膚如雪与涡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天持偏,我揣著相機與錄音驼卖,去河邊找鬼。 笑死鸿秆,一個胖子當(dāng)著我的面吹牛酌畜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谬莹,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桩了!你這毒婦竟也來了附帽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤井誉,失蹤者是張志新(化名)和其女友劉穎蕉扮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颗圣,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡喳钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了在岂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奔则。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔽午,靈堂內(nèi)的尸體忽然破棺而出易茬,到底是詐尸還是另有隱情,我是刑警寧澤及老,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布抽莱,位于F島的核電站,受9級特大地震影響骄恶,放射性物質(zhì)發(fā)生泄漏食铐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一僧鲁、第九天 我趴在偏房一處隱蔽的房頂上張望虐呻。 院中可真熱鬧象泵,春花似錦、人聲如沸铃慷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犁柜。三九已至洲鸠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馋缅,已是汗流浹背扒腕。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萤悴,地道東北人瘾腰。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像覆履,于是被迫代替她去往敵國和親蹋盆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355