前端筆記——大數據量瀏覽器卡頓優化思路

多任務數據量處理卡頓問題

任務分批次

為避免阻塞,可以將 長時間的單一任務 拆分成多個小任務并分批執行。這樣可以在兩次任務之間讓瀏覽器有時間處理渲染、用戶輸入等操作。兩種常見方法:

  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.pswp.cn/web/63698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63698.shtml
英文地址,請注明出處:http://en.pswp.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…