[插件2] mini-css-extract-plugin

將CSS提取為獨(dú)立的文件的插件刷袍,對每個(gè)包含css的js文件都會(huì)創(chuàng)建一個(gè)CSS文件锻煌,支持按需加載css和sourceMap

只能用在webpack4中妓布,對比另一個(gè)插件 extract-text-webpack-plugin有點(diǎn):

  • 異步加載
  • 不重復(fù)編譯,性能更好
  • 更容易使用
  • 只針對CSS

目前缺失功能宋梧,HMR匣沼。

安裝:

yarn add -D mini-css-extract-plugin

使用:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      // 類似 webpackOptions.output里面的配置 可以忽略
      filename: '[name].css',
      chunkFilename: '[id].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 這里可以指定一個(gè) publicPath
              // 默認(rèn)使用 webpackOptions.output中的publicPath
              publicPath: '../'
            },
          },
          'css-loader',
        ],
      }
    ]
  }
}

高級(jí)配置示例:

這個(gè)插件應(yīng)該只用在 production 配置中,并且在loaders鏈中不使用 style-loader, 特別是在開發(fā)中使用HMR捂龄,因?yàn)檫@個(gè)插件暫時(shí)不支持HMR

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const devMode = process.env.NODE_ENV !== 'production';

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: devMode ? '[name].css' : '[name].[hash].css',
      chunkFilename: devMode ? '[id].css' : '[id].[hash].css',
    })
  ],
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: [
          devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader',
          'sass-loader',
        ],
      }
    ]
  }
}

production 階段進(jìn)行壓縮

webpack5可能會(huì)內(nèi)置CSS 壓縮器释涛,webpack4需要自己使用壓縮器,可以使用 optimize-css-assets-webpack-plugin 插件倦沧。 設(shè)置 optimization.minimizer 覆蓋webpack默認(rèn)提供的唇撬,確保也指定一個(gè)JS壓縮器

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        cache: true,
        parallel: true,
        sourcMap: true
      }),
      new OptimizeCSSAssetsPlugin({}),
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader'
        ]
      }
    ]
  }
}

將所有的CSS提取到一個(gè)文件中

和 extract-text-webpack-plugin 類似,可以使用 optimization.splitChunks.cacheGroups 將css提取到一個(gè)CSS中

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader'
        ]
      }
    ]
  }
}

根據(jù)entry提取CSS

可以根據(jù)webpack 的entry name來提取CSS展融,這對你動(dòng)態(tài)引入路由窖认,卻想依據(jù)entry保存打包的CSS的情況十分有用。這也解決了ExtractTextPlugin中CSS重復(fù)的問題

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

function recursiveIssuer(m) {
  if (m.issuer) {
    return recursiveIssuer(m.issuer);
  } else if (m.name) {
    return m.name;
  } else {
    return false;
  }
}

module.exports = {
  entry: {
    foo: path.resolve(__dirname, 'src/foo'),
    bar: path.resolve(__dirname, 'src/bar')
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        fooStyles: {
          name: 'foo',
          test: (m,c,entry = 'foo') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true
        },
        barStyles: {
          name: 'bar',
          test: (m,c,entry = 'bar') => m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
          chunks: 'all',
          enforce: true
        }
      }
    }
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
    })
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader"
        ]
      }
    ]
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末告希,一起剝皮案震驚了整個(gè)濱河市扑浸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燕偶,老刑警劉巖喝噪,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異指么,居然都是意外死亡酝惧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門伯诬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晚唇,“玉大人,你說我怎么就攤上這事姑廉∪绷粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萌踱。 經(jīng)常有香客問我葵礼,道長,這世上最難降的妖魔是什么并鸵? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任鸳粉,我火速辦了婚禮,結(jié)果婚禮上园担,老公的妹妹穿的比我還像新娘届谈。我一直安慰自己,他們只是感情好弯汰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布艰山。 她就那樣靜靜地躺著,像睡著了一般咏闪。 火紅的嫁衣襯著肌膚如雪曙搬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天鸽嫂,我揣著相機(jī)與錄音纵装,去河邊找鬼。 笑死据某,一個(gè)胖子當(dāng)著我的面吹牛橡娄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癣籽,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挽唉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了才避?” 一聲冷哼從身側(cè)響起橱夭,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桑逝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俏让,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楞遏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了首昔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寡喝。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勒奇,靈堂內(nèi)的尸體忽然破棺而出预鬓,到底是詐尸還是另有隱情,我是刑警寧澤赊颠,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布格二,位于F島的核電站劈彪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏顶猜。R本人自食惡果不足惜沧奴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望长窄。 院中可真熱鬧滔吠,春花似錦、人聲如沸挠日。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚣潜。三九已至矗愧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郑原,已是汗流浹背唉韭。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犯犁,地道東北人属愤。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像酸役,于是被迫代替她去往敵國和親住诸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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