/** * 预加载 * @param {Array} dataList 预加载数据 * @param {Array} attrArray 预加载属性,可选 */ export function preLoad(dataList,attrList){ //如有指定对象属性 let imgList = []; if(attrList){ dataList.forEach(element => { attrList.forEach(attr=>{ if(element[attr]){ const img = new Image(); img.src = element[attr]; imgList.push(img); } }) }); }else{ dataList.forEach(element => { const img = new Image(); img.src = element; imgList.push(img); }); } return imgList; }
在Firefox下并无from memory cache以及from disk cache的状态展示 相同的资源在chrome下是from
disk/memory cache,可是Firefox通通是304状态码
即Firefox下会缓存资源,可是每次都会请求服务器对比当前缓存是否更改,chrome不请求服务器,直接拿过来用200 OK (from disk cache) 是浏览器没有跟服务器确认, 就是它直接用浏览器缓存。 304
是浏览器和服务器确认了一次缓存有效性,再用的缓存。客户端和服务器端只须要传输不多的数据量来作文件的校验,若是文件没有修改过,则不须要返回全量的数据。可以节省大量的网络带宽,并减小了页面的渲染时间。css
<img :src="data[current].imagePath"> mounted() { preLoad(this.data,['imagePath']); }
结果:html
切换没有发XHR,发了Img。200 OK (from disk cache) 是浏览器没有跟服务器确认,即直接用浏览器缓 存。chrome
火狐切换图片速度慢,并无预加载 初次,没有“已缓存”标识。第二个框框内是要预加载的图浏览器
第一次切换,仍是发了请求缓存
第二次切换,正常没有请求(默认状况下状态码为200的响应能够被缓存)。
因此火狐预加载并无成功。服务器
结果:火狐、谷歌表现一致,都切换较快,没有发请求网络
<div ref="solution-img"></div> mounted() { this.preLoadImg = preLoad(this.data,['bgimagePath']); } methods: { changeActive(index) { this.current = index; let dom = this.$refs['solution-img']; if(dom.childNodes.length > 0) dom.removeChild(dom.childNodes[0]); dom.appendChild(this.preLoadImg[index]); } },
不作任何处理结果:第一次请求返回200。第一次加载后都是304app
#preload-01 { background: url('~@/assets/img/market/icon-00.png') no-repeat -9999px -9999px; } #preload-02 { background: url('~@/assets/img/market/icon-01.png') no-repeat -9999px -9999px; }
结果:和不处理表现一致。初次加载也没有请求这些图片。dom
{ background-image: url('~@/assets/img/market/icon-10.png') ; &:hover{ background-image:url('~@/assets/img/market/icon-11.png')} } myPreLoad(){ let images = [ require('@/assets/img/market/icon-10.png'), require('@/assets/img/market/icon-11.png'), ]; preLoad(images);
}测试
结果:第一次hover 状态码304。以后切换没有发请求。火狐和谷歌表现一致,都是304
handleMouseenter(index){ this.getDom(index).style.backgroundImage = "url(" +this.preLoadImage[index*2+1].src + ")"; },
结果:谷歌切换没有发请求。可是火狐会发请求,并返回304。
.backgroud-box{ width: 137px ; height: 113px; background-image: url('./icon-1.png') ; background-position-x:100%; background-position-y:0; } &:hover>.backgroud-box { background-position-y:-113px;}
以上方法都会出现切换背景图片闪烁。用这个方法位移背景就不会。并且第一次加载就把图片下载下来了,切换也不会发请求,由于用的是同一张图
一、由于
在Firefox下并无from memory cache以及from disk cache的状态展示。 相同的资源在chrome下是from
disk/memory cache,可是Firefox通通是304状态码
因此火狐下每次操做到src或者url都要发出请求。
二、恰好<img>标签是一个Image对象,能够直接插入html,因此能够保存在data上缓存。304请求虽然也是能够缩短渲染时间,可是直接保存在data上能够免去一次请求,响应时间更快。
三、背景图片涉及到改变url,因此没办法直接用保存在data上的数据。