在我看来,实现这一目标有两种选择。
1)使用分割块
optimization: {
splitChunks: {
cacheGroups: {
adminLteStyles: {
name: 'admin-lte',
test: /admin-lte\.main\.scss$/,
chunks: 'all',
enforce: true
},
coreUiStyles: {
name: 'coreui',
test: /coreui\.main\.scss$/,
chunks: 'all',
enforce: true
},
// ... more
}
}
},
但正如您所看到的,这需要为您拥有的每个css文件编写一个regex块。。。当然你可以创建一个函数来处理。。。
function perTheme() {
// this function will create Objects that can splitChunks
// testing if the file is located under a specific theme directory
return glob.sync("./src/themes/*/")
.reduce((obj, theme) => {
const niceName = path.basename(theme)
obj[niceName] = {
test: new RegExp(theme + "(.*).main.scss"),
name: niceName,
chunks: 'all',
enforce: true
}
return obj;
}, {})
}
function perName() {
// this function will create Objects that can splitChunks
// testing each file in its own location
return glob.sync("./src/themes/*/scss/*.main.scss")
.reduce((obj, filename) => {
const niceName = path.basename(filename)
obj[niceName] = {
test: new RegExp(filename),
name: niceName,
chunks: 'all',
enforce: true
}
return obj;
}, {})
}
// in your webpack config ...
optimization: {
splitChunks: {
cacheGroups: perTheme()
// this will create one css file per theme
// admin-lte theme etc..
}
}
// OR
optimization: {
splitChunks: {
cacheGroups: perName()
// this will create one css file per scss you have
}
}
我知道这可能很难配置,但请记住,使用此方法分割块非常强大。有很多方法可以用这种方法分割文件。如果你觉得这是太多了,检查第二个选项!
2)使用提取加载器
module: {
rules: [{
test: /\.scss$/,
use: [{
loader: 'file-loader',
options: {
name: "[name]-dist.[ext]",
},
},
'extract-loader',
"css-loader",
"sass-loader"
]
}]
}
所以,不用
MiniCssExtractPlugin
您可以简单地使用上面的配置。有了这个,每个人
scss
文件将转换为
css
,将解析每个导入,然后
extract-loader
你会得到生的
css
以字符串格式。之后
file-loader
将输出包含此原始文件的文件
css
. 所以你最终会
scss系统
正在转换为每个
css
平等。但正如你所看到的,这个简单的方法比第一种方法提供的分割块的方法要少得多!