我是该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
}
};
答案 0 :(得分:2)
如果您想在一个开发环境中使用特定的加载器,而在生产环境中使用另一个加载器,那么我建议您使用webpack-merge,这将允许您基于env.mode varriable编写两个单独的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"
]
}
]
}
});
接下来是您的开发配置文件
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
答案 1 :(得分:0)
MiniCssExtractPlugin says实际上您不能这样做:
此插件应仅在装载程序链中没有样式装载器的生产版本上使用,尤其是如果您要在开发中使用HMR。
答案 2 :(得分:0)
initialValues