关于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 相关文章推荐
判断ie的两种简单方法
Aug 12 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
Aug 11 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
javascript鼠标右键菜单自定义效果
Dec 08 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
动态加载JavaScript文件的3种方式
May 05 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
js利用拖放实现添加删除
Aug 27 Javascript
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
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
实用函数4
2007/11/08 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
React如何避免重渲染
2018/04/10 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python中字符串对齐方法介绍
2015/05/21 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
python计算auc指标实例
2017/07/13 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
如何在django中添加日志功能
2020/02/06 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
KTV的创业计划书范文
2014/02/02 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
pandas求平均数和中位数的方法实例
2021/08/04 Python