webpack配置打包后图片路径出错的解决


Posted in Javascript onApril 26, 2018

问题

项目在开发环境下工作正常,当打包后图片不见了,检查元素后发现路径出错了。

图片路径是这样:background: url(/static/img/bg_camera_tip.bd37151.png),但该路径下文件并不存在。

打包后文件目录如下:

webpack配置打包后图片路径出错的解决

可以看到背景图片的路径应该是../../static而实际却是/static,找到原因后就好解决了

方法一

查看build目录下webpack.base.conf.js的配置,图片文件会经过url-loader处理。

module: {
  rules: [
   ...
   {
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
   },
   ...
  ]
 }

它的作用是当文件大小小于limit限制时会返回一个base64串,其实就是把图片资源编码为base64串放在CSS文件里,这样就可以减少一次网络请求,因为每一张图片都是需要从服务端去下载的。但是如果文件太大了就会导致base64串很长,那放在CSS文件里面就会导致文件很大,CSS的文件下载时间变长,就得不偿失了,所以会有一个limit参数,在这个范围内的才会被转成base64串,它的单位是字节。对于这个问题,该loader还提供了一个publicPath参数,目的是修改引用的图片地址,默认是当前路径,那直接改它就可以了,即在options节点下添加一个参数publicPath: '../../'。

module: {
  rules: [
   ...
   {
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
     limit: 10000,
     publicPath: '../../', //你实际项目的引用地址前缀
     name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
   },
   ...
  ]
 }

方法二

webpack.base.conf.js里还有一条规则,每一个vue文件都会经过vueLoaderConfig处理

module: {
  rules: [
   {
    test: /\.vue$/,
    loader: 'vue-loader',
    options: vueLoaderConfig
   },
   ...
  ]
 }

vueLoaderConfig位于build/vue-loader.conf.js,它又调用了build/utils.js的cssLoaders的方法。

if (options.extract) {
   return ExtractTextPlugin.extract({
    use: loaders,
    fallback: 'vue-style-loader'
   })
  }

如果是生产环境options.extract值为true,会调用这个ExtractTextPlugin插件做处理,它的作用是抽离项目中引用的样式文件到一个独立的CSS文件中,这样就可以一次加载所有的CSS文件,相当于CSS文件并行加载,可以减少网络请求次数,更多优点及使用可以查看ExtractTextWebpackPlugin。回到这个问题,它还有一个参数就是publicPath,可以覆盖所指定的loader的publicPath配置,那么就跟前面的配置一样,可以给所有的loader统一配置引用文件的路径地址。

另外这里的user:loader实际上是返回一系列的loader的集合,cssLoaders的返回是

return {
  css: generateLoaders(),
  postcss: generateLoaders(),
  less: generateLoaders('less'),
  sass: generateLoaders('sass', { indentedSyntax: true }),
  scss: generateLoaders('sass'),
  stylus: generateLoaders('stylus'),
  styl: generateLoaders('stylus')
 }

这也就是即便你没有在webpack.base.conf.js中配置sass-loader也能使用SASS语法的原因。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js选取多个或单个元素的实现代码(用class)
Aug 22 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 Javascript
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
JavaScript中使用Math.floor()方法对数字取整
Jun 15 Javascript
jquery操作angularjs对象
Jun 26 Javascript
canvas绘图不清晰的解决方案
Feb 28 Javascript
详解Vue 2.0封装axios笔记
Jun 22 Javascript
关于react-router的几种配置方式详解
Jul 24 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
JSON基本语法及与JavaScript的异同实例分析
Jan 04 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
JavaScript实现刮刮乐效果
Nov 01 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 #jQuery
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
Apr 26 #jQuery
Javasript设计模式之链式调用详解
Apr 26 #Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
Apr 26 #Javascript
vue 做移动端微信公众号采坑经验记录
Apr 26 #Javascript
jQuery length 和 size()区别总结
Apr 26 #jQuery
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 #Javascript
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
2019/02/02 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
Python异常处理总结
2014/08/15 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
python基础教程项目二之画幅好画
2018/04/02 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
python中shell执行知识点
2020/05/06 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
简单说说tomcat的配置
2013/05/28 面试题
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
局域网标准
2016/09/10 面试题
J2EE是技术还是平台还是框架
2016/08/14 面试题
建筑毕业生自我鉴定
2013/10/18 职场文书
应用外语系自荐信
2014/06/26 职场文书
小学生手册家长意见
2015/06/03 职场文书
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js