我刚接触过关于webpack的事情,并且遵循一些教程来学习基础知识。
我想在开发期间使用style-loader注入样式表(启用了HMR ),并希望使用MiniCssExtractPlugin进行生产构建。但是当我使用MiniCssExtractPlugin插件时,我失去了样式加载器的注入特性。
请看我的webpack配置:
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path');
module.exports = {
entry: ['./src/index.js'],
output: {
filename: 'app.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
},
{
test: /\.(sass|scss)$/,
use: [
"style-loader",
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: process.env.NODE_ENV === 'development'
}
},
"css-loader",
"sass-loader"
]
}
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
})
],
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true,
hot: true,
port: 3000
}
};发布于 2019-11-04 19:13:11
在webpack.config.js中分配给module.exports的函数的第二个参数包含模式标志(--mode [development|production])。因此,在这里您可以使用模式来加载MiniCssExtractPlugin.loader或style-loader。
在开发时,使用style-loader比每次提取样式更快。但在生产中,当样式在HTML之后加载时,您应该将样式提取到单独的文件中,以避免在web中出现加载故障,而您看到的页面暂时没有样式。
module.exports = (_, { mode }) => ({
// other options here
module: {
rules: [
// other rules here
{
test: /\.s?css$/i,
use: [
mode === 'production'
? MiniCssExtractPlugin.loader
: 'style-loader',
'css-loader',
'sass-loader'
],
},
],
},
});发布于 2019-09-08 08:57:50
如果你想为一个开发环境使用一个特定的加载器,另一个用于生产环境,那么我建议你使用webpack-merge,它将允许你基于env.mode变量编写两个独立的webpack配置文件,下面是一个例子:
这是我的主webpack配置文件:
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const webpackMerge = require("webpack-merge");
const path = require("path");
const modeConfig = env => require(`./build-utils/webpack.${env}`)(env);
module.exports = ({ mode } = { mode: "production" }) =>
webpackMerge(
{
mode,
entry: ['./src/index.js'],
output: {
filename: 'app.js',
path: path.resolve(__dirname, "dist")
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css'
})
]
},
modeConfig(mode)
);正如您在第6行中看到的,我声明了一个modeConfig变量,该变量是一个基于通过cli命令传递的env varriable返回Require值的函数。
现在在build-utils文件夹下创建你的webpack.production.js,这个文件夹将只包含生产evn的配置:
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = () => ({
module: {
rules: [
{
test: /\.(sass|scss)$/,
use: [
"style-loader",
"css-loader",
"sass-loader"
]
}
]
}
});接下来是您的Dev配置文件
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = () => ({
module: {
rules: [
{
test: /\.(sass|scss)$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: true // since u know this is dev env
}
},
"css-loader",
"sass-loader"
]
}
]
},
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true,
hot: true,
port: 3000
}
});现在您需要做的就是运行该命令
webpack --env.mode=production或
webpack --env.mode=development发布于 2019-04-23 07:34:04
MiniCssExtractPlugin says实际上你不能这样做:
这个插件应该只在产品版本中使用,在加载器链中没有样式加载器,特别是如果你想在开发中使用HMR。
https://stackoverflow.com/questions/55678211
复制相似问题