use-quicklink
使用quickLink来提升用户体验
quickLink是什么
quickLink是谷歌实验室推出的一个库,这个库实现了在浏览器的空闲时间预先拉取页面内的链接,加速后序页面的加载速度的功能。
就是说,用了他们这个东西,可以提前拉取当前页面的链接,这些链接都是用户可能点击访问的,这样用户真正点击的时候,浏览器已经预先拉取了这个地址,速度就要比普通的加载要快。
什么时候让浏览器去拉取页面内的链接呢?
预先拉取链接能提升加载速度确实很好,但是这个行为也是需要耗费浏览器资源的,这里,有一个问题,什么时候去拉取。
首先可以肯定的是,不能耽误当前页面的渲染和加载。
至少也要在我当前页完全渲染展示给用户,并且可以响应用户交互之后,再去干这些“锦上添花”的预拉取操作。聪明的你一定想到,在onload之后再去预拉取链接。如果链接很多,而此时,用户有了交互,当前页面内有动画等也要优先去响应,这时候怎么办?这就要注意下上文提到的关键点“在浏览器的空闲时间内”
在浏览器空闲时间内预拉取
我如何知道浏览器什么时候处理完了交互动画等重要的事儿,空闲下来了呢?这就要提到一个浏览器的API,requestIdleCallback,这个API实现的就是在浏览器空闲的时候,可以执行一些回调。
另一个问题,如果页面内的链接非常多,我都要一次性拉取么?页面底部的链接,用户可能根本不会去访问。这种情况可以参考我们经常使用的一种优化,滚动懒加载。也就是说,只有可能要用到的时候,才去预取链接。
检测视窗內的链接
quicklink使用Intersection Observer API来实现这个功能.
这个API可以做什么呢?”如果两个元素发生的交集部分在N%左右,我需要做处理一些事情(执行回调)”,它接收一个回调函数,这个回调函数,会在满足条件的时候被执行,而条件就是目标元素(target)和设备视窗/其他指定的元素(root)的发生交集时。
quickLink怎么用
安装
1 | yarn add quicklink |
用法
1 | import quicklink from "quicklink/dist/quicklink.mjs"; |
这是最简单的用法,当然quick也接收一些参数
API
主要的有这几个:
- el: 监测该元素进入视窗触发prefetch
- urls: 需要预取URL数组
- timeout:requestIdleCallback的回调有效期限
- priority: 预取请求的优先级,fetch() 或者
……
更多使用例子见官方git
polyfill
这是一个实验性的库,并不是主流浏览器都支持的,它本身包含了一个小的requestIdleCallback的兼容,但是Intersection Observer API,就需要额外的手动添加polyfill
1 | yarn install intersection-observer |
1 | import 'intersection-observer'; |