mini-css-extract-plugin

mini-css-extract-pluginwebpack4中代替extract-text-webpack-plugin,此插件是將 CSS 樣式提取到單獨的文件中。 它為每個包含 CSS 的 JS 文件創(chuàng)建一個 CSS 文件。即通過 JS 文件中import進來的樣式文件。它支持CSSSourceMaps的按需加載。

是建立在新的webpack v4功能(模塊類型)之上,并且需要在webpack 4版本才能工作。

相比extract-text-webpack-plugin

  • 異步加載
  • 沒有重復的編譯(性能)
  • 更容易使用
  • 特定于CSS

基本配置如下(webpack.config.js):

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename:  '[name].css',
      chunkFilename: '[id].css'
    }),
  ],
  module: {
    rules: [
      {
          test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 公共路徑
              // 默認情況下,使用的是webpackOptions.output中publicPath
              publicPath: '../',
              //開發(fā)環(huán)境配置熱更新
              hmr: process.env.NODE_ENV === 'development',
            },
          },
          'css-loader',
      }
    ]
  }
}

高級配置如下(既可以在開發(fā)中使用 HMR,也可以在生成版本的文件中提取樣式):

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

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: devMode ? '[name].js' : '[name].[hash].css',
      chunkFilename: devMode ? '[id].css' : '[name].[hash].css',
    });
  ],
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              hmr: process.env.NODE_ENV === ‘development’
            }
          },
          'css-loader',
          'postcss-loader',
          'sass-loader'
        ]
      }
    ]
  }
}

生產(chǎn)環(huán)境優(yōu)化壓縮(production)
縮小輸出,要使用像optimize-css-assets-webpack-plugin這樣的插件。 設置optimization.minimizer會覆蓋 webpack 提供的默認值,因此確保要指定JS minimalizer

//webpack.config.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({
      include: /\/src/,
      exclude: /\/excludes/,
      cache: true,
      sourceMap: true,
      parallel: true,//多進程并行運行
      comments: false, //禁止構建注釋
    }), new OptimizeCSSAssetsPlugin({})],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader'],
      },
    ],
  },
};

將所有 CSS 樣式提取到單個文件中,與extract-text-webpack-plugin類似,可以使用optimization.splitChunks.cacheGroups。

//webpack.config.js
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ù) webpack 的 entry name 來提取CSS,這對你動態(tài)引入路由,卻想依據(jù) entry 保存打包的 CSS 的情況十分有用。這也解決了 ExtractTextPlugin 中 CSS 重復的問題。

//webpack.config.js
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'],
      },
    ],
  },
};

特別注意

For long term caching use filename: "[contenthash].css". Optionally add [name].
需要使用長緩存的,命名要使用 contenthash,如果直接使用 hash 的話,在 js 有改動,樣式?jīng)]有變動的情況下,css 會被重新打包生成新的 hash 值,這顯然不是我們想要的,所以這里生產(chǎn)環(huán)境用 contenthash,確保 css 文件在沒有改動的情況下,使用緩存文件。
參考:
https://www.npmjs.com/package/mini-css-extract-plugin

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

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

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