在webpack項(xiàng)目中配置postcss,實(shí)現(xiàn)autoprefix

需求

1希望能夠讓開(kāi)發(fā)者寫(xiě)代碼更輕松

以往沒(méi)有引入postcss autoprefixer之前,我們?yōu)榱薱ss相關(guān)特性能夠在各個(gè)瀏覽器上的兼容,引入了scss,利用它的mixins來(lái)實(shí)現(xiàn)prefix。但是每一個(gè)mixin 都有一個(gè)自己的語(yǔ)法。

比如以往,如果我們我們想要寫(xiě)一條

div {
    display: flex;
    align-items: center;
    justify-content: center;
}

為了各個(gè)相對(duì)早期瀏覽器的prefix,我們需要mixin,然后這樣寫(xiě)

import 'common/flexbox';

div {
    @include flexbox;
    @flex(1);
    @justify-content(center);
}

然后按照這樣的約定,來(lái)加上需要的prefix。

這當(dāng)然是一個(gè)方法,但是對(duì)于開(kāi)發(fā)者來(lái)講,實(shí)際上增加了一些學(xué)習(xí)成本,而且相當(dāng)于將標(biāo)準(zhǔn)放到了一邊,去使用另外一套標(biāo)準(zhǔn)。

我們之前的mixin,由于已經(jīng)有好幾年的歷史。當(dāng)時(shí)為了兼容市面上那些還有很大市場(chǎng)份額的瀏覽器,prefix寫(xiě)的很全。比如下面這個(gè)mixin flexbox到代碼:

@mixin flexbox {
    display: -webkit-box;
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flexbox;
    display: flex;
}

為了寫(xiě)這篇博客,我又確認(rèn)了一下,那個(gè)mixin flexbox的開(kāi)源庫(kù)來(lái)自于2013年,距離現(xiàn)在已經(jīng)五年了,五年的時(shí)間,淘汰了很多過(guò)時(shí)的瀏覽器,五年前可能需要兼容到ie8,現(xiàn)在移動(dòng)端開(kāi)發(fā)甚至完全可以無(wú)需理睬IE的存在,所以這樣的一套prefix就顯得有些過(guò)時(shí)了。那位說(shuō)了,我更新我的mixin不就好了,比如在2018年做移動(dòng)端開(kāi)發(fā),也許我只需要將上面的代碼改寫(xiě)成:

@mixin flexbox {
    display: -webkit-flex;
    display: flex;
}

但是我們也許需要想地更遠(yuǎn)一些,也許再過(guò)兩年,我們甚至不需要對(duì)-webkit-的支持了。那時(shí)候,難道我們又要改一遍這個(gè)mixin嗎?

postcss解決了這樣一個(gè)痛點(diǎn),可以直接書(shū)寫(xiě)標(biāo)準(zhǔn)的css(現(xiàn)在是css3,但是過(guò)幾年也可能就是css4了),我們有了這樣的工具,再指定一個(gè)瀏覽器兼容表,就能夠?qū)崿F(xiàn)自動(dòng)prefix,而這相比于sass/scss mixin的方式,維護(hù)起來(lái)更加簡(jiǎn)單,應(yīng)該是一個(gè)很好的實(shí)踐。

2對(duì)用戶更友好

這當(dāng)然也是顯而易見(jiàn)的,以前我們可能為了兼容更多瀏覽器,而寫(xiě)更多的prefix,可是隨著時(shí)間的推移,很多prefix完全并不需要。我們通過(guò)postcss來(lái)處理,簡(jiǎn)單明了,縮小了生成的css文件的體積,最后反映到用戶那里,會(huì)快上一丟丟!

步驟

1 安裝postcss-loader ,postcss-preset-env

yarn add -D postcss-loader  postcss-preset-env

安裝postcss-preset-env,無(wú)需再安裝autoprefixer,由于postcss-preset-env已經(jīng)內(nèi)置了相關(guān)功能。

2 添加.browserlistrc 文件到項(xiàng)目根目錄

1% in CN
android >= 4.4
ios >= 8
not ie <= 11

這個(gè)需要根據(jù)項(xiàng)目的世紀(jì)情況來(lái)自由選擇,我是考慮我們的項(xiàng)目是移動(dòng)端項(xiàng)目,且確實(shí)有用戶在用Android4.4 或者ios8,但是再很難看到低于這些版本之下的系統(tǒng)了。

3配置postcss.config.js

module.exports = {
  loader: 'postcss-loader',  
  plugins: {
      'postcss-preset-env': {},
    }
}

4 配置webpack.config.js

{
test: /\.scss$/,
use:[ 
    MiniCssExtractPlugin.loader,
    {
        loader: 'css-loader',
            options: {
                root: 'static',
                minimize: true,
                importLoaders: 1
            }
    },
    'postcss-loader',
    'sass-loader',
]
},
{
test: /\.css$/,
use: [
    MiniCssExtractPlugin.loader,
    {
        loader: 'css-loader',
            options: {
                root: 'static',
                minimize: true,
                importLoaders: 1
            }
    },
    'postcss-loader'
]
}

由于我們的項(xiàng)目中使用了scss,因此需要sass-loader。這里需要注意各個(gè)loader的順序,一開(kāi)始我的順序是MiniCssExtractPlugin.loader,css-loader,sass-loader, postcss-loader,結(jié)果發(fā)現(xiàn)并沒(méi)有能夠autoprefix,原因是如果想讓postcss-loader認(rèn)識(shí)并且處理,需要先用sass-loader進(jìn)行處理,轉(zhuǎn)化成postcss-loader可以認(rèn)識(shí)的代碼。

另外需要注意的是,我們這里還在使用css-loader v0.28,目前已經(jīng)有了v1.0,版本改動(dòng)很大,以至于我們暫時(shí)不能升級(jí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容