用 AI 实现图片懒加载,这也太简单了!

在前端摸爬滚打了8年,以前做的主要是B端项目,所以很少能接触到性能优化方面的需求。

最近我们面向C端用户的产品首页图片比较多,产品在给老板演示时,发现图片加载速度很慢。

之前虽然设置了图片缓存,但架不住用户首次打开;而且之前的分页在最近一次调整中临时去掉了,导致首页需要加载50张高清大图,产品也没压缩,不卡才怪。当然也有我的锅,去掉分页后没有做懒加载。

所以,我决定对首页图片进行懒加载优化,不就是计算滚动top设置图片src吗?我都懒得写。

然后,我果断给TRAE下达了任务。

看着TRAE吭哧吭哧的干活,我悠闲的喝了一口咖啡。喝完之后,TRAE也差不多干完活了,我刷新了浏览器后滚动鼠标到底部,图片才开始加载。完美!

我开始看TRAE的代码,封装的真好啊,不过咋有点看不懂?IntersectionObserver是啥,Observer倒有点眼熟,连在一起是真不知道。

于是我点开了MDN的文档,被迫学习了一下!发现IntersectionObserver是一个非常方便的API,它可以监听元素是否进入视口。都不需要前端自己计算滚动top了,浏览器自己就可以监听。

果然科技是在进步的,就如我们现在指挥AI干活。

TRAE封装的代码如下(lazyload.ts):

typescript 复制代码
/** * 图片懒加载工具函数 * 实现首次只渲染可视区域图片,滚动后加载其它图片 */interface LazyLoadOptions {  threshold?: number  rootMargin?: string}/** * 创建IntersectionObserver观察器 * @param callback 回调函数 * @param options 配置选项 * @returns IntersectionObserver实例 */const createObserver = (  callback: (entries: IntersectionObserverEntry[]) => void,  options: LazyLoadOptions = {}): IntersectionObserver => {  const defaultOptions: IntersectionObserverInit = {    threshold: options.threshold ?? 0.1,    rootMargin: options.rootMargin ?? '0px',  }  return new IntersectionObserver(callback, defaultOptions)}/** * 加载图片 * @param img 图片元素 */const loadImage = (img: HTMLImageElement): void => {  if (!img || !img.dataset.src) {    return  }  img.src = img.dataset.src  img.removeAttribute('data-src')}/** * 初始化图片懒加载 * @param selector 图片选择器 * @param options 配置选项 * @returns IntersectionObserver实例 */export const initLazyLoad = (  selector: string = 'img[lazy]',  options: LazyLoadOptions = {}): IntersectionObserver => {  const images = document.querySelectorAll<HTMLImageElement>(selector)    if (images.length === 0) {    console.warn('未找到需要懒加载的图片元素')    return createObserver(() => {})  }  const observer = createObserver((entries) => {    entries.forEach((entry) => {      if (entry.isIntersecting) {        const img = entry.target as HTMLImageElement        loadImage(img)        observer.unobserve(img)      }    })  }, options)  images.forEach((img) => {    if (img.dataset.src) {      observer.observe(img)    }  })  return observer}/** * 手动加载单张图片 * @param img 图片元素或图片元素ID */export const loadSingleImage = (img: HTMLImageElement | string): void => {  const imageElement = typeof img === 'string'     ? document.querySelector<HTMLImageElement>(img)     : img  if (imageElement) {    loadImage(imageElement)  }}/** * 销毁懒加载观察器 * @param observer IntersectionObserver实例 */export const destroyLazyLoad = (observer: IntersectionObserver): void => {  if (observer) {    observer.disconnect()  }}
相关推荐
Escalating_xu6 分钟前
【C++类和对象(上)】从类的定义、封装与对象模型到内存对齐和 this 指针
开发语言·前端·c++
Json____8 分钟前
宿舍安全卫生检查系统:Node 全栈开发实战
java·前端·数据库·毕业设计·课程设计·毕设·wwwoop.com
晴天1613 分钟前
HTML canvas标签使用指南-Day32
前端·html
weixin1997010801616 分钟前
《alibaba.idle.isv.order.ship 接入实录:闲鱼订单发货回传的5个隐式约束》(附Python源码)
服务器·前端·python
初願致夕霞24 分钟前
五种IO模型(详解非阻塞IO与多路转接)
linux·前端·网络·数据库·tcp/ip
深圳多奥智能一卡(码、脸)通系统26 分钟前
智能梯控SDK可直接用于第三方开发对接的接口文档说明书
服务器·前端·算法
烂蜻蜓34 分钟前
Flask入门教程(十五):错误处理与日志——打造健壮的Web应用
前端·python·flask
深念Y42 分钟前
浏览器缩放检测的前端通用方案
前端
风骏时光牛马1 小时前
AIAgent异常故障根因分析与复盘总结
前端
weixin_431600441 小时前
前端数据埋点(7):Web Vitals——页面慢不慢,不是再包一层 fetch
前端·性能优化·sentry·数据埋点