Я знаю, что этот вопрос уже немного устарел, но я сам потратил несколько дней, пытаясь решить это. По общему признанию, я не знаю слишком много о webpack на этом этапе, так что это заняло больше времени, чем следовало бы.
То, что я в итоге сделал, это то, что указано здесь
https://github.com/webpack-contrib/mini-css-extract-plugin#extracting-css-based-on-entry
Как я реализовал это, чтобы создать json-файл конфигурации, содержащий список файлов scss, которые необходимо использовать
{
"file1": {
"scss": "file1",
},
"file2": {
"scss": "file2",
},
}
(есть причины, по которым моя конкретная установка не использует массив здесь)
Тогда в моем файле webpack.config
есть следующее
const themeConfig = require('./src/config/themes.json');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const _ = require('lodash');
Затем я перебираю конфиг, чтобы создать конфиг разделенных чанков, специфичный для тем
// specify the theme split chunk config
let themeChunks = {};
let themeFiles = [];
for (let i in themeConfig) {
const theme = themeConfig[i];
themeChunks[_.camelCase(`theme_${i}`)] = {
name: `theme-${theme.css}`,
test: new RegExp(`src\/resources\/styles\/themes\/${theme.css}.scss$`),
chunks: 'all',
enforce: true,
};
themeFiles.push(`./src/resources/styles/themes/${theme.css}.scss`);
}
Примечание: тестовая строка должна быть путем к вашим файлам scss
Тогда моя запись выглядит так
entry: {
app: ['./src/app.js'],
themes: themeFiles
},
Мои разделенные куски выглядят так
splitChunks: {
hidePathInfo: true,
chunks: "initial",
maxSize: 200000,
cacheGroups: {
default: false,
// add the theme config
...themeChunks,
}
}
И наконец мои правила
{
test: /\.scss$/,
use: [
{ loader: MiniCssExtractPlugin.loader, },
{ loader: 'css-loader' },
{ loader: 'sass-loader' }
],
},
Это основано на примере из dwatts3624
https://github.com/webpack-contrib/mini-css-extract-plugin/issues/45#issuecomment-425645975
Надеюсь, это поможет любому, кто сталкивается с этим