Извлечение локальных и глобальных стилей с помощью mini-css-extract-plugin

До сих пор я использовал extract-text-webpack-plugin и webpack 3 для создания двух файлов комплекта. Один для локальных стилей и один для глобальных стилей.

Таким образом, в файле глобальных стилей мы извлекаем css из начальной загрузки, семантики... и в локальный пакет стилей мы добавляем наши собственные стили.

Оба этих файла будут содержать хэш-содержимое, поэтому, если, например, я что-то изменю в своих локальных стилях и перестрою приложение, изменится только хэш из локальных стилей, а не из глобальных стилей.

После обновления до webpack 4 необходимо использовать mini-css-extract-plugin вместо extract-text-webpack-plugin.

Это была моя установка до сих пор. Я пробую разные вещи, но я не знаю, как включить эту настройку для mini-css-extract-plugin?

const ExtractTextPlugin = require('extract-text-webpack-plugin')

const ExtractLocal = new ExtractTextPlugin({
  filename: 'stylesheet/stylesLocal.[contenthash].local.css',
  disable: false,
  allChunks: true,
})
const ExtractGlobal = new ExtractTextPlugin({
  filename: 'stylesheet/stylesGlobal.[contenthash].css',
  disable: false,
  allChunks: true,
})


module.exports = {
  module: {
    rules: [
      /* Local styles */
      {
        test: /\.local\.(css|scss)$/,
        use: ExtractLocal.extract({
          use: [
            {
              loader: 'css-loader',
              options: {
                sourceMap: true,
                minimize: true,
                modules: true,
                importLoaders: 1,
                localIdentName: '[local]___[name]__[hash:base64:5]',
              },
            },
           ...
          ],
        }),
      },
      /* Global styles */
      {
        test: /^((?!\.local).)+\.(css)$/,
        use: ExtractGlobal.extract({
          use: [
            {
              loader: 'css-loader',
              options: {
                sourceMap: true,
                minimize: true,
              },
            },
          ],
        }),
      },
    ],
  },
  plugins: [
    ExtractLocal,
    ExtractGlobal,
   ...
  ],
}

1 ответ

Ваш css загрузчики верны.

В плагинах, я вижу, вы хотите реализовать это с помощью мини-CSS для извлечения нескольких CSS-файлов.

Хотя это определенно вариант, мне удалось реализовать его с опцией оптимизации веб-пакета, и только 1 мини-CSS в плагинах.

Конфигурация выхода:

  output: {
    path: appConfig.paths.appBuild,
    filename: 'scripts/[name].[chunkhash:8].js',
    chunkFilename: 'scripts/[name].[chunkhash:8].chunk.js',
    publicPath: publicPath,
  },

Дополнительное правило CSS для стилей только из узловых модулей (я сделал это первым правилом CSS и после него дополнительными правилами):

 {
    test: /\.(css|scss)$/,
    include: /(node_modules)/,
    use: [
      MiniCssExtractPlugin.loader,
      { loader: 'css-loader', options: { sourceMap: true } },
      { loader: 'sass-loader', options: { sourceMap: true } },
    ],
  },

Оптимизация конфигурации: (Это будет также извлекать JS поставщика.)

  optimization: {
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
        },
      },
    },
  },

Конфигурация плагина:

new MiniCssExtractPlugin({
  filename: 'styles/[name].[contenthash].css',
  chunkFilename: 'styles/[name].[contenthash].css',
}),
Другие вопросы по тегам