首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用mini-css-extract-plugin和style-loader

同时使用mini-css-extract-plugin和style-loader
EN

Stack Overflow用户
提问于 2019-04-15 01:42:36
回答 3查看 11.2K关注 0票数 9

我刚接触过关于webpack的事情,并且遵循一些教程来学习基础知识。

我想在开发期间使用style-loader注入样式表(启用了HMR ),并希望使用MiniCssExtractPlugin进行生产构建。但是当我使用MiniCssExtractPlugin插件时,我失去了样式加载器的注入特性。

请看我的webpack配置:

代码语言:javascript
复制
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
    }
};
EN

回答 3

Stack Overflow用户

发布于 2019-11-04 19:13:11

webpack.config.js中分配给module.exports的函数的第二个参数包含模式标志(--mode [development|production])。因此,在这里您可以使用模式来加载MiniCssExtractPlugin.loaderstyle-loader

在开发时,使用style-loader比每次提取样式更快。但在生产中,当样式在HTML之后加载时,您应该将样式提取到单独的文件中,以避免在web中出现加载故障,而您看到的页面暂时没有样式。

代码语言:javascript
复制
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'
        ],
      },
    ],
  },
});
票数 6
EN

Stack Overflow用户

发布于 2019-09-08 08:57:50

如果你想为一个开发环境使用一个特定的加载器,另一个用于生产环境,那么我建议你使用webpack-merge,它将允许你基于env.mode变量编写两个独立的webpack配置文件,下面是一个例子:

这是我的主webpack配置文件:

代码语言:javascript
复制
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的配置:

代码语言:javascript
复制
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
   module.exports = () => ({
        module: {
        rules: [
            {
                test: /\.(sass|scss)$/,
                use: [
                    "style-loader",
                    "css-loader",
                    "sass-loader"
                ]
            }
        ]
    }
   });

接下来是您的Dev配置文件

代码语言:javascript
复制
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
         }
       });

现在您需要做的就是运行该命令

代码语言:javascript
复制
webpack --env.mode=production

代码语言:javascript
复制
webpack --env.mode=development
票数 3
EN

Stack Overflow用户

发布于 2019-04-23 07:34:04

MiniCssExtractPlugin says实际上你不能这样做:

这个插件应该只在产品版本中使用,在加载器链中没有样式加载器,特别是如果你想在开发中使用HMR。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55678211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档