关于Vue背景图打包之后访问路径错误问题的解决


Posted in Javascript onNovember 03, 2017

案例环境

通过vue-cli脚手架创建的vue项目

在项目打包的时候遇到了背景图片路径出错的问题,经过谷歌一番,发现是在配置的时候对图片的限制大小过小造成的

首先,出错点在url-loader上面。

// url-loader配置
// build/webpck.base.conf.js
{
 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
 loader: 'url-loader',
 query: {
  limit: 10000,
  name: utils.assetsPath('img/[name].[hash:7].[ext]')
}

这里解释一下上面这段url-loader配置,test是正则匹配规则,匹配项目中所有的以正则规则结尾的格式的文件,直白点就是所以的图片(png,jpg,jpeg,gif,svg)。然后用url-loader进行处理。处理也有个规则如下,当不大于10000B的文件进行base64转码,就是将图片转为base64的格式。如果超过10KB的图片就单独打包到utils.assetsPath(‘img/[name].[hash:7].[ext]') 这个目录下(从build/utils.js和config/index.js可以知道这个路径就是static/img目录,并且图片名是进行hash之后的值,根目录下面没有static目录,所以会创建一个static目录,至于为什么最后没有看见这个目录后续再说),当我们创建了一个这样的目录之后,所以的图片访问路径就成了对应的static/img/'图片名'。到这里就可以确定,如果小于10KB的图片转为base64,大于10KB的图片已经将图片路径改为了static/img/'图片名',然后我们继续来理清访问路径的事情。

// 目前我们的目录结构
index.html
static
  |--img
    |--'picname'
  |--css
    |--app.css
  |--js
    |--app.js

我们知道img为html标签,他的路径是由index.html开始访问的,他走static/img/'图片名'是能正确访问到图片的,所以img的路径没问题,然后app.css访问static/img/'图片名'是访问错误的,因为在css目录下并没有static目录。这样就造成了路径访问失败的问题。

解决办法

1、使用小图片作为背景图片(建议):

将小于10KB的图片作为背景图片,如果有大于10KB的图片作为img图片。

2、修改url-loader的limit值(不建议):

从上面分析可知,当图片转为base64就没有路径错误的问题,保证自己的背景图片都能转为base64就可以防止该错误发生,将limit的值改为你的背景图最大那一张的值还大一点就行,换算为B的单位

3、将css不要单独打包出来(不建议):

直接通过css-loader和style-loader打包到js中,js自动创建style标签,这样,背景图片的访问路径就是通过index.html路径访问了,不过该解决方案也不建议。会导致js过大,和图片过大不建议转base64一个道理。

4、使用绝对路径的图片地址路径(建议)

建议:使用小图片作为背景图片,大图片用img标签。首先得分清背景图片和图片img的一些区别,就各人理解而言,背景图片是用来修饰网页的,与实际内容无关的东西,使用背景图片。如果与内容有关的东西都应该使用img标签算作网页结构的内容。修饰的图片尽量的小,也可以使用图片压缩等策略减小图片大小。

不建议:不建议修改limit值的原因是,url-loader的配置是针对整个项目的图片,修改了limit值也等于让html中img标签的图片也跟着进行了base64的转换,而对于base64的转换的缺点是他会增大图片原本的体积,如果对大图进行了转base64会造成你的js文件过大,从而增加了加载js时间过长。

关于base64

优点:base64就是一串字符串码来表示的图片,在加载页面或者js的时候就一并加载过来,减少图片引用时单独的一次http请求。了解web端性能优化的同学都知道,http请求每次建立都会占用一定的时间,对于小图请求来说,可能http建立请求的时间比图片下载本身还长。所以对小图进行base64转码是优化http请求,保证页面加速渲染的一种手段。

缺点:base64缺点就是之前提到的,他会增加图片本身的大小,对小图片来说,增加大小导致js的请求增长完全能弥补多一个http请求的建立的时长,这种取舍是划算的。可是对于大图来说,这样的取舍是不划算的。

举个例子

例子:(以下数据都是随便模拟,看看思路就行)
假如每次建立http时长为0.1s,网络传输为100KB/s,每次转base64增加体积为百分之二十;

  1. 一张10KB的图片通过http请求下载为0.2s,他转为base64之后为12KB,在js下载中,增加了12KB的大小,所以增加0.12S 所以转base64能优化0.08s的页面加载速度;
  2. 一张100KB的图片通过http请求的速度是1.1s。转base64之后大小为120KB,他会增加js的大小120KB,所以增加加载时间1.2s。这样一算下来,转为base64之后,并不能优化页面加载速度,反而拖慢了0.1s的加载速度,为不划算。

思考:

在开发过程中,处理加载速度之外我们还得考虑并行下载的问题。如果全在一个js中,这个js没下载完成之前,图片也是没有下载的,也就是转base64之后,可以认为js和图片是串行下载的。而走http请求,图片是可以和js并行下载的。所以实际上需要更小的图片才能更划算

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

Javascript 相关文章推荐
JS Array对象入门分析
Oct 30 Javascript
jQuery 技巧大全(新手入门篇)
May 12 Javascript
(function($){...})(jQuery)的意思
Jul 22 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
Feb 08 Javascript
js调试系列 控制台命令行API使用方法
Jun 18 Javascript
JavaScript的==运算详解
Jul 20 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
socket.io学习教程之基本应用(二)
Apr 29 Javascript
详解vue引入子组件方法
Feb 12 Javascript
ES6 Promise对象的应用实例分析
Jun 27 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 #Javascript
基于jQuery解决ios10以上版本缩放问题
Nov 03 #jQuery
nginx配置React静态页面的方法教程
Nov 03 #Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 #Javascript
mui上拉加载更多下拉刷新数据的封装过程
Nov 03 #Javascript
基于ES6作用域和解构赋值详解
Nov 03 #Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 #Javascript
You might like
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
Javascript简单实现可拖动的div
2013/10/22 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
jQuery实现tab栏切换效果
2020/12/22 jQuery
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
pandas 选择某几列的方法
2018/07/03 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
Python操作json的方法实例分析
2018/12/06 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
数字化校园建设方案
2014/05/03 职场文书
买卖合同协议书范本
2014/10/18 职场文书
试用期自我评价范文
2015/03/10 职场文书