解析vue-lazyload的设计思想

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
简介: 解析vue-lazyload的设计思想

vue-lazyload解决了什么问题?


可以想象一个网页打开有成百上千的图片需要加载,页面会变得非常的卡顿,此时如果只是可视区域的图片加载,其他的图片可以暂时有一个占位loading图,等滚动它们到可视区域时再去请求真实图片并且替换就好了。很好,vue-lazyload插件就是解决此类问题的,对vue插件的写法不熟悉的可以先看一下vue插件


vue-lazyload设计简析


解析之前可以先思考一下如果自己写一个图片懒加载的工具,会如何实现呢?首先最明显的是需要一个检查图片dom元素是否在浏览器可视区域内的方法checkInView,然后需要给所有图片的滚动父元素绑定一个滚动事件的监听方法scrollHandler,所以大概的思路图为:

image.png


image.png

其实上图就已经实现了一个最最基本的图片懒加载的思路了,稍加修饰就可以写出可运行的代码。

接下来带着这个基本思路来看vue-layload的实现.


src/index.js


image.png

可以看到提供了两种指令使用方式和两种组件使用方式,我主要分析v-lazy的指令在vue2版本的实现,其他的可以自行分析,原理相通。

可以看出来通过Lazy和LazyClass得到了lazy这个对象,v-lazy指令对应的几个回调函数:bind、update、componentUpdated和unbind分别绑定的是lazy对象的add、update、lazyLoadHandler和remove方法。

接下来看lazy对象是如何生成的:


src/lazy.js

image.png

可以看到lazy.js文件导出了一个方法,该方法又返回了一个Lazy类,这么写的

原因是为了形成闭包来继续在Lazy类中引用Vue。下面看Lazy类的构造函数:

image.png

可以看到构造函数里面初始化了一大堆的配置和变量,一个函数lazyLoadHandler以及setMode来判断是否使用observer来检测dom可见(IntersectionObserver


顺着刚刚src/index.js的思路继续往下看指令bind回调函数发生了什么:

src/lazy.js

image.png

image.png

可以看到对于每个添加了v-lazy指令的dom元素,都会先找到它的scrollParent元素(其实就是一直向上遍历到它overflow=auto或scroll的祖先元素);然后会生成一个newListener对象,并且把newListener加到ListenerQueue数组中;最后调用_addListenerTarget方法。

接着看_addListenerTarget方法发生了什么:


src/lazy.js

image.png

可以看到将scrollParent元素放入了TargetQueue,并且调用了_initListen方法


继续看_initListen方法:

src/lazy.js

image.png

可以看到给scrollParent监听了this.options.ListenEvents里面的所有事件,事件回调函数为lazyLoadHandler。

在前面已经说过了lazyLoadHandler的初始化:


src/lazy.js

image.png

lazyLoadHandler方法就是_lazyLoadHandler加了一个节流包装后返回的函数。

继续看_lazyLoadHandler的实现:

src/lazy.js

image.png

可以看到_lazyLoadHandler方法里是遍历了ListenerQueue数组,并且调用每个listener的checkInView,如果checkInView返回true则调用listener.load;此时其实可以猜到checkInView是在检查该listener对应的dom元素是否在可视区域内,listener.load方法是在请求真正的image。

所以梳理一下,vue-lazyload的简要设计思想可以如图所示



image.pngimage.pngimage.png

image.png

相关文章
|
2月前
|
JavaScript 前端开发 API
vue的优缺点有那些 组件常用的有那些?
vue的优缺点有那些 组件常用的有那些?
|
3月前
|
JavaScript 前端开发 算法
Vue是如何实现的
【4月更文挑战第16天】Vue.js 是一个渐进式框架,专注于构建数据驱动的 web 界面。其核心是响应式系统,通过 getter/setter 使数据变化时自动更新视图。Vue 采用组件化开发,支持声明式模板语法和虚拟 DOM,提高性能。指令和过滤器简化模板操作,插件和混合扩展功能,vue-router 和 vuex 解决SPA的路由和状态管理。通过这些技术,Vue 实现简洁、高效的应用构建。
16 0
|
3月前
|
JavaScript
在 Vue 中如何使用组件的懒加载和按需加载?
在 Vue 中如何使用组件的懒加载和按需加载?
40 1
|
3月前
|
JavaScript 前端开发
Vue中如何实现组件的按需加载?
Vue中如何实现组件的按需加载?
92 1
|
3月前
|
JavaScript
Vue中如何实现组件的异步加载?
Vue中如何实现组件的异步加载?
47 3
|
3月前
|
JavaScript 前端开发 算法
探究前端框架Vue.js的响应式原理
本文将深入探讨前端框架Vue.js的核心特性——响应式原理。我们将介绍Vue.js中的数据绑定、依赖追踪和虚拟DOM等概念,并通过具体的示例代码解析其工作机制。通过了解Vue.js的响应式原理,开发者可以更好地利用这一特性构建灵活、高效的前端应用。
|
3月前
|
移动开发 JavaScript 前端开发
Vue与React:核心异同点解析
Vue与React:核心异同点解析
249 0
|
10月前
|
存储 JavaScript 调度
Vue3组件的实现原理
Vue3组件的实现原理
|
缓存 JavaScript 开发者
vue2源码系列-响应式原理
之前学习了 vue 实例化及渲染函数的实现,其中的数据初始化 initData 中的 observe(data) 我们没有继续深入分析。因为内容比较多,所以今天单独开了篇来介绍 vue 的响应式原理。 对数据劫持与订阅发布比较生疏的,可以先阅读 浅谈订阅发布实现vue打打基础。
|
存储 设计模式 JavaScript
什么是Vue,Vue的作用与原理?
什么是Vue,Vue的作用与原理?
93 2
什么是Vue,Vue的作用与原理?