懒加载和预加载
Motivation
今天做拼多多的前端笔试的时候问到了这样一个问题:
图片懒加载和预加载的不同点?他们的应用场景?两种技术对服务器前端的影响。
好像只是听说过,没有具体了解和应用过。所以在这里赶紧总结一下
本文参考了掘金浪里行舟的[懒加载和预加载]https://juejin.im/post/5b0c3b53f265da09253cbed0
懒加载
懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好的优化网页性能的方式。
用户滚动到它们之前,可视区域外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。
在某些情况下,它还可以帮助减少服务器负载。
懒加载通常适用于图片很多,页面很长的电商网站场景中。
懒加载优点有:
- 能提升用户体验。例如在使用B站的时候,如果网页上所有的视频封面都一次性加载,由于图片数目较大,等待时间就会很长,严重影响用户体验。
- 减少无效资源的加载,这样能明显减少服务器的压力和流量,也能够减少浏览器的负担。
- 防止并发加载的资源过多会阻塞js的加载,影响网站的正常使用。
懒加载的原理:首先将页面上的src属性设为空字符串,而图片的真实路径则设置在data-original属性中,当页面滚动的时候需要监听scroll事件,在scroll事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图片在可视区内将图片的src属性设置为data-original值,这样就可以实现延迟加载。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Lazyload</title>
<style>
.image-item {
display: block;
margin-bottom: 50px;
height: 200px;//一定记得设置图片高度
}
</style>
</head>
<body>
<img src="" class="image-item" lazyload="true" data-original="images/1.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/2.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/3.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/4.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/5.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/6.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/7.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/8.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/9.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/10.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/11.png"/>
<img src="" class="image-item" lazyload="true" data-original="images/12.png"/>
<script>
var viewHeight =document.documentElement.clientHeight//获取可视区高度
function lazyload(){
var eles=document.querySelectorAll('img[data-original][lazyload]')
Array.prototype.forEach.call(eles,function(item,index){
var rect
if(item.dataset.original==="")
return
rect=item.getBoundingClientRect()// 用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置
if(rect.bottom>=0 && rect.top < viewHeight){
!function(){
var img=new Image()
img.src=item.dataset.original
img.onload=function(){
item.src=img.src
}
item.removeAttribute("data-original")//移除属性,下次不再遍历
item.removeAttribute("lazyload")
}()
}
})
}
lazyload()//刚开始还没滚动屏幕时,要先触发一次函数,初始化首页的页面图片
document.addEventListener("scroll",lazyload)
</script>
</body>
</html>
预加载
资源预加载是另一个性能优化技术,可以用来预先告知浏览器某些资源可能在将来会被使用到。
预加载就是将所有所需的资源提前请求加载到本地,这样后面再需要用到时就直接从缓存中获取资源。
预加载的优点在于:在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,直到所有内容加载完毕。
预加载有几种实现方式:
-
使用HTML标签
<img src="http://pic26.nipic.com/20121213/lkajf.img" style="display:none">
-
使用image对象
<script src="./myPreload.js"></script>
var image = new Image();
image.src = "http://pic26.nipic.com/20121213/lkajf.img";
- 使用XMLHttpRequest对象,虽然存在跨域问题,但会精细控制预加载过程。
var xmlhttprequest = new XMLHttpRequest();
xmlhttprequest.onreadystatechange = callback;
xmlhttprequest.onprogress = progressCallback;
xmlhttprequest.open("GET", "http://image.baidu.com/mouse.jpg", true);
xmlhttprequest.send();
function callback() {
if(xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
var responseText = xmlhttprequest.responseText;
} else {
console.log("Request was unsuccessful: " + xmlhttprequest.status);
}
}
function progressCallback(e) {
e = e || event;
if (e.lengthComputable) {
console.log("Received"+e.loaded+"of"+ e.total + "bytes");
}
}
懒加载和预加载的对比
两者都是提高页面性能有效的办法,两者主要区别是一个提前加载,一个迟缓甚至不加载。
懒加载对服务器前端有一定的缓解压力作用,预加载会增加服务器前端压力。