前端如何优化页面中的大量任务

直奔主题,如果页面中有100万个任务需要执行,怎么保证页面不卡顿?

可以采取以下几种策略: 

  1. 任务分片执行

    • 利用requestIdleCallbackrequestAnimationFrame来分片执行任务。requestIdleCallback可以在浏览器空闲时执行任务,而requestAnimationFrame则可以在每次重绘前执行一个任务,这样可以保证在不影响页面渲染的情况下执行任务。
  2. Web Worker多线程处理

    • 使用Web Worker可以在独立线程中执行JavaScript代码,避免主线程阻塞,从而提高页面响应速度。
  3. 懒加载技术(Lazy Loading)

    • 对于不需要立即执行的任务,可以采用懒加载技术,即在需要时才加载和执行,减少初始加载的压力。
  4. 优化DOM操作

    • 减少DOM操作和重绘重排,例如通过缓存DOM属性值来减少回流和重绘。
  5. 简化DOM结构

    • 简化DOM结构可以减少渲染和操作的复杂度,提高性能。
  6. 函数式组件和变量本地化

    • 在Vue中,使用函数式组件可以减少渲染开销,同时将多次引用的变量保存起来,减少响应式对象的getter触发次数,提高性能。
  7. 子组件分割

    • 将耗时任务分割到子组件中,利用Vue的组件粒度更新机制,避免不必要的渲染和计算。
  8. 第三方插件按需引入

    • 按需引入第三方组件库,避免体积过大,减少不必要的加载和执行。
  9. 路由懒加载

    • 在单页应用中,使用路由懒加载可以减少首页加载时需要加载的内容,加快加载速度。
  10. 监控和定位卡顿

    • 使用Performance工具监控页面性能,定位耗时任务,并进行优化。

方案1:任务分片通常是指将一个大任务分解成多个小任务,并在浏览器的空闲时间里逐一执行这些小任务,以此来避免长时间的阻塞主线程。下面是一个使用requestIdleCallback实现任务分片的示例代码。这个例子中,我们将模拟一个需要处理100万个数字并将它们相加的任务。 

// 模拟一个包含100万个数字的数组
const numbers = new Array(1000000).fill(1).map((x, i) => i + 1);// 用于累加的变量
let sum = 0;// 任务分片执行的函数
function processNumbers(start, end, deadline) {// 检查是否还有剩余任务if (start < end) {// 计算当前空闲时间可以处理的任务数量const chunk = Math.min((end - start) / 2, 10000); // 每次处理10000个数字for (let i = start; i < start + chunk; i++) {sum += numbers[i];}// 递归调用,处理下一批任务requestIdleCallback((deadline) => {processNumbers(start + chunk, Math.min(start + chunk * 2, end), deadline);});}
}// 开始执行任务分片
requestIdleCallback((deadline) => {processNumbers(0, numbers.length, deadline);
});window.addEventListener('load', () => {console.log(`The sum of numbers is: ${sum}`);
});

这段代码首先创建了一个包含100万个数字的数组,然后定义了一个processNumbers函数,该函数接受三个参数:起始索引start、结束索引enddeadline对象。deadline对象包含了timeRemaining()方法,该方法返回浏览器在当前帧剩余的时间,单位为毫秒。

processNumbers函数中,计算出当前空闲时间可以处理的任务数量,并在数组的指定范围内进行累加操作。然后,我们递归地调用requestIdleCallback来处理下一批任务,直到所有任务都被处理完毕。

最后,在页面加载完成后在控制台输出累加的结果。

注意,这个代码只是一个示例,实际应用中可能需要根据具体任务进行调整。此外,由于requestIdleCallback是异步的,所以最终的累加结果sum可能不会立即可用,需要在所有任务完成后才能获取。

 方案2:使用Web Worker可以实现多线程处理任务,这样可以避免主线程阻塞。下面是一个使用Web Worker处理100万个数字求和的示例代码。

 主线程代码(HTML文件)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>const worker = new Worker("worker.js");//监听worker消息worker.onmessage = function (e) {console.log(e.data);};//启动worker任务worker.postMessage({type: "start",numbers: new Array(1000000).fill(1).map((x, i) => i + 1),});</script></body>
</html>

Web Worker代码(worker.js)

//接收主线程消息
self.onmessage = function (e) {if (e.data.type === "start") {const numbers = e.data.numbers;const sum = calculateSum(numbers);postMessage(sum);}
};
//计算数组中所有数字的和
function calculateSum(numbers) {return numbers.reduce((acc, curr) => acc + curr, 0);
}

说明

  1. 主线程代码

    • 创建一个Web Worker实例,指向worker.js文件。
    • 监听Web Worker的消息,当收到消息时,在控制台输出结果。
    • 向Web Worker发送一个包含100万个数字的数组,并启动求和任务。
  2. Web Worker代码

    • 监听主线程发送的消息,当收到类型为start的消息时,开始处理任务。
    • 定义一个calculateSum函数,使用reduce方法计算数组中所有数字的和。
    • 将计算结果通过postMessage发送回主线程。

运行步骤

  1. 将主线程代码保存为index.html文件。
  2. 将Web Worker代码保存为worker.js文件,并确保与index.html文件在同一目录下。
  3. 在浏览器中打开index.html文件,查看控制台输出的结果。

通过这种方式,我们可以利用Web Worker在后台线程中处理耗时的任务,避免阻塞主线程,提高页面的响应性能。

其他方案就不一一举例了,有兴趣的可以自己了解一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递&#xff0c;交给路由器后 可不可以做到直接发送给目的主机呢&#xff1f;…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中&#xff0c;我们希望实现一个简单的游戏系统&#xff0c;其中玩家可以通过击中目标来获得分数&#xff0c;同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示&#xff0c;以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍&#xff1a;2.bkcrack功能&#xff1a;3.bkcrack安装&#xff1a;Linux-Kali下&#xff1a;测试&#xff1a;Windows下安装&#xff1a; 4.bkcrack的使用方法&#xff1a;4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下&#xff1a; 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施&#xff0c;传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始&#xff0c;2011年正式成立北京兰亭妙微科技有限公司&#xff0c;主创清华团队&#xff0c;专注软件和互联网ui设计开发&#xff0c;擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI&#xff0c;一直在学习进步。交通行业UE UI解…

2-Ubuntu/Windows系统启动盘制作

学习目标&#xff1a; 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器&#xff0c;确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器&#xff0c;理解启动盘的使用场景和注意事项&#xff0c;…

Java项目管理与SSM框架介绍

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下每…

CGAL生成简单形状

三角形 四边形 立方体 六面体 棱柱 锥体 二十面体 网格 Polyhedron _mesh;/**************三角形************/CGAL::make_triangle(K::Point_3(100, 0, 0), K::Point_3(0, 100, 0), K::Point_3(0, 0, 0), _mesh);CGAL::IO::write_polygon_mesh("F:/WORK/STL/triangle.stl…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分&#xff0c;图形显示有所变化&#xff0c;美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

提高后端接口性能的方法

个人bibilailai&#xff08;不喜请跳过&#xff09;&#xff1a;前几天参加的部门技术分享会&#xff0c;同事分享了一个内容为“提高接口性能的常见技巧”&#xff0c;个人觉得很有用&#xff0c;所以想在这里分享给大家&#xff0c;希望对刚入职场不久的兄弟姐妹们有所帮助。…

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API&#xff0c;通过controller来显示的生成路由&#xff0c;这里我们讲解下如何不通过controller&#xff0c;构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境&#xff1a; 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后&#xff0c;可以尝试使用 su 切换到 tang 用户&#xff0c;确保该用户可以正常使用&#…

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中&#xff0c;各种先进的技术系统正发挥着越来越重要的作用。其中&#xff0c;NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关&#xff0c;不仅能够实现视频数据的采集、编码和存储&#xff0c;还能与其他智慧城市系统进行深度集成&#xff0c;共同推…

【NOIP提高组】虫食算

【NOIP提高组】虫食算 C语言C &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 所谓虫食算&#xff0c;就是原先的算式中有一部分被虫子啃掉了&#xff0c;需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子&#xff1a; 43#98…

Lobe Chat:你的私人AI助理

有一天&#xff0c;一位程序员对他的朋友说&#xff1a;‘我希望有一个助手&#xff0c;能像我一样聪明&#xff0c;但不会吃饭、喝水和请病假。’朋友回答说&#xff1a;‘这很简单&#xff0c;你只需要一个智能聊天助手&#xff01;’于是&#xff0c;程序员便找到了 LobeCha…

【CAPL实战】LIN帧干扰的脚本实现

文章目录 1、帧头干扰响应linDisturbRespWithHeader1.1 函数功能1.2 参数说明1.3 代码实例1.4 执行结果 2、帧头干扰帧头linDisturbHeaderWithHeader2.1 函数功能2.2 参数说明2.3 代码实例 1、帧头干扰响应linDisturbRespWithHeader 1.1 函数功能 使用一个新的header帧头来干…

华为HarmonyOS打造开放、合规的广告生态 - 激励广告

场景介绍 激励广告是一种全屏幕的视频广告&#xff0c;用户可以选择点击观看&#xff0c;以换取相应奖励。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告&#xff0c;通过AdRequestPar…