requestIdleCallback

阅读数:49 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、概述

当关注用户体验,不希望因为一些不重要的任务(如统计上报)导致用户感觉到卡顿的话,就应该考虑使用requestIdleCallback。因为requestIdleCallback回调的执行的前提条件是当前浏览器处于空闲状态。

二、与requestAnimationFrame的区别

requestAnimationFrame的回调会在每一帧确定执行,属于高优先级任务,而requestIdleCallback的回调则不一定,属于低优先级任务。
由于requestIdleCallback利用的是帧的空闲时间,所以就有可能出现浏览器一直处于繁忙状态,导致回调一直无法执行。

requestIdleCallback(myNonEssentialWork, { timeout: 2000 });

如果是因为timeout回调才得以执行的话,其实用户就有可能会感觉到卡顿了,因为一帧的执行时间必然已经超过16ms了。

三、requestIdleCallback里面不要执行dom操作

requestIdleCallback回调的执行说明前面的工作(包括样式变更以及布局计算)都已完成。如果我们在callback里面做DOM修改的话,之前所做的布局计算都会失效,而且如果下一帧里有获取布局(如getBoundingClientRect、clientWidth)等操作的话,浏览器就不得不执行强制重排工作,这会极大的影响性能,另外由于修改dom操作的时间是不可预测的,因此很容易超出当前帧空闲时间的阈值,故而不推荐这么做。

推荐的做法是在requestAnimationFrame里面做dom的修改,可以在requestIdleCallback里面构建Document Fragment,然后在下一帧的requestAnimationFrame里面应用Fragment。

推荐放在requestIdleCallback里面的应该是小块的(microTask)并且可预测时间的任务。

碰到的问题: 当打开echart的loading显示时,会导致此函数不可回调.




相关推荐

一、概述 将本来一次执行完毕的函数,分成几次异步进行执行,在保证功能和体验的同时降低浏览器性能开销。 二、实现 方式一 /** * * * @param {*}