Webpack 无法构建,因为 CssSyntaxError

Nai*_*iru 13 javascript css webpack css-loader

我正在尝试运行构建的 webpack-dev-server,但每次都失败并出现以下错误:

ERROR in ./src/style.css (./node_modules/css-loader/dist/cjs.js!./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js!./src/style.css)
Module build failed (from ./node_modules/css-loader/dist/cjs.js):
CssSyntaxError

(1:1) Unknown word

> 1 | var api = require("!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
    | ^
  2 |             var content = require("!!../node_modules/css-loader/dist/cjs.js!./style.css");
  3 | 
Run Code Online (Sandbox Code Playgroud)

我的 webpack.dev.js 看起来像这样:

const path = require('path');
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
    entry: './src/index.js',
    mode: 'development',
    devtool: 'inline-source-map',
    optimization: {
        usedExports: true,
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'),
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                ],
            },
            {
                test: /\.(png|svg|jpg|gif)$/,
                use: [
                    'file-loader',
                ],
            },
            {
                test: /\.m?js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
        ],
    },
});
Run Code Online (Sandbox Code Playgroud)

在我的 index.js 中使用它时出现错误:

import './style.css';
Run Code Online (Sandbox Code Playgroud)

许多解决方案都建议了 style-loader 和 css-loader 的顺序,但据我所知,它的顺序是正确的。我究竟做错了什么?

小智 2

当我尝试同时使用 thestyle-loader和 the时,我遇到了同样的错误MiniCssExtractPlugin。你的例子使用了 webpack merge,所以我假设你也有一个带有额外 CSS 规则的 webpack.common.js ?

就我而言,解决的方法如下:

我的 webpack.dev.config.js 中有以下规则:

module: {
    rules: [
      {
        test: /\.(sass|scss)$/,
        use: [
          "style-loader",
          "css-loader",
          "postcss-loader",
          {
            loader: "sass-loader",
            options: {
              // Prefer `dart-sass`
              implementation: require("sass"),
            },
          },
        ],
      },
    ],
  },
Run Code Online (Sandbox Code Playgroud)

我的 webpack.prod.config.js 中的以下内容:

module: {
    rules: [
      {
        test: /\.(sass|scss)$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader",
          "postcss-loader",
          {
            loader: "sass-loader",
            options: {
              // Prefer `dart-sass`
              implementation: require("sass"),
            },
          },
        ],
      },
    ],
  },
Run Code Online (Sandbox Code Playgroud)

您还可以使用三元运算符来检查是否mode === 'production'并将其保留在一个文件中,但我更喜欢有两个单独的文件,以使其更具可读性,以防 webpack 配置变得太大。

我还尝试将css-loader,postcss-loader和移动sass-loader到同一个 webpack.common.js 文件,但由于某种原因它不起作用。

不确定这是否可能是导致您错误的原因,但它在我的用例中修复了它,所以现在我使用开发环境的样式加载器和用于编译生产的插件。

这适用于 webpack 5 和 Node 16