当前位置: 首页 > news >正文

WHAT - requestIdleCallback 介绍

文章目录

  • 一、requestIdleCallback 是什么
  • 二、基本用法
  • 三、简单示例:避免主线程长时间阻塞
  • 四、注意事项与兼容性
    • 1. 兼容性
    • 2. 超时兜底
  • 五、与其他异步方式的区别
  • 六、在 React 中的实际用法示例
  • 总结

这是一个非常实用的性能优化 API.


一、requestIdleCallback 是什么

简单来说:

requestIdleCallback 允许你把不紧急的任务推迟到浏览器“空闲”时再执行,从而避免阻塞主线程,提升交互流畅度。

它的作用就是:

  • 让渲染、交互优先执行
  • 把一些“后台逻辑”放到主线程空闲的时候再慢慢处理
  • 避免长任务导致 UI 卡顿、FID(First Input Delay)升高

二、基本用法

requestIdleCallback((deadline) => {while (deadline.timeRemaining() > 0 && tasks.length > 0) {const task = tasks.shift();doWork(task);}
});
  • deadline.timeRemaining():当前帧剩余的空闲时间(ms),浏览器会动态计算
  • tasks:你想在空闲时执行的任务队列

浏览器会在:

  • 一帧渲染结束之后
  • 事件循环空闲时

调用你注册的回调。


三、简单示例:避免主线程长时间阻塞

假设你原本这样写👇

// ❌ 这样会一次性占用主线程
const data = Array.from({ length: 100000 }, (_, i) => i);
data.forEach((item) => heavyCompute(item));

页面可能卡顿 200ms+。

改用 requestIdleCallback 分片执行

const data = Array.from({ length: 100000 }, (_, i) => i);function processChunk(deadline: IdleDeadline) {while (deadline.timeRemaining() > 0 && data.length > 0) {const item = data.pop();heavyCompute(item);}if (data.length > 0) {requestIdleCallback(processChunk);}
}requestIdleCallback(processChunk);

优势:

  • 主线程不会被一次性大循环阻塞
  • 页面仍然流畅

四、注意事项与兼容性

1. 兼容性

  • 现代浏览器大多支持
  • Safari 较老版本不支持(但可以用 polyfill)

推荐用 polyfill:

npm install requestidlecallback
import 'requestidlecallback';

2. 超时兜底

你也可以指定超时时间,防止任务永远不执行

requestIdleCallback(processChunk, { timeout: 2000 });

如果 2 秒内一直没有空闲时间,浏览器也会强制执行。


五、与其他异步方式的区别

方式说明适用场景
setTimeout下一次事件循环执行不保证不阻塞渲染
requestAnimationFrame下一帧渲染前执行(用于动画)UI 动画相关
requestIdleCallback浏览器空闲时执行非关键任务、后台任务
Web Worker另起线程执行大计算量,和主线程隔离

requestIdleCallback 非常适合:

  • 大量数据的分片处理
  • 预加载资源
  • 非关键性埋点/统计逻辑
  • 延迟加载模块

六、在 React 中的实际用法示例

比如在一个 React 组件中渲染大量数据,你可以这样做

import { useEffect } from "react";function HeavyComponent() {useEffect(() => {const tasks = Array.from({ length: 100000 }, (_, i) => i);const processChunk = (deadline: IdleDeadline) => {while (deadline.timeRemaining() > 0 && tasks.length > 0) {const item = tasks.pop();heavyCompute(item);}if (tasks.length > 0) requestIdleCallback(processChunk);};requestIdleCallback(processChunk);}, []);return <div>页面不会被卡住了 🚀</div>;
}

这样:

  • 页面渲染不会因为任务量大而卡死
  • 你依然能在“后台”完成任务

总结

特性requestIdleCallback 的价值
延迟执行非关键任务减少主线程阻塞,改善交互体验
提升性能指标FID、TTI、CLS 改善
易于分片处理大任务比一次性循环或 setTimeout 更优
可 polyfill不影响兼容性

实战建议

  • 把非首屏必要逻辑(数据预处理、统计、预加载)迁移到 requestIdleCallback
  • 配合 Web Worker 使用效果更佳(Worker 处理大任务,Idle 处理非关键小任务)
http://www.dtcms.com/a/465545.html

相关文章:

  • ShadowDiffusion算法解决阴影去除问题
  • AWS CLI自动删除资源脚本
  • 嵌入式学习linux内核驱动6——dts和GPIO子系统
  • 企业网站推广哪家公司好揭阳做网站公司
  • 宿州做网站的公司有哪些广州自助公司建网站
  • 星巴克APP逆向
  • [Dify] 知识库在 Agent 模式中的应用策略:让智能体更懂知识、更懂业务
  • 精通C语言(4.四种动态内存有关函数)
  • 【实用工具】使用Python语言制作RSS阅读器
  • 动态规划 - 二维费用的背包问题、似包非包、卡特兰数
  • JAVA·方法的使用
  • 做rap的网站国内做网站网站风险大吗
  • 【代码随想录算法训练营——Day33】动态规划——62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树
  • 基于单片机的元胞自动机仿真系统设计
  • 星座运势网站技术解析:从零打造现代化Web应用
  • Asp.net core 跨域配置
  • Java学习之旅第二季-18:转型
  • 建筑物孪生模型:重构空间数字化格局,赋能智慧城市
  • Claude code、codex、gemini cli开启全自动(yolo)模式,无需审批
  • wordpress账号和站内网建网站需要注册公司吗
  • 24软件测试计划主要工作和确定测试资源
  • 【每天一个知识点】[特殊字符] 大数据的定义及单位
  • ICT 数字测试原理 17 - -VCL中的预处理
  • 领码方案|微服务与SOA的世纪对话(7):运营降本增效——智能架构时代的成本与服务管理
  • YOLO v1:目标检测领域的单阶段革命之作
  • 河北建设厅八大员报名网站中国网库网站介绍
  • 基于RuoYi框架+Mysql的汽车进销存后台管理系统
  • 网站底部导航制作制作视频特效
  • 南宁网站建设索王道下拉建设网站的法律声明
  • Java中Mock的写法