You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webpack CSS Loader报错:SCSS变量处‘Unknown word’问题解决

问题

执行npm build时出现SCSS语法解析错误,错误信息如下:

asset main.js 901 KiB [emitted] (name: main) 1 related asset
asset icon.png 795 bytes [compared for emit] [from: src/styles/icon.png] (auxiliary name: main)
orphan modules 51.1 KiB (javascript) 975 bytes (runtime) [orphan] 17 modules
runtime modules 2.15 KiB 7 modules
javascript modules 710 KiB
  modules by path ./ 452 KiB
    modules by path ./src/ 449 KiB 54 modules
    ./index.js 3.26 KiB [built] [code generated]
    ./index.scss 39 bytes [built] [code generated] [1 error]
  modules by path ../ 258 KiB
    modules by path ../../common/temp/node_modules/.pnpm/@babel+runtime@7.22.11/node_modules/@...(truncated) 22.4 KiB 31 modules
    modules by path ../cursor-effects/ 13.2 KiB 5 modules
    modules by path ../../backend/ 155 KiB
      ../../backend/common/dist/main.js 134 KiB [built] [code generated]
      ../../backend/event-emitter/dist/main.js 20.9 KiB [built] [code generated]
    + 7 modules
./src/styles/icon.png 42 bytes (javascript) 795 bytes (asset) [built] [code generated]

ERROR in ./src/styles/_iconview.scss (../../common/temp/node_modules/.pnpm/css-loader@6.8.1_webpack-cli@5.1.4/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./src/styles/_iconview.scss)  
Module build failed (from ../../common/temp/node_modules/.pnpm/css-loader@6.8.1_webpack-cli@5.1.4/node_modules/css-loader/dist/cjs.js):

SyntaxError

(95:7) client\src\styles\_iconview.scss Unknown word

  93 |                  overflow: visible;
  94 |
> 95 |                  #{ $self }__icon {
     |                     ^
  96 |                          background-color: rgb(0 0 200 / 90%);
  97 |                  }
 @ ./index.scss.webpack[javascript/auto]!=!../../common/temp/node_modules/.pnpm/css-loader@6.8.1_webpack-cli@5.1.4/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!../../common/temp/node_modules/.pnpm/sass-loader@13.3.2_sass@1.66.1_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./index.scss 11:0-214 20:26-59
 @ ./index.scss
 @ ./index.js 32:0-22

项目Webpack配置如下:

const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

const mode = process.env.NODE_ENV || "development";
const minimize = mode === "production";
const plugins = [];

if (mode === "production") {
    plugins.push(new CssMinimizerPlugin());
}

module.exports = {
    mode,
    devtool: "source-map",
    entry: [path.resolve(__dirname, "index.js")],
    output: {
        library: "MyClientName",
        libraryTarget: "umd",
        umdNamedDefine: true,
        sourceMapFilename: "[file].map",
        filename: "[name].js",
    },
    optimization: {
        minimize,
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css",
        }),
        ...plugins,
    ],
    module: {
        rules: [
            {
                test: /\.(svg|png|jpe?g|gif|webp)$/,
                type: "asset/resource",
                exclude: /node_modules/,
                generator: {
                    filename: "[name][ext]",
                },
            },
            {
                test: /\.(sa|sc|c)ss$/,
                exclude: /node_modules/,
                use: [
                    MiniCssExtractPlugin.loader,
                    {
                        loader: "css-loader",
                        options: {
                            sourceMap: true,
                        },
                    },
                    {
                        loader: "sass-loader",
                        options: {
                            sourceMap: true,
                        },
                    },
                ],
            },
            {
                test: /\.html$/i,
                loader: "html-loader",
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                },
            },
        ],
    },
};

该SCSS代码原本可正常编译,更新依赖版本后出现此问题,需排查原因并解决SCSS编译问题。

原因分析

错误提示指向SCSS中的#{ $self }__icon语法,css-loader无法识别该语法——这说明sass-loader没有先于css-loader处理SCSS变量插值,导致原始的SCSS语法直接被css-loader解析,而css-loader只能处理标准CSS,无法识别SCSS的变量插值语法。

更新依赖后出现该问题,大概率是sass-loader或sass的版本与当前webpack/css-loader版本不兼容,导致loader执行顺序或编译逻辑异常;或是依赖更新后,sass-loader的配置出现隐性变化,没有正确启用SCSS编译。

解决方案

1. 调整SCSS语法(快速验证)

新版本sass对语法空格可能更严格,尝试去掉变量插值中的空格,将#{ $self }改为#{$self},再重新编译测试。

2. 锁定兼容的依赖版本

查看sass-loader官方兼容说明,匹配当前webpack(5.x)、css-loader(6.x)的版本组合,卸载现有版本后重新安装:

# 卸载现有相关依赖
npm uninstall sass-loader sass css-loader
# 安装兼容版本示例(适配webpack 5.x)
npm install sass-loader@13.3.2 sass@1.66.0 css-loader@6.8.0 --save-dev

3. 显式配置sass-loader的编译器

在webpack配置中,给sass-loader指定使用dart-sass编译器,避免版本适配问题:

{
  loader: "sass-loader",
  options: {
    sourceMap: true,
    implementation: require('sass'), // 显式指定dart-sass
  },
}

4. 检查loader执行顺序

Webpack loader是从右到左执行的,当前配置中sass-loader在css-loader之后,顺序正确,但需确保没有其他webpack规则意外匹配了SCSS文件,干扰编译流程。


内容的提问来源于stack exchange,提问作者Aaron Meese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:45:21