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

Webpack 5中SCSS文件引用SVG/TTF资源时Loader失效问题

解决Webpack无法处理SCSS中SVG/TTF资源的问题

1. 先修正资源路径错误

这是引发Module not found的常见原因,先核对你的文件结构:
假设项目结构为:

repo/
├─ src/
│  ├─ scss/
│  │  └─ index.scss
│  ├─ assets/
│  │  └─ error-input.svg
│  └─ fonts/
│     └─ RobotoMono-Light.ttf

那么SCSS中的路径需要调整:

  • TTF路径../fonts/RobotoMono-Light.ttf是正确的
  • SVG路径应改为$_path: '../assets/';,而非../../assets/(从scss目录上一级就是src,src下直接包含assets文件夹)

2. 清理冲突的Loader规则

你的Webpack配置里存在重复的SVG处理规则,Webpack会优先匹配第一个符合的规则,导致后续资源Loader无法生效。

移除重复规则

删掉单独的SVG Loader配置:

// 移除这一行
{ test: /\.svg$/, use: ["svg-inline-loader", "svg-url-loader"] },

合并资源处理规则

推荐使用Webpack5内置的Asset Modules(无需额外安装url-loader/file-loader),配置如下:

{
  test: /\.(eot|woff|woff2|ttf|svg|png|jpg)$/,
  type: 'asset',
  parser: {
    dataUrlCondition: {
      maxSize: 8 * 1024 // 8kb以下资源转base64,可按需调整
    }
  }
}

如果坚持使用url-loader,确保已安装依赖npm install url-loader file-loader --save-dev,然后配置:

{
  test: /\.(eot|woff|woff2|ttf|svg|png|jpg)$/,
  loader: "url-loader",
  options: {
    limit: 8192,
    name: '[name].[hash:8].[ext]',
    outputPath: 'assets/' // 资源输出到dist/assets目录
  }
}

3. 确保css-loader正确解析url()

显式配置css-loader的importLoaders参数,保证sass-loader处理后css-loader再解析资源路径:

{
  test: /\.s[ac]ss$/i,
  use: [
    "style-loader",
    {
      loader: "css-loader",
      options: {
        importLoaders: 1 // 让css-loader先等待sass-loader处理完成
      }
    },
    "sass-loader"
  ],
},

最终Webpack配置示例

const HtmlWebpackPlugin = require("html-webpack-plugin");
const webpack = require("webpack");

module.exports = {
  module: {
    rules: [
      { test: /\.jsx?$/, use: "babel-loader" },
      {
        test: /\.(eot|woff|woff2|ttf|svg|png|jpg)$/,
        type: 'asset',
        parser: {
          dataUrlCondition: {
            maxSize: 8 * 1024
          }
        }
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              importLoaders: 1
            }
          },
          "sass-loader"
        ],
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },

  plugins: [new HtmlWebpackPlugin({ template: "./public/index.html" })],
  resolve: {
    extensions: [".js", ".jsx", ".ts", ".tsx", "..."],
    preferRelative: true,
    modules: [".", "node_modules"],
  },
};

额外排查点

  • 确认资源文件真实存在,文件名(含大小写)和SCSS引用完全一致(Linux/macOS区分大小写)
  • 可通过添加resolve.alias简化路径,避免相对路径出错:
resolve: {
  alias: {
    '@assets': path.resolve(__dirname, 'src/assets'),
    '@fonts': path.resolve(__dirname, 'src/fonts')
  }
}

之后在SCSS中直接使用:

src: url('@fonts/RobotoMono-Light.ttf') format('truetype');
$_path: '@assets/';
content: url('#{$_path}error-input.svg');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:48:27