本文收录于 GitHub 日问: DailyQuestion,内含大厂内推机会、面经大全及若干面试题,每天学习五分钟,一年进入大厂中。可在右下角打开原文查看
- 大厂面经大全: https://q.shanyue.tech/interview.html
- 大厂内推大全: https://q.shanyue.tech/infer/
requestIdleCallback
维护一个队列,将在浏览器空闲时间内执行。它属于 Background Tasks API,你可以使用 setTimeout
来模拟实现
window.requestIdleCallback = window.requestIdleCallback || function(handler) {
let startTime = Date.now();
return setTimeout(function() {
handler({
didTimeout: false,
timeRemaining: function() {
return Math.max(0, 50.0 - (Date.now() - startTime));
}
});
}, 1);
}
以上实现过于复杂以及细节化,也可以像 swr 一样做一个简单的模拟实现,以下代码见 https://github.com/vercel/swr/blob/8670be8072b0c223bc1c040deccd2e69e8978aad/src/use-swr.ts#L33
const rIC = window['requestIdleCallback'] || (f => setTimeout(f, 1))
在 rIC
中执行任务时需要注意以下几点:
React 的时间分片便是基于类似 rIC
而实现,然而因为 rIC
的兼容性及 50ms 流畅问题,React 自制了一个实现: scheduler
use-swr 中进行资源的 revalidate
时,也是通过 rIC
来提高性能
强烈推荐 MDN 与 w3c 上的两篇介绍
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8