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

如何在SCSS中配置URL文件的正确相对路径(Webpack+PugPlugin)

问题

在SCSS中通过background: url(../images/bg-blue.svg);引入图片时,配置PugPlugin的css.outputPath为'assets/css/'后,生成的CSS中图片路径变为根相对的background:url(assets/images/bg-blue.73cdd532.svg);,但实际需要的是相对于CSS目录的background: url(../images/bg-blue.73cdd532.svg);。

环境信息:

  • Webpack版本:^5.75.0
  • PugPlugin版本:^4.9.2
  • 系统:Windows

当前相关配置如下:

PugPlugin配置

new PugPlugin({
    pretty: true,
    css: {
        enabled: true,
        test: /\.(css|scss|sass|less|styl)$/,
        outputPath: 'assets/css/',
    },
}),

样式与图片规则

{
  test: /\.(scss|css)$/,
  use: ['css-loader', 'postcss-loader', 'sass-loader'],
},
{
  test: /\.(png|jpg|jpeg|ico|svg)/,
  type: 'asset/resource',
  generator: {
    // output filename of images
    filename: 'assets/images/[name].[hash:8][ext]',
  },
}, 

Output配置

output: {
  path: path.join(__dirname, 'dist/'),
  filename: 'assets/js/[name].js',
  path: __dirname + '/dist',
  assetModuleFilename: path
      .join('assets/images', '[name][ext]')
      .replace(/\\/g, '/'),
  clean: true,
}

构建后的文件结构符合需求,但图片路径不符合预期。


解决方案

1. 配置css-loader的相对路径

修改样式规则中css-loader的配置,添加publicPath: '../',让css-loader生成相对于CSS文件所在目录的图片路径:

{
  test: /\.(scss|css)$/,
  use: [
    {
      loader: 'css-loader',
      options: {
        publicPath: '../',
      },
    },
    'postcss-loader',
    'sass-loader'
  ],
},

2. 修复Output配置的重复项并统一资源路径

Output配置中存在重复的path属性,删除重复项,并让assetModuleFilename与图片规则的generator.filename保持一致,避免路径冲突:

output: {
  path: path.join(__dirname, 'dist/'),
  filename: 'assets/js/[name].js',
  assetModuleFilename: 'assets/images/[name].[hash:8][ext]',
  clean: true,
}

3. 保留PugPlugin的css输出路径设置

维持PugPlugin中css.outputPath: 'assets/css/'的配置不变,因为我们已经通过css-loader的publicPath属性控制了相对路径逻辑。

调整完成后,生成的CSS文件中图片路径会变为../images/bg-blue.73cdd532.svg,符合相对于CSS目录的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:07:33