微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解决webpack打包样式url()背景图片问题

定位错误

项目使用webpack4进行编译,打包后的样式中使用url方法指定的背景图片不能够正常显示

.bgurl{
  background-image: url('/images/abc.jpeg')
}

上述样式在webpack中编译出错,配置如下

// stylus
[
  loader: MiniCssExtractPlugin.loader,
  {
    loader: 'css-loader',
    options: {
      importLoaders: 2,
    }
  },
  'postcss-loader',
  'stylus-loader'
]

始终爆图片未找到的错误,按照网上找到的解决方案,补全MiniCssExtractPlugin配置项publicPath,但依然出错。看来问题不是出在MiniCssExtractPlugin。后经过仔细排查。定位到错误其实是css-loader编译时爆出来的。

去npm上找到css-loader配置,找到如下内容

NameTypeDefaultDescription
url{Boolean|Function}trueEnables/disables url/image-set functions handling

url
Type: Boolean|Function Default: true

Enables/disables url/image-set functions handling. Control url() resolving. Absolute URLs are not resolving.

Examples resolutions:

url(image.png) => require('./image.png')
url('image.png') => require('./image.png')
url(./image.png) => require('./image.png')
url('./image.png') => require('./image.png')
url('http://dontwritehorriblecode.com/2112.png') => require('http://dontwritehorriblecode.com/2112.png')
image-set(url('image2x.png') 1x, url('image1x.png') 2x) => require('./image1x.png') and require('./image2x.png')

属性url认为true,此属性认强行解释样式中使用url定位的图片认寻址该图片地址(与css同源地址),因同源地址图片不存在(实际图片存在于另外的目录),造成编译错误

修正webpack配置

[
  {
    loader: MiniCssExtractPlugin.loader,
    options: {
      publicPath: '//localhost:3000/', 
    }
  },
  {
    loader: 'css-loader',
    options: {
      importLoaders: 2,
      url: false 
    }
  },
  'postcss-loader',
  'stylus-loader'
]

publicPath
此项配置可以共用webpack.output配置,但建议在MiniCssExtractPlugin.loader中独立设置。有以下两个原因

  1. css的url(…)中的图片一般是相对路径寻址图片
  2. 运维会提供静态资源服务器,图片有专属的域名地址

url
css-loader的配置url设为false,使css-loader不解析样式中url(…)的图片地址,保持原有属性

至此,webpack打包样式url()背景图片问题得以解决,希望对大家有帮助

开源项目

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐