【问题标题】:Webpack not building because CssSyntaxErrorWebpack 未构建,因为 CssSyntaxError
【发布时间】:2020-12-26 21:12:13
【问题描述】:

我正在尝试运行构建的 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 | 

我的 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']
                    }
                }
            },
        ],
    },
});

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

import './style.css';

许多解决方案建议样式加载器和 css-loader 的顺序,但据我所知,它的顺序正确。我做错了什么?

【问题讨论】:

  • 这是 var api = require 在 css 文件中的东西吗?
  • 不,它不在我的 CSS 中。我检查了所有内容,我认为这是在node_module中使用var而不是let,但是我找不到行
  • 看起来,有一条规则重复。你需要找到一种只做一次的方法。
  • style-loader 动态生成该规则,这就是您找不到它的原因。那么unknown word 部分是因为其他一些加载器甚至样式加载器正在阅读自己的内容。有时这可以通过不同的节点或 webpack 版本或加载程序的顺序来解决。这可能会发生 很多 不同的原因..
  • 你能分享更多细节吗?在您的项目中包含您的 style.csspackage.json 或其他有用的文件。我试图根据给定的详细信息重现此错误,但无法这样做。如果您收到CssSyntaxError,那么我怀疑它显示的行在您的 style.css 文件中(看起来像 JavaScript,根本不应该存在)。

标签: javascript css webpack css-loader


【解决方案1】:

我在尝试同时使用style-loaderMiniCssExtractPlugin 时遇到了同样的错误。您的示例使用了 webpack 合并,所以我假设您在某个地方也有一个带有附加 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"),
            },
          },
        ],
      },
    ],
  },

我的 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"),
            },
          },
        ],
      },
    ],
  },

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

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

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

这适用于 webpack 5 和节点 16

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2020-01-16
    • 2019-08-06
    • 2019-10-04
    • 2021-08-28
    • 2016-04-09
    • 2017-10-04
    • 2018-01-14
    • 2021-03-05
    相关资源
    最近更新 更多