关于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 相关文章推荐
jQuery模拟超链接点击效果代码
Apr 21 Javascript
判定是否原生方法的JS代码
Nov 12 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
JavaScript Function函数类型介绍
Apr 08 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
Sep 15 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 Javascript
vue axios数据请求及vue中使用axios的方法
Sep 10 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
表单提交验证类
2006/07/14 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
python解析json实例方法
2013/11/19 Python
python中正则表达式的使用详解
2014/10/17 Python
Python re模块介绍
2014/11/30 Python
深入理解Python变量与常量
2016/06/02 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
python读取文本中的坐标方法
2018/10/14 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
火车来了教学反思
2014/02/11 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
委托书英文
2015/01/28 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android