一起使用mini-css-extract-plugin和style-loader

时间:2019-04-14 17:42:36

标签: webpack mini-css-extract-plugin

我是该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
    }
};

3 个答案:

答案 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