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

Craco误将自定义SCSS文件扩展名识别为LESS的问题求助

问题分析与解决

核心问题

报错显示Webpack试图解析.less文件而非.scss,根源有两点:

  • Loader链混乱:你的getStyleLoader同时包含sass-loader和less-loader,处理SCSS文件时,less-loader会介入解析@import语句,默认查找.less后缀的文件。
  • 缺少SCSS扩展名配置:webpackConfig.resolve.extensions只添加了.less,Webpack无法自动补全.scss后缀。

修复步骤

1. 拆分Loader链,分离Sass和Less处理逻辑

修改addLoaders函数中的loader定义,让Sass和Less使用独立的loader链,避免相互干扰:

// 提取通用基础loader:仅保留style、css、postcss loader
const getBaseStyleLoader = (cssOptions, styleLoaderOptions = {}) => [
  {
    loader: 'style-loader',
    options: styleLoaderOptions,
  },
  {
    loader: require.resolve('css-loader'),
    options: cssOptions,
  },
  {
    loader: require.resolve('postcss-loader'),
    options: {
      postcssOptions: {
        plugins: () => [
          require('postcss-flexbugs-fixes'),
          require('postcss-preset-env')({
            autoprefixer: {
              flexbox: 'no-2009',
            },
            stage: 3,
          }),
        ],
      },
      sourceMap: shouldUseSourceMap,
    },
  },
];

// Sass专用loader链:追加sass-loader
const getSassLoader = (cssOptions) => {
  const styleLoaderOptions = { injectType: 'lazyStyleTag' };
  return [
    ...getBaseStyleLoader(cssOptions, styleLoaderOptions),
    {
      loader: 'sass-loader',
      options: {
        sourceMap: process.env.NODE_ENV !== 'production',
      },
    }
  ];
};

// Less专用loader链:追加less-loader
const getLessLoader = (cssOptions) => {
  const styleLoaderOptions = {
    insert: function insertAtTop(element) {
      var parent = document.querySelector('head');
      var lastInsertedElement = window._lastElementInsertedByStyleLoader;

      if (!lastInsertedElement) {
        parent.insertBefore(element, parent.firstChild);
      } else if (lastInsertedElement.nextSibling) {
        parent.insertBefore(element, lastInsertedElement.nextSibling);
      } else {
        parent.appendChild(element);
      }

      window._lastElementInsertedByStyleLoader = element;
    },
  };

  return [
    ...getBaseStyleLoader(cssOptions, styleLoaderOptions),
    {
      loader: 'less-loader',
      options: {
        javascriptEnabled: true,
        sourceMap: process.env.NODE_ENV !== 'production',
      },
    }
  ];
};

2. 添加SCSS扩展名到Webpack解析配置

在webpack.configure中,把.scss和.sass加入resolve.extensions,让Webpack能自动补全SCSS文件后缀:

webpackConfig.resolve.extensions.push('.less', '.scss', '.sass');

3. 修复Less-loader版本兼容问题

你的less-loader@4.0.6与less@4.1.3版本不兼容,建议升级less-loader到适配版本:

npm install less-loader@10.x --save-dev
# 或使用yarn
yarn add less-loader@10.x --dev

4. 移除冗余依赖(可选)

你已经手动配置了Less loader,craco-less可能会造成配置冲突,建议卸载:

npm uninstall craco-less
# 或使用yarn
yarn remove craco-less

验证修复

修改完成后,重新运行craco start,Webpack会正确识别.scss文件的@import语句,不再尝试查找.less后缀。

内容的提问来源于stack exchange,提问作者Ishara M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:57:28