什么是图片预加载
所谓的图片预加载只不过是在你正式用到图片之前,已经对图片进行了加载。这样的话,第二次加载图片的时候就可以直接从缓存中读取,速度就会很快。
图片预加载的方式
link 标签实现
利用 link 标签中的 proload 去实现,这个属性允许你在HTML的 head中声明获取请求,制定页面很快就需要的资源,这些资源是你希望在页面周期的早期就开始加载的,早于浏览器的主要渲染机制启动。
<link rel="preload" href="https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg" as="image">
兼容性
兼容性也是相对比较好的, ie 是不支持的哈~
除此之外,这里不仅仅可以预加载图片,也可以预加载你想要的 js、css等等文件。具体可以参考MDN
css 实现
使用 css 本质上其实就是使用 css 中的 background 这个属性去加载图片
#preload {
background:url("https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg") no-repeat -9999px -9999px;
}
js实现
利用 Image 或者是创建一个 img dom 去实现
const img = new Image()
img.src = "https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg"
img.onload = function(){
console.log('图片加载完成')
}
实践对比
说明
我这里使用的是 vite 脚手架创建的一个项目,内容也很简单,就是一个页面中,有一张背景图,现在我们通过上面三种方式来对这张背景图做预加载。
具体代码
#app {
background-image: url("https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg");
background-size: 100%;
background-repeat: no-repeat;
}
页面展示
加载分析
这里可以看到这个图片加载的时机是很慢的,在200多ms才去加载
link方案
具体代码
// html 文件中添加
<link rel="preload" href="https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg" as="image">
加载分析
这里可以看到,这个时候图片加载的时机就很快,大概在30多ms就去加载了
CSS方案
具体代码
我们在 html 中插入这段代码,除了添加 css 还需要添加一个 dom 节点
// html 文件中添加
<style>
#preload{
background:url("https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg") no-repeat -9999px -9999px;
}
<style>
<div #proload></div>
加载分析
大概是在200多ms执行,比正常快了一些,但也不是很多
JS方案
具体代码
这里其实可以分为两种,在于你代码的加载时机。由于用的是 vue 框架,要首先加载 vue 相关的代码,所以这里建议直接写在 html 中
<script>
const img = new Image();
img.src =
"https://images.pexels.com/photos/26100664/pexels-photo-26100664.jpeg";
img.onload = function () {
console.log("图片加载完成");
};
</script>
加载分析
也比正常快了一些,大概也是200ms左右
总结
使用 preload 是加载最快的,使用 css 以及 js 会提升一些,可以参照vite.svg 这个图标,使用 css 和 js 后,加载的比这个图标要快一些
但是使用 preload 和 css 是不可控的,使用 js 是可控的,知道什么时候可以加载完
其他
现在我们所有说的其实都是首屏加载图片,如果不是首屏加载图片呢?那其实我们就可以使用 js 去加载,或者是 link 标签的 prefetch 方式