Webpack 4: mini-css-extract-plugin + sass-loader + splitChunks

У меня есть следующий пример конфигурации для использования плагина mini-css-extract-plugin с Webpack 4:

entry: {
   a: ['./js/a.js', './scss/a.scss'],
   b: ['./js/b.js', './scss/b.scss']
},
module: {
    rules: [
       [...],
       {
        test: /\.(css|sass|scss)$/,
        use: [
            MiniCssExtractPlugin.loader,
            {
                loader: 'css-loader',
                options: {
                    importLoaders: 2,
                    sourceMap: true
                }
            },
            {
                loader: 'postcss-loader',
                options: {
                    plugins: () => [
                        require('autoprefixer')
                    ],
                    sourceMap: true
                }
            },
            {
                loader: 'sass-loader',
                options: {
                    sourceMap: true
                }
            }
        ]
},
optimization: {
    splitChunks: {
        cacheGroups: {
            js: {
                test: /\.js$/,
                name: "commons",
                chunks: "all",
                minChunks: 7,
            },
            css: {
                test: /\.(css|sass|scss)$/,
                name: "commons",
                chunks: "all",
                minChunks: 2,
            }
        }
    }
},
plugins: [
    new MiniCssExtractPlugin({
        filename: "dist/[name].css",
    }),
]

И следующие файлы sass:

// a.scss
@import 'libA.scss';
@import 'libB.css';
[...] 

// b.scss
@import 'libA.scss';
@import 'libB.css';
[...]

Когда я запускаю веб-пакет, libB.css вставляется в комплект commons.css, а libA.scss - нет.

Как правило, каждый импорт файла .css обрабатывается опцией splitChunks (только если в имени указано расширение css), а импорт sass - нет.

У меня есть проект с несколькими точками входа sass и множеством @import компонента sass, и я хотел бы создать общий пакет с общими модулями sass.

Я никогда не работал с mini-css-extract-plugin, но я работал с ExtractTextPlugin для css, и одна вещь, которая может вам помочь, - это собрать загрузчики вместе для обработки вашего css. ExtractTextPlugin.extract (['css-loader', 'sass-loader']) Может быть идеей для решения вашей проблемы.

Italo Borges 21.03.2018 18:27

Я думаю, что mini-css-extract-plug не имеет вызова метода «extract». В документации загрузчик написан на том же массиве, что и в моем примере (MiniCssExtractPlugin.loader, затем css-loader и т. д.)

Andrea Moraglia 22.03.2018 11:10

Я не уверен, что это аналогичная проблема, но этот пост мне очень помог - в основном просто использовал версию @next (остальная часть моей настройки была похожа на вашу) stackoverflow.com/questions/50803260/…

Sia 04.11.2019 23:05
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
25
3
38 214
1

Ответы 1

Я делаю что-то подобное в своей конфигурации Webpack 4.

const MiniCssExtractPlugin = require("mini-css-extract-plugin")

module: {
rules: [ {
    test: /\.scss$/,
    use: [
      MiniCssExtractPlugin.loader,
      {
        loader: "css-loader",
        options: {
          modules: true,
          sourceMap: true,
          importLoader: 2
        }
      },
      "sass-loader"
    ]}
  ]
},

plugins: [
   new MiniCssExtractPlugin({
  // Options similar to the same options in webpackOptions.output
  // both options are optional
  filename: "style.css",
  chunkFilename: "[name].css"
]

Я также даю объект конфигурации output.publicPath, чтобы он указывал на мой каталог сборки, например ->

output: {
   filename: "[name]-min.js",
   path: path.resolve(__dirname, "dist"),
   publicPath: "/static/react/dist/"
},

edit If you are interested in code splitting, Webpack 4 can do this "out of the box" for you. This will split .js and as well .css -files for you in case you use dynamic imports.

optimization: {
  splitChunks: {
    chunks: 'all'
  }
}

Если вы, с другой стороны, хотите объединить только ваш .css в один файл, вы можете добавить его следующим образом.

optimization: {
    splitChunks: {
      chunks: 'all'
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.s?css$/,
          chunks: 'all',
          minChunks: 1,
          reuseExistingChunk: true,
          enforce: true,
        },
      }
    },
}

С этой конфигурацией webpack объединит все css в один, но также сгенерирует styles.js, который необходим для того, чтобы все работало (все связанные js). Есть ли способ избавиться от этого файла?

nass600 03.07.2018 21:25

Обрабатывает ли это @import 'md/variables', где ожидаемый разрешенный файл - ./md/_variables.scss?

Gio Palacino 17.10.2018 20:20

Неправильная схема API. cacheGroups находится внутри splitChunks.

llobet 03.12.2018 18:21

@ nass600 Используйте плагин webpack-fix-style-only-entries webpack, работает нормально.

Jan Peša 11.01.2019 13:20
importLoader должен быть importLoaders и, вероятно, должен быть 1, а не 2 в исходном примере конфигурации
El Yobo 20.06.2019 04:34

@ElYobo, если вы НЕ хотите использовать SASS, 1 - правильное значение, 2 используется с SASS. Кажется, что ключ importLoaders задокументирован, но, похоже, работает в любом случае.

Jimi Pajala 20.06.2019 10:37

0 было бы без загрузчиков, 1 было бы sass ... предположительно, как с опечаткой importLoader, они также обрабатывают слишком много указанных загрузчиков? См. Документированный пример здесь, если есть путаница - github.com/webpack-contrib/css-loader#importloaders

El Yobo 20.06.2019 23:36

Другие вопросы по теме