前端笔记——大数据量浏览器卡顿优化思路

多任务数据量处理卡顿问题

任务分批次

为避免阻塞,可以将 长时间的单一任务 拆分成多个小任务并分批执行。这样可以在两次任务之间让浏览器有时间处理渲染、用户输入等操作。两种常见方法:

  1. setTimeout 方法
    • 使用 setTimeout 将任务分段,每段任务执行完毕后,通过定时器在稍后执行下一段。
    • 例如:计算一个大型数组的和时,将数组分块,每次计算一部分,延迟剩余部分。
  2. requestAnimationFrame 方法
    • 更适合与页面绘制相关的任务。
    • 它会在每次浏览器刷新帧(通常是 16.67 毫秒,60 FPS)时调用指定的回调函数。
    • 确保在每次任务之间,浏览器有机会完成页面渲染。

例子

// 用 setTimeout 拆分长任务
function performTaskInChunks(task, chunkSize) {let index = 0;function processChunk() {const end = Math.min(index + chunkSize, task.length);for (; index < end; index++) {// 执行任务的每一小部分console.log(`Processing: ${task[index]}`);}if (index < task.length) {setTimeout(processChunk, 0); // 等待主线程空闲后继续}}processChunk();
}// 用 requestAnimationFrame 分布任务
function performTaskWithRAF(task) {let index = 0;function processFrame() {if (index < task.length) {console.log(`Processing: ${task[index]}`);index++;requestAnimationFrame(processFrame); // 下一帧继续任务}}processFrame();
}// 示例数据
const largeTask = Array.from({ length: 1000 }, (_, i) => i);
performTaskInChunks(largeTask, 50);  // 用 setTimeout 分块执行
performTaskWithRAF(largeTask);       // 用 requestAnimationFrame 分块执行

Web Workers后台执行

Web Workers 是解决大数据量运算导致页面卡顿问题的强大工具。通过将计算任务移到后台线程,主线程可以专注于 UI 渲染和用户交互,显著提升页面的流畅度和用户体验。

Web Workers 的优势
  1. 多线程支持
    • JavaScript 主线程与 Web Worker 是两个独立的线程。
    • 主线程主要负责页面的 UI 渲染与事件处理,而 Web Worker 执行后台计算任务。
  2. 无阻塞主线程
    • Web Workers 的计算任务不会阻塞主线程,页面可以继续响应用户操作。
  3. 与主线程通信
    • 主线程和 Web Worker 通过消息传递的方式通信,使用 postMessageonmessage
  4. 安全隔离
    • Worker 线程运行在独立的作用域中,没有直接访问 DOM 或主线程变量的能力。
例子
  1. 创建一个 Worker 脚本文件

    • Worker 的代码需要放在一个单独的文件中。

    • 示例:worker.js

      // worker.js
      self.onmessage = function (e) {
      console.log(‘Worker received data:’, e.data);
      const result = heavyComputation(e.data);
      self.postMessage(result);
      };

      function heavyComputation(data) {
      // 模拟耗时计算
      let sum = 0;
      for (let i = 0; i < data.length; i++) {
      sum += data[i];
      }
      return sum;
      }

  2. 主线程与 Worker 通信

    • 在主线程中加载 Worker 文件并与其交互。

      // main.js
      const worker = new Worker(‘worker.js’);

      // 发送数据到 Worker
      worker.postMessage([1, 2, 3, 4, 5]);

      // 接收 Worker 的处理结果
      worker.onmessage = function (e) {
      console.log(‘Result from worker:’, e.data);
      };

      // 处理 Worker 的错误
      worker.onerror = function (error) {
      console.error(‘Worker error:’, error.message);
      };

  3. Worker 的终止

    • 如果 Worker 不再需要,可以终止它以释放资源。

      javascript

      复制代码
      worker.terminate();


Web Workers 的类型
  1. Dedicated Workers(专用 Worker)
    • 最常用的 Worker 类型。
    • 一个 Worker 仅供一个主线程使用。
  2. Shared Workers(共享 Worker)
    • 可被多个主线程共享。
    • 不同页面的同源脚本可以共享同一个 Worker。
  3. Service Workers
    • 主要用于控制网络请求和缓存,常见于 PWA 应用。
    • 不直接用于数据计算。

Web Workers 的局限性
  1. 无法访问 DOM
    • Worker 线程不能直接操作页面的 DOM。
    • 需要通过消息传递将结果交回主线程,由主线程更新 UI。
  2. 通信开销
    • 主线程和 Worker 之间的通信需要序列化和反序列化,处理复杂数据时可能会增加延迟。
  3. 浏览器支持
    • 大多数现代浏览器支持 Web Workers,但较老版本浏览器可能不支持。
  4. 额外的资源开销
    • Worker 是独立线程,占用额外的内存和计算资源。

优化示例:使用 Web Worker 处理大数据计算

以下是一个计算大数据数组总和的例子:

// worker.js
self.onmessage = function (e) {const data = e.data;let sum = 0;for (let i = 0; i < data.length; i++) {sum += data[i];}self.postMessage(sum);
};// main.js
const worker = new Worker('worker.js');
const largeData = Array.from({ length: 1e7 }, (_, i) => i); // 大量数据console.log('Sending data to worker...');
worker.postMessage(largeData);worker.onmessage = function (e) {console.log('Result from worker:', e.data); // 显示总和
};worker.onerror = function (error) {console.error('Worker error:', error);
};

利用空闲时间执行

requestIdleCallback 是一种浏览器 API,它允许开发者在浏览器的空闲时间执行非紧急的后台任务,而不会影响关键的渲染和用户交互操作。

这个 API 的主要目的是提高页面的流畅度和响应性,尤其是在需要执行较轻量的后台任务时,比如日志记录、数据预加载等。

优势

利用浏览器空闲时间

  • 只有在浏览器完成关键任务(如页面布局、渲染和事件处理)并且有空闲时间时,才会调用 requestIdleCallback 提供的回调函数。

带有超时机制

  • 如果任务不能在空闲时间内执行(如因为任务队列繁忙),可以通过超时设置确保任务最终被执行。

低优先级任务的好帮手

  • 专为非紧急任务设计,比如分析用户行为、缓存数据、预取资源等。
例子
// 定义任务队列
const tasks = Array.from({ length: 1000 }, (_, i) => () => console.log(`Task ${i}`));// 使用 requestIdleCallback 处理任务
function processTasks(deadline) {while (deadline.timeRemaining() > 0 && tasks.length > 0) {const task = tasks.shift(); // 从队列中取出任务task(); // 执行任务}// 如果还有剩余任务,继续请求空闲回调if (tasks.length > 0) {requestIdleCallback(processTasks);}
}// 开始处理任务
requestIdleCallback(processTasks);

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

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

相关文章

数智化转型是什么?

数智化转型是指企业通过数字化&#xff08;Digitalization&#xff09;和智能化&#xff08;Intelligentization&#xff09;技术的结合&#xff0c;推动业务流程、产品服务、组织管理的全面升级&#xff0c;从而提升效率、增强创新能力&#xff0c;并实现更高价值。相比传统的…

RIP实验

要求及分析 路由器上分别配置环回 连接路由器的线路网段为12.1.1.0/24、23.1.1.1.0/24 R1和R3连接的网络地址分别为192.168.1.0/24/192.168.2.0/24 整个网络使用RIP达到全网可达 配置 先配置路由器各接口ip和环回和pc ip网关掩码&#xff08;图略&#xff09; 进行 RI…

Oracle 中间件 Webcenter Portal服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…

macOS 配置 vscode 命令行启动

打开 vscode 使用 cmd shift p 组合快捷键&#xff0c;输入 install 点击 Install ‘code’ command in PATH Ref https://code.visualstudio.com/docs/setup/mac

3、交换机IP路由功能

每个用例前自己最好先画个图&#xff0c;不然容易绕晕&#xff0c;这篇文章写好久了&#xff0c;自己都觉得有点绕 一、直连路由 如果一个交换机与另一个交换机时直连着的并且他们用来连接的端口属于同网段&#xff0c;那么这种情况下他们就属于直连路由。不需要做任何配置便可…

分层架构 IM 系统之多媒体功能设计与实现

现在 IM 系统已经不仅限于文本消息的通讯了&#xff0c;多媒体数据占据越来越多的比重&#xff0c;比如&#xff1a;文件传输、语音通话、视频通话等。 在前面的文章&#xff08;《基于需求分析模型来结构化剖析 IM 系统》&#xff09;中我们分析过&#xff0c;“多媒体消息”…

0.gitlab ubuntu20.04 部署问题解决

安装依赖&#xff1a; ① sudo apt-get update 出现&#xff1a; 解决方式&#xff1a; 去 /etc/apt/sources.list.d 这个目录删除或注释对应的list文件 第三方软件的源一般都以list文件的方式放在 /etc/apt/sources.list.d 这个目录 重新运行sudo apt-get update 安装…

Next.js v15 - 服务器操作以及调用原理

约定 服务器操作是在服务器上执行的异步函数。它们可以在服务器组件和客户端组件中调用&#xff0c;用于处理 Next.js 应用程序中的表单提交和数据修改。 服务器操作可以通过 React 的 “use server” 指令定义。你可以将该指令放在 async 函数的顶部以将该函数标记为服务器操…

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

将业界领先的 SOLIDWORKS 3D CAD 解决方案连接到基于单一云端产品开发环境 3DEXPERIENCE 平台。您的团队、数据和流程全部连接到一个平台进行高效的协作工作&#xff0c;从而能快速的做出更好的决策。 目 录&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

【华为OD-E卷-开心消消乐 100分(python、java、c++、js、c)】

【华为OD-E卷-开心消消乐 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给定一个 N 行 M 列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为 0 或 1。矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

Bcrypt在线密码加密生成器

具体前往&#xff1a;在线Bcrypt加密工具--使用bcrypt及生成salt的迭代次数强度参数计算生成哈希(摘要)

Django 模板分割及多语言支持案例【需求文档】-->【实现方案】

Django 模板分割及多语言支持案例 这个案例旨在提供一个清晰的示范&#xff0c;展示如何将复杂的页面分解为多个可复用的模板组件&#xff0c;使代码更加模块化和易于管理。希望这篇案例文章对你有所帮助。 概述 在 Django 项目开发中&#xff0c;使用模板分割和多语言支持能…

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候&#xff0c;需要使用Scintilla编辑器&#xff0c;来高亮显示SQL语句&#xff0c;作为C/C领域最成熟稳定又小巧的开源编辑器&#xff0c;Scintilla提供了强大的功能&#xff0c;wxWidgets对Scintilla进行包装后的是控件类&#xff1a;…

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

介绍 Html 和 Html 5 的关系与区别

HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的标准标记语言&#xff0c;而 HTML5 是 HTML 的最新版本&#xff0c;包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML&#xff08;比如 HTML4&#xff09;有许多重要的改进和变化。以下是…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG&#xff08;Retrieval-augmented Generation&#xff0c;检索增强生成&#xff09;引擎。 主要作用&#xff1a; 让用户创建自有知识库&#xff0c;根据设定的参数对知识库中的文件进行切块处理&#xff0c;用户向大…

qwt 之 QwtPlotPicker

QwtPlotMarker 和 QwtPlotPicker 是 Qwt 库中用于增强 QwtPlot 功能的两个重要类。它们分别用于在图中添加标记和实现交互式的选择或拖动功能。 QwtPlotPicker 提供了交互式的选择工具&#xff0c;它允许用户通过鼠标点击或拖动来选择图表中的数据点或区域。这对于实现缩放、平…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…