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]')
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
assetsPublicPath/assetsSubDirectory/img/'图片名'
。到这里就可以确定,如果小于10KB的图片转为base64,大于10KB的图片已经将图片路径改为了assetsPublicPath/assetsSubDirectory/img/'图片名'
,如果您的设置为assetsPublicPath: './'
,所得路径为./static/img/'图片'
// 目前我们的目录结构
index.html
static
|--img
|--'picname'
|--css
|--app.css
|--js
|--app.js
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
./static/img/'图片名'
是能正确访问到图片的,所以img的路径没问题,然后app.css访问./static/img/'图片名'
是访问错误的,因为在css目录下并没有static目录。这样就造成了路径访问失败的问题。解决办法
- 检查config文件中的assetsPublicPath是否设置为’/’而不是’./’
注意区分’/’为绝对路径,绝对路径从网站静态服务器根目录查询/static/img/图片
,这样的路径就是正确的,如果设置为’./’,路径就变成了相对路径,相对路径会根据相对的文件目录来确定文件资源,会造成上面分析的问题
- vue-cli创建的vue项目,会自带一个static目录,将出错图片放在该目录下面即可(正确解决办法)
查看vue-cli创建项目的webpack配置文件可以找到一个将static目录拷贝到dist目录中。根据对资源的规划不同,将需要打包的资源放在src/assets目录中,不需要打包的资源放入static目录中。
- 使用小图片作为背景图片:
将小于10KB的图片作为背景图片,如果有大于10KB的图片作为img图片。
- 修改url-loader的limit值:
从上面分析可知,当图片转为base64就没有路径错误的问题,保证自己的背景图片都能转为base64就可以防止该错误发生,将limit的值改为你的背景图最大那一张的值还大一点就行,换算为B的单位
- 将css不要单独打包出来:
直接通过css-loader和style-loader打包到js中,js自动创建style标签,这样,背景图片的访问路径就是通过index.html路径访问了,不过该解决方案也不建议。会导致js过大,和图片过大不建议转base64一个道理。
- 使用绝对路径的图片地址路径(建议)
不建议:不建议修改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增加体积为百分之二十;
- 一张10KB的图片通过http请求下载为0.2s,他转为base64之后为12KB,在js下载中,增加了12KB的大小,所以增加0.12S 所以转base64能优化0.08s的页面加载速度;
- 一张100KB的图片通过http请求的速度是1.1s。转base64之后大小为120KB,他会增加js的大小120KB,所以增加加载时间1.2s。这样一算下来,转为base64之后,并不能优化页面加载速度,反而拖慢了0.1s的加载速度,为不划算。
在开发过程中,处理加载速度之外我们还得考虑并行下载的问题。如果全在一个js中,这个js没下载完成之前,图片也是没有下载的,也就是转base64之后,可以认为js和图片是串行下载的。而走http请求,图片是可以和js并行下载的。所以实际上需要更小的图片才能更划算
【vue学习|vue打包后图片路径错误】学习笔记,如有不足请多指教!
推荐阅读
- vue学习|vue3修改link标签默认icon无效问题
- vue中获取后一页面,前一页面的url
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
- 工作学习分享|vue学习(一) vue指令和过滤器
- Android|Android中获取图片尺寸大小两种方法