起因:博客中上传的某些图片比较大,因为大部分是旅游时用相机拍摄的,所以在页面加载时,因为图片资源大,加载很缓慢,文字内容出来了,图片缓慢加载
图片资源较大可能会造成的问题:
| 影响维度 | 具体表现与原因 |
|---|---|
| 网络请求 | 每个图片都是一个独立的HTTP请求。浏览器对同一域名的并发请求数有限制(通常6-8个),大量大图片会阻塞后续关键资源(如JS、CSS)的加载。 |
| 下载时间 | 假设用户网速为5Mbps,比如加载一张20MB图片就需要 32秒。多张这样的图片会使加载时间呈线性增长,用户可能在看到任何内容前就离开了。 |
| 渲染阻塞 | 图片下载完成后,浏览器需要解码(将图片数据转为像素)和渲染,这需要消耗大量主线程CPU和内存,导致页面卡顿、滚动不流畅。 |
| 流量消耗 | 对移动端用户极不友好,甚至可能直接耗尽其套餐。 |
除了大图片,以下因素也会拖慢你的页面:
首先图片存储是使用阿里云OSS,使用 阿里云 OSS 图片处理(最快见效)
在阿里云 OSS 控制台预先定义好一套规则(比如缩放、质量、格式),给这套规则起个名字。
进入 OSS 控制台 -> 选中 Bucket -> 图片处理。可以设置多个样式别名
在 OSS 控制台开启“自定义分隔符”,通常配合“样式别名”使用。
在同一页面找到“访问设置”,设置分隔符
我是使用 样式别名 + 自定义分隔符(分隔符使用的!,看个人选择)
通过这样的设置,可能会有如下样式别名 !original,!preview等等(具体看你设置了哪些样式别名)
然后在前端项目中封装图片组件,在页面中适应img的地方改为封装后的组件
组件可传入类型,比如类型传入preview,则最终渲染的图片为 https://img.blackztt.cn/uploads/2026-01-26/656bae28f23559f4bd2cf490b078136a.jpg!preview (以该项目为例)
这样在图片加载时,会进行压缩,而不是原始图片尺寸,图片加载效率大幅提升
懒加载会极大提升页面加载效率。
讲一下图片懒加载的实现:
首先需要讲到一个概念,叫做IntersectionObserver,是现代浏览器提供的一种高性能 API,专门用于异步监测一个元素是否进入了另一个元素(通常是视口)的可视区域
IntersectionObserver 的优势: 它是基于浏览器底层引擎实现的。你只需告诉浏览器“当这个元素进来时通知我”,浏览器会在内部优化的时间点发出通知,不会阻塞主线程
{ rootMargin: '50px' }除了 rootMargin,其实共有三个核心参数:
entries回调函数返回的是一个数组,因为一个观察者可以同时观察多个对象。
对封装的图片组件继续封装,实现懒加载功能
因为是nuxt项目,贴出图片懒加载的部分实现
onMounted(() => {
if ('IntersectionObserver' in window) {
observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
//触发真实图片的加载
isIntersecting.value = true
// 加载完成后,停止观察该元素,释放内存
if (observer) {
observer.unobserve(entry.target)
}
}
})
}, {
rootMargin: '50px' // 提前 50px 开始加载,提升用户体验
})
if (imgRef.value) {
observer.observe(imgRef.value)
}
} else {
// 降级处理:如果浏览器不支持 IntersectionObserver,直接加载
isIntersecting.value = true
}
})
onUnmounted(() => {
if (observer) {
observer.disconnect()
}
})