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

深入理解 requestIdleCallback 与大数据加载优化

使用 `requestIdleCallback` 优化大批量 DOM 操作 —— 以加载 100 万条数据为例

在前端开发中,如果你尝试在短时间内往 DOM 中添加大量元素,比如一次性插入 100 万条数据,页面极有可能卡顿甚至直接崩溃。为了解决这一性能问题,我们可以借助浏览器提供的 `requestIdleCallback` 方法,利用浏览器空闲时间进行渐进式渲染。

本文将介绍 `requestIdleCallback` 的原理,并通过一个加载百万数据的例子,展示如何优化加载逻辑。我们会进行优化前后的代码对比,并最终输出完整的优化后代码。


🧠 `requestIdleCallback` 是什么?

`requestIdleCallback` 是浏览器提供的一种任务调度 API,它允许我们在主线程空闲时执行低优先级任务,从而避免阻塞用户交互。

基本用法:

requestIdleCallback(callback, { timeout });
  • `callback(deadline)`:将在浏览器空闲时执行的回调函数。
  • `deadline.timeRemaining()`:表示当前空闲周期内的剩余可用毫秒数。
  • `timeout`(可选):指定在多少毫秒内必须执行任务,即使浏览器一直不空闲。

📌 应用场景:

  • 批量数据渲染
  • 懒加载组件
  • 异步加载脚本
  • 用户不感知的任务(如埋点、缓存处理等)

📉 性能问题分析(未优化)

假设我们要一次性渲染 100 万条数据,最直观的做法就是通过 `for` 循环和 DOM 操作一次性插入:

开始渲染

function startRender() {for (let i = 0; i < 1000000; i++) {const div = document.createElement('div');div.textContent = \`第\${i + 1}条数据\`;document.body.appendChild(div);}
}

⚠️ 问题:

  • 页面会严重卡顿,甚至浏览器崩溃。
  • 用户在等待过程中无法滚动、点击或交互。
  • 非渐进式渲染,缺乏灵活性。

✅ 使用 `requestIdleCallback` 优化后的方案

我们将渲染任务分批处理,并在每次主线程空闲时执行下一批操作。这样浏览器可以在用户交互和渲染之间进行调度,避免“线程阻塞”。

优化思路:

  • 每批最多渲染 100 条数据。
  • 使用 `document.createDocumentFragment` 减少 DOM 操作开销。
  • 使用 `requestIdleCallback` 判断是否还有空闲时间继续渲染。

🔍 优化前后对比图示(伪图)

未优化:一次性插入100w条
┌────┬────┬────┬────┬────┬────┐
│████████████ 卡顿 ███████████│
└────┴────┴────┴────┴────┴────┘

优化后:空闲时分批插入100条
┌█───█───█───█───█───█───█───█┐
│ 渐进渲染中… 用户可交互 │
└█───█───█───█───█───█───█───█┘


🧪 完整优化后代码示例

100W条数据加载-优化版 开始智能加载
<script>const TOTAL_ITEMS = 1000000;let loadedCount = 0;// 创建文档片段优化DOM操作function createBatch() {const fragment = document.createDocumentFragment();const batchSize = Math.min(100, TOTAL_ITEMS - loadedCount);for(let i=0; i<batchSize; i++) {const div = document.createElement('div');div.textContent = \`第\${++loadedCount}条数据\`;fragment.appendChild(div);}document.body.appendChild(fragment);return loadedCount < TOTAL_ITEMS;}// 使用requestIdleCallback调度function scheduleLoading() {requestIdleCallback((deadline) => {const startTime = performance.now();let hasMore = true;while (deadline.timeRemaining() > 0 && hasMore &&performance.now() - startTime < 50 // 防止单次执行过久) {hasMore = createBatch();}if(hasMore) {scheduleLoading();} else {console.log('所有数据加载完成');}}, { timeout: 1000 });}function startLoading() {loadedCount = 0;scheduleLoading();}
</script>

📌 总结

  • `requestIdleCallback` 提供了一种非常适合执行非关键任务的机制。
  • 对于大批量 DOM 操作,我们应避免一次性操作 DOM,采用分批 + 空闲加载策略。
  • 在用户体验和页面性能之间找到平衡,是现代前端优化的核心。

✨ 如果你觉得这篇文章对你有帮助,不妨点个 免费的赞 或留言交流哦!

相关文章:

深入理解 requestIdleCallback 与大数据加载优化

使用 requestIdleCallback 优化大批量 DOM 操作 —— 以加载 100 万条数据为例 在前端开发中&#xff0c;如果你尝试在短时间内往 DOM 中添加大量元素&#xff0c;比如一次性插入 100 万条数据&#xff0c;页面极有可能卡顿甚至直接崩溃。为了解决这一性能问题&#xff0c;我们…...

【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算

索引运算与NULL值问题详解 不能参与的"部分索引运算"指什么&#xff1f; 这里的"部分索引运算"指的是索引列在某些特定操作或条件下无法被MySQL优化器有效利用的情况&#xff0c;特别是当字段包含NULL值时。主要包括以下几种情况&#xff1a; 1. 比较运…...

STM32 F103 标准库CH452A 4线 数码管驱动芯片显示数码管

公司生产测试需要统一去检查这版CH452A的好坏&#xff0c;网上找了一下没有现成可以用的4线CH452A的驱动程序&#xff0c;所以直接就肝了移植官方的51程序到stm32上面去&#xff0c;亲测可以使用&#xff01;&#xff01; 文末有代码 测试图片&#xff1a; 如你所见我测了一堆…...

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 组件生命周期 父子组件生命周期顺序&#xff1a; 创建时&#xff1a; 父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted 更新时&#xff1a; 父 beforeUpdate → 子组件更新 → 父 updated。 销毁时&#xff1a; 父 beforeDestroy…...

期货数据API对接实战指南

一、期货数据接口概述 StockTV提供全球主要期货市场的实时行情与历史数据接口&#xff0c;覆盖以下品种&#xff1a; 商品期货&#xff1a;原油、黄金、白银、铜、天然气、农产品等金融期货&#xff1a;股指期货、国债期货特色品种&#xff1a;马棕油、铁矿石等区域特色期货 …...

Flask(2): 在windows系统上部署项目2

4 创建并激活虚拟环境 虚拟环境非常有用&#xff0c;可以将多个项目隔离开来。根据我看的教程&#xff0c;貌似以前有多种创建方式&#xff0c;后来官方自带了。目前我就用官方的方式。 4.1 创建虚拟环境 创建部署文件夹(假如目录为d:\project01)&#xff0c;在命令提示…...

Java 中 Synchronized如何保证可见性

在 Java 多线程编程中&#xff0c;可见性问题是指一个线程对共享变量的修改&#xff0c;其他线程能够立即看到。如果没有适当的同步机制&#xff0c;可能会出现线程 A 修改了共享变量的值&#xff0c;但线程 B 仍然使用的是修改前的值&#xff0c;导致程序出现错误。synchroniz…...

33、Python单元测试与pytest框架从入门到精通

Python单元测试与pytest框架从入门到精通 引言 在软件开发领域&#xff0c;完善的测试体系是保证代码质量的生命线。本文将深入探讨Python单元测试的核心技术&#xff0c;从标准库unittest到功能强大的pytest框架&#xff0c;通过20个代码示例展示测试驱动开发&#xff08;TD…...

mvccc

. MVCC (多版本并发控制) 概念&#xff1a; MVCC 是一种并发控制技术&#xff0c;用于在数据库中实现并发事务的读写操作&#xff0c;同时保证事务的隔离性。MVCC 的核心思想是&#xff0c;在数据库中维护数据的多个版本&#xff0c;每个事务在读取数据时&#xff0c;读取的是…...

ONLYOFFICE深度解锁系列.2-Excel 跨文件数据整合实战指南-可道云的另一个严重bug

一、为什么需要跨文件数据整合&#xff1f; 在企业办公和团队协作中&#xff0c;数据往往分散在不同文件中。传统复制粘贴方式存在三大痛点&#xff1a; 版本混乱&#xff1a;源数据更新后需反复同步 错误风险&#xff1a;手动操作易造成数据偏差 效率低下&#xff1a;多文件…...

如何对Flutter应用程序进行单元测试

Flutter单元测试完全指南&#xff1a;从基础到高级实践 面试求职资源 面试试题小程序&#xff1a;涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、计算机网络知识、Jmeter、HR面试等内…...

多模态大语言模型arxiv论文略读(二十四)

VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文标题&#xff1a;VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文作者&#xff1a;Jitesh Jain, Jianwei Yang, Humphrey Shi ➡️ 研究机构: SHI Labs…...

前端根据后端返回的excel二进制文件流进行导出下载

需求 在vue2中&#xff0c;后端接口返回一个文件流&#xff0c;前端实现excel文件流导出下载功能。 解决方案 利用axios请求后端接口&#xff0c;把后端返回的blob文件流转为一个临时在线url&#xff0c;然后利用a标签实现导出下载功能。 具体实现步骤 1、封装axios请求拦…...

代码随想录刷题|Day20(组合总数,组合总数2、分割回文串)

回溯算法 Part02 组合总数 力扣题目链接 代码随想录链接 视频讲解 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你…...

【NLP 64、基于LLM的垂直领域【特定领域】问答方案】

找不到生活的答案&#xff0c;就先找自己 —— 25.4.17 一、垂直领域问答 1.特点 ① 问答内容通常不存在于通用语料 ② 回答内容对准确性要求较高&#xff0c;召回要求较低&#xff08;可以转人工处理&#xff09; ③ 拓展性和可控性&#xff08;可以根据需求&#xff0c;增、…...

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题&#xff1a;难道使用fixture 会不会影响用例独立 ✅ 简单回答&#xff1a; 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的&#xff0c;那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&#xff1f;…...

嵌入式物联网开发(二)如何创建N32G45的Keil工程并实现串口打印

如何创建N32G45的Keil工程并实现串口打印 打开Keil IDE, 点击菜单栏Project按钮&#xff0c;选择Create New Project&#xff0c;并在弹出的对话框中选择工程目录&#xff0c;并取一个名字&#xff0c;这里取名bootloader:在弹出的对话框中选择我们的对应的芯片型号: N32G452R…...

基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南

前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...

Unity入门笔记(缘更)

内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装&#xff1a; https://unity.cn 2.基础知识 1.层级(Layer…...

SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构

目录 2.大模型开发 2.1 模型部署 2.1.1 云服务-开放大模型API 2.1.2 本地部署 搜索模型 运行大模型 2.2 调用大模型 接口说明 提示词角色 ​编辑 会话记忆问题 2.3 大模型应用开发架构 2.3.1 技术架构 纯Prompt模式 FunctionCalling RAG检索增强 Fine-tuning …...

Prometheus thanos架构

Thanos 是一个用于扩展 Prometheus 的高可用性和长期存储的解决方案。它通过整合多个 Prometheus 实例&#xff0c;提供了全局查询、长期存储、以及高可用性的能力。Thanos 的架构主要由以下几个核心组件组成&#xff1a; 1. Sidecar 功能&#xff1a; Sidecar 是与每个 Prom…...

嵌入式软件--stm32 DAY 1

一、STM32概述 1.ARM内核 ARM是一家英国公司。后被日本软银收购。 RISC&#xff08;精简指令集计算机&#xff09; 产品&#xff1a;ARM架构处理器&#xff0c;相关外围组件的电路设计方案。 怎么卖 :知识产权授权 只卖方案不卖具体产品 买了如何用 拿到ARM的方案 设计产…...

【家政平台开发(53)】解锁家政平台高可用秘籍:负载均衡与架构部署

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

Kotlin整数相除精度损失roundToInt

Kotlin整数相除精度损失roundToInt import kotlin.math.roundToIntfun main() {val a 0.0fval delta 0.1ffor (i in 0..10) {val r a i * deltaprintln("float${r} toInt${r.toInt()} (0.5 toInt)${(r 0.5).toInt()} round${Math.round(r)} roundToInt${r.roundToInt…...

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext----RPC源代码分析

RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext 第一部分&#xff1a; 1: kd> kc # 00 RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OSF…...

visual studio 2022更改项目名称,灾难性故障(异常来自HRESULT)

系列文章目录 文章目录 系列文章目录前言一、具体步骤二、遇到的问题 前言 在visual studio 2022中&#xff0c;有时候遇到一个很大的工程&#xff0c;我们只是想改写工程名称&#xff0c;而又不想重建项目&#xff0c;如何实现呢&#xff1f; 比如将 Visual Studio 中的 Qt 工…...

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...

【KWDB创作者计划】_KwDB2.2.0深度实践:从存储引擎到物联网场景的多模数据库实战

简介 本文基于KwDB2.2.0最新版本&#xff0c;通过存储引擎原理、跨模计算实战和物联网场景落地三个维度&#xff0c;结合代码示例与实操案例&#xff0c;系统解析KwDB的分布式多模能力。从零搭建物联网数据平台&#xff0c;探索多模数据融合的创新价值&#xff0c;助你掌握新一…...

linux 学习 2.vim学习指南

vim vim是一款功能及其强大的编辑器&#xff0c;我们需要掌握其基本的操作才能数量的使用他 如果你想要功能更加丰富的vim获得代码补全之类的复杂功能&#xff0c;强烈建议你安装一下vimplus&#xff0c;可以参考这里vimplus 官方教程 建议学习的时候直接跟着教程一步步操作…...

深度学习在自动驾驶车辆车道检测中的应用

引言 自动驾驶技术是人工智能领域的一个前沿方向&#xff0c;而车道检测是实现自动驾驶的关键技术之一。通过识别和跟踪车道线&#xff0c;自动驾驶车辆能够保持在车道内行驶&#xff0c;提高行车安全。本文将详细介绍如何使用深度学习技术进行车道检测&#xff0c;并提供一个…...

深度学习-Torch框架-2

八、自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。 1. 基础概念 张量 Torch中一切皆…...

FlinkCDC初始化时报错“IllegalArgumentException: Unexpected input: “异常定位与原理分析

本篇是纯技术文章,是排查线上问题的真实记录。这个异常我在网上没搜到相同案例,所以特此记录下,方便后期回顾。 一、背景 利用FlinkCDC3.0动态监听数据库Schema变更的能力开发了一个生产数据库DDL语句变更审计告警的服务,这两天突然发现服务一直报错,经过4个小时的排查,…...

从代码学习深度学习 - Transformer PyTorch 版

文章目录 前言1. 位置编码(Positional Encoding)2. 多头注意力机制(Multi-Head Attention)3. 前馈网络与残差连接(Position-Wise FFN & AddNorm)3.1 基于位置的前馈网络(PositionWiseFFN)3.2 残差连接和层规范化(AddNorm)4. 编码器(Encoder)4.1 编码器块(Enco…...

多模态大语言模型arxiv论文略读(二十五)

ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文标题&#xff1a;ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文作者&#xff1a;Xiaoqi Li, Mingxu Zhang…...

LVS+Keepalived+dns高可用项目架构

一、搭建DNS服务 配置主服务器 1.修改核心配置文件 [rootDNS-master ~]# vim /etc/named.conf options { listen-on port 53 { 192.168.111.107;192.168.111.100; }; directory "/var/named"; }; zone "haha.com" IN { ty…...

C#日志辅助类(Log4Net)实现

一、Log4Net类库安装 在解决方案中项目上右键单击,选择“管理NuGet程序包”,在浏览窗口的搜索框输入log4net进行搜索,安装搜索出的第一项,如下图。 二、辅助类实现(Log4NetHelper) using log4net.Appender; using log4net.Config; using log4net.Layout; using log4net…...

【FFmpeg从入门到精通】第二章-FFmpeg工具使用基础

1 ffmpeg常用命令 ffmpeg在做音视频编解码时非常方便&#xff0c;所以在很多场景下转码使用的是ffmpeg&#xff0c;通过 ffmpeg --help可以看到 ffmpeg 常见的命令大概分为6个部分&#xff0c;具体如下。 ffmpeg信息查询部分公共操作参数部分文件主要操作参数部分视频操作参数…...

论文阅读:2022 ACL TruthfulQA: Measuring How Models Mimic Human Falsehoods

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 TruthfulQA: Measuring How Models Mimic Human Falsehoods https://arxiv.org/pdf/2109.07958 https://www.doubao.com/chat/3130551217163266 https://github.com/sylin…...

基于C++(MFC)实现的文件管理系统

基于 MFC 的文件管理系统 第一章 题目解读与要求分析 1 实习题目 实现一个文件系统。 2 功能要求 界面上显示树形目录结构 a&#xff09;根节点是“我的电脑” b&#xff09;“我的电脑”下有几个盘符&#xff08;C、D、E 等&#xff09;就有几个子节点&#xff0c;递归…...

selenium 实现模拟登录中的滑块验证功能

用python在做数据采集过程中&#xff0c;经常需要用到模拟登录&#xff0c;经常遇到各种图片、文字甚至短信等验证&#xff0c;如果能通过脚本的方便实现验证&#xff0c;就可以自动帮我更高效地收集数据。Selenium 是一个开源的 Web 自动化测试工具&#xff0c;最初是为网站自…...

Oracle 19c部署之数据库软件安装(二)

在完成了Oracle Linux 9的初始化配置之后&#xff0c;我们准备安装Oracle 19c数据库软件。 Oracle数据库支持两种主要的安装方式&#xff1a;图形化安装和静默安装。这两种方法各有优缺点&#xff0c;选择哪种取决于你的具体需求、环境配置以及个人偏好。 图形化安装 图形化安…...

Paramiko 使用教程

目录 简介安装 Paramiko连接到远程服务器执行远程命令文件传输示例 简介 Paramiko 是一个基于 Python 的 SSH 客户端库&#xff0c;它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法&#xff0c;包括连接到远程服务器、执行命令、文件传输…...

从EOF到REOF:如何用旋转经验正交函数提升时空数据分析精度?

目录 1. 基本概念与原理2. 应用场景3. 与传统EOF的区别4. 技术实现5. 其他领域中的“REOF”参考资料 REOF 的输入是多个地区在不同时间的气候数据&#xff08;如温度或降雨量&#xff09;&#xff0c;它的作用是通过旋转计算找出这些数据中最主要的变化规律&#xff0c;输出则是…...

VS-Code创建Vue3项目

1 创建工程文件 创建一个做工程项目的文件夹 如&#xff1a;h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称&#xff1a;自已输入 回车 可以按键盘 a (全选) 回车&#xff1a; Playwright…...

JESD204B接收器核心实现和系统级关键细节

目录 1.通道偏移 2.弹性缓冲器的实现 3.接受延迟 4.RX端到端延迟 5.计算端到端延迟 6.实现可重复的延迟 1.通道偏移 JESD204B接收器核心已经过验证,其功能具有高达8个字节的通道到通道偏斜。 2.弹性缓冲器的实现 在JESD204B设备中,接收通道对齐弹性缓冲区是在分布式…...

NLP高频面试题(四十七)——探讨Transformer中的注意力机制:MHA、MQA与GQA

MHA、MQA和GQA基本概念与区别 1. 多头注意力(MHA) 多头注意力(Multi-Head Attention,MHA)通过多个独立的注意力头同时处理信息,每个头有各自的键(Key)、查询(Query)和值(Value)。这种机制允许模型并行关注不同的子空间上下文信息,捕捉复杂的交互关系。然而,MHA…...

k230学习笔记-疑难点(1)

1.出现boot failed with exit code 19: 需要将k230开发板的btoot0拨到ON 2.出现boot failed with exit code 13: 说明k230开发板的固件烧录已经丢失&#xff0c;需要重新烧录 *** 注意重新烧录时需要将btoot0重新拨到OFF&#xff0c;才会弹出加载固件需要的通用串行总线&…...

JavaScript性能优化实战:让你的Web应用飞起来

JavaScript性能优化实战&#xff1a;让你的Web应用飞起来 在前端开发中&#xff0c;JavaScript性能优化是提升用户体验的关键。一个性能良好的应用不仅能吸引用户&#xff0c;还能提高转化率和用户留存率。今天&#xff0c;我们就来深入探讨JavaScript性能优化的实战技巧&…...

金融数据库转型实战读后感

荣幸收到老友太保科技有限公司数智研究院首席专家林春的签名赠书。 这是国内第一本关于OceanBase数据库实际替换过程总结的的实战书。打个比方可以说是从战场上下来分享战斗经验。读后感受颇深。我在这里讲讲我的感受。 第三章中提到的应用改造如何降本。应用改造是国产化替换…...

血脂代谢通路(医学-计算机系统对照方式)

血脂代谢通路(医学-计算机系统对照方式) 整合所有类比&#xff0c;用医学-计算机系统对照的方式完整描述血脂代谢通路&#xff0c;采用分步骤的对照结构&#xff1a; 1. 食物摄入&#xff08;数据输入层&#xff09; # 医学术语: 膳食脂肪摄入 → 计算机类比: 原始数据输入 …...