前端性能優化:所有權轉移

前端性能優化:所有權轉移

在學習rust過程中,學到了所有權概念,于是便聯想到了前端,前端是否有相關內容,于是進行了一些實驗,并整理了這些內容。
所有權轉移(Transfer of Ownership) 是前端開發中通過 postMessage API 高效傳遞數據的機制,將可轉移對象(Transferable Objects)的控制權從一個上下文(如主線程、iframe、Web Worker)移交到另一個上下文,避免數據復制的性能開銷。本文簡要介紹其應用場景、可轉移數據類型及兼容性,分為高兼容性和兼容性有限兩部分,重點更新高兼容性場景以包含 Canvas 位圖數據情況。

什么是所有權轉移?

所有權轉移通過 postMessagetransfer 參數,將對象所有權移交到目標上下文,原始上下文無法再訪問該對象。優點包括:

  • 性能:避免復制大型數據。
  • 獨占性:確保單一上下文控制資源。
  • 內存:釋放原始上下文內存。

調用格式:

target.postMessage(message, targetOrigin, [transfer]);

高兼容性:廣泛支持的場景與數據類型

以下場景和數據類型在現代瀏覽器(Chrome 4+、Firefox 6+、Safari 5.1+、Edge 12+)及 WebView(iOS 8+、Android 4.4+)中兼容性高,適合生產環境。

應用場景

  1. 窗口間通信

    • 描述:主窗口與 iframe 或新窗口通信。

    • 用例:傳遞二進制數據或建立通信通道。

    • 兼容性:Chrome 4+, Firefox 6+, Safari 5.1+, Edge 12+, iOS 8+, Android 4.4+.

    • 示例

      const iframe = document.querySelector('iframe');
      const channel = new MessageChannel();
      iframe.contentWindow.postMessage('Init', 'https://example.com', [channel.port2]);
      
  2. Web Worker 通信

    • 描述:主線程與 Worker 通信。

    • 用例:將大型數據移交 Worker 處理。

    • 兼容性:Chrome 4+, Firefox 3.5+, Safari 4+, Edge 12+, iOS 8+, Android 4.4+.

    • 示例

      const worker = new Worker('worker.js');
      const buffer = new ArrayBuffer(1024);
      worker.postMessage(buffer, [buffer]);
      
  3. WebView 內 iframe 通信

    • 描述:WebView 中主頁面與 iframe 通信。
    • 用例:混合應用中的模塊化數據處理。
    • 兼容性:iOS 8+, Android 4.4+.
  4. Canvas 位圖數據處理

    • 描述:從 Canvas 生成位圖數據(如 ImageBitmap)并轉移到 Worker 或 iframe 進行處理。

    • 用例:將 Canvas 繪制的圖像數據移交 Worker 進行濾鏡處理、壓縮或渲染優化,減輕主線程負擔。

    • 兼容性:Chrome 50+, Firefox 42+, Safari 15+, Edge 79+, iOS 15+, Android 6.0+.(ImageBitmap 在 Safari 和 WebView 中較晚支持,但主流版本已覆蓋)

    • 示例

      // 主線程
      const canvas = document.createElement('canvas');
      canvas.width = 200;
      canvas.height = 200;
      const ctx = canvas.getContext('2d');
      ctx.fillStyle = 'red';
      ctx.fillRect(0, 0, 200, 200);
      createImageBitmap(canvas).then((bitmap) => {const worker = new Worker('worker.js');worker.postMessage({ bitmap }, [bitmap]);
      });
      
      // worker.js
      self.onmessage = (e) => {const bitmap = e.data.bitmap;// 示例:處理 bitmap(如渲染到另一個 canvas)console.log('Received bitmap:', bitmap.width, bitmap.height);
      };
      

可轉移數據類型

  1. ArrayBuffer
    • 描述:二進制數據緩沖區。
    • 用例:傳遞圖像、音頻數據。
    • 兼容性:Chrome 4+, Firefox 4+, Safari 5.1+, iOS 8+, Android 4.4+.
  2. MessagePort
    • 描述MessageChannel 的通信端口。
    • 用例:建立雙向通信通道。
    • 兼容性:Chrome 4+, Firefox 6+, Safari 5.1+, iOS 8+, Android 4.4+.
  3. ImageBitmap
    • 描述:高效位圖對象,從圖像、視頻或 Canvas 創建。
    • 用例:圖像處理或渲染(如 Canvas 數據處理)。
    • 兼容性:Chrome 50+, Firefox 42+, Safari 15+, iOS 15+, Android 6.0+.

兼容性有限:支持較少的場景與數據類型

以下場景和數據類型僅在部分現代瀏覽器支持,需謹慎使用并提供降級方案。

應用場景

  1. Service Worker 通信
    • 描述:主頁面與 Service Worker 通信。
    • 兼容性:Chrome 40+, Firefox 44+, Safari 11.1+, iOS 11.3+, Android 5.0+(部分 WebView 不穩定)。
  2. WebRTC 數據通道
    • 描述:轉移 RTCDataChannel 到 Worker。
    • 兼容性:Chrome 56+, Firefox 44+, Safari 11+, iOS 11+, Android 7.0+.
  3. 離屏渲染(OffscreenCanvas)
    • 描述:轉移 OffscreenCanvas 到 Worker 渲染。
    • 兼容性:Chrome 69+, Firefox 105+, Safari 16.4+, iOS 16.4+, Android 9.0+.

可轉移數據類型

  1. OffscreenCanvas
    • 兼容性:Chrome 69+, Firefox 105+, Safari 16.4+, iOS 16.4+, Android 9.0+.
  2. ReadableStream, WritableStream, TransformStream
    • 兼容性:Chrome 78+, Firefox 102+, Safari 14.1+, iOS 14.5+, Android 10+.
  3. RTCDataChannel
    • 兼容性:Chrome 56+, Firefox 44+, Safari 11+, iOS 11+, Android 7.0+.

注意事項

  • 安全:指定 targetOrigin,避免使用 "*",確保目標上下文可信。
  • 不可逆:轉移后原始對象不可用,需備份數據。
  • 性能:轉移適合大型數據,小數據復制更簡單。
  • 降級:檢測功能(如 typeof ImageBitmap !== 'undefined'),用結構化克隆或標準 API 替代。

總結

所有權轉移優化前端跨上下文通信性能:

  • 高兼容性:窗口間、Web Worker、WebView iframe、Canvas 位圖數據處理,ArrayBuffer, MessagePort, ImageBitmap(Safari 15+ 需注意)。
  • 兼容性有限:Service Worker、WebRTC、離屏渲染,OffscreenCanvas, 流對象,RTCDataChannel 僅最新瀏覽器支持。
  • 建議:優先使用高兼容性場景,檢測功能支持,提供降級方案,確保跨平臺穩定性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77646.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Missashe考研日記-day23

Missashe考研日記-day23 0 寫在前面 博主前幾天有事回家去了,斷更幾天了不好意思,就當回家休息一下調整一下狀態了,今天接著開始更新。雖然每天的博客寫的內容不算多,但其實還是挺費時間的,比如這篇就花了我40多分鐘…

Docker 中將文件映射到 Linux 宿主機

在 Docker 中,有多種方式可以將文件映射到 Linux 宿主機,以下是常見的幾種方法: 使用-v參數? 基本語法:docker run -v [宿主機文件路徑]:[容器內文件路徑] 容器名稱? 示例:docker run -it -v /home/user/myfile.txt:…

HarmonyOS-ArkUI-動畫分類簡介

本文的目的是,了解一下HarmonyOS動畫體系中的分類。有個大致的了解即可。 動效與動畫簡介 動畫,是客戶端提升界面交互用戶體驗的一個重要的方式。可以使應用程序更加生動靈越,提高用戶體驗。 HarmonyOS對于界面的交互方面,圍繞回歸本源的設計理念,打造自然,流暢品質一提…

C++如何處理多線程環境下的異常?如何確保資源在異常情況下也能正確釋放

多線程編程的基本概念與挑戰 多線程編程的核心思想是將程序的執行劃分為多個并行運行的線程,每個線程可以獨立處理任務,從而充分利用多核處理器的性能優勢。在C中,開發者可以通過std::thread創建線程,并使用同步原語如std::mutex、…

區間選點詳解

步驟 operator< 的作用在 C 中&#xff0c; operator< 是一個運算符重載函數&#xff0c;它定義了如何比較兩個對象的大小。在 std::sort 函數中&#xff0c;它會用到這個比較函數來決定排序的順序。 在 sort 中&#xff0c;默認會使用 < 運算符來比較兩個對象…

前端配置代理解決發送cookie問題

場景&#xff1a; 在開發任務管理系統時&#xff0c;我遇到了一個典型的身份認證問題&#xff1a;??用戶登錄成功后&#xff0c;調獲取當前用戶信息接口卻提示"用戶未登錄"??。系統核心流程如下&#xff1a; ??用戶登錄??&#xff1a;調用 /login 接口&…

8.1 線性變換的思想

一、線性變換的概念 當一個矩陣 A A A 乘一個向量 v \boldsymbol v v 時&#xff0c;它將 v \boldsymbol v v “變換” 成另一個向量 A v A\boldsymbol v Av. 輸入 v \boldsymbol v v&#xff0c;輸出 T ( v ) A v T(\boldsymbol v)A\boldsymbol v T(v)Av. 變換 T T T…

【java實現+4種變體完整例子】排序算法中【冒泡排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是冒泡排序的詳細解析&#xff0c;包含基礎實現、常見變體的完整代碼示例&#xff0c;以及各變體的對比表格&#xff1a; 一、冒泡排序基礎實現 原理 通過重復遍歷數組&#xff0c;比較相鄰元素并交換逆序對&#xff0c;逐步將最大值“冒泡”到數組末尾。 代碼示例 pu…

系統架構設計(二):基于架構的軟件設計方法ABSD

“基于架構的軟件設計方法”&#xff08;Architecture-Based Software Design, ABSD&#xff09;是一種通過從軟件架構層面出發指導詳細設計的系統化方法。它旨在橋接架構設計與詳細設計之間的鴻溝&#xff0c;確保系統的高層結構能夠有效指導后續開發。 ABSD 的核心思想 ABS…

Office文件內容提取 | 獲取Word文件內容 |Javascript提取PDF文字內容 |PPT文檔文字內容提取

關于Office系列文件文字內容的提取 本文主要通過接口的方式獲取Office文件和PDF、OFD文件的文字內容。適用于需要獲取Word、OFD、PDF、PPT等文件內容的提取實現。例如在線文字統計以及論文文字內容的提取。 一、提取Word及WPS文檔的文字內容。 支持以下文件格式&#xff1a; …

Cesium學習筆記——dem/tif地形的分塊與加載

前言 在Cesium的學習中&#xff0c;學會讀文檔十分重要&#xff01;&#xff01;&#xff01;在這里附上Cesium中英文文檔1.117。 在Cesium項目中&#xff0c;在平坦坦地球中加入三維地形不僅可以增強真實感與可視化效果&#xff0c;還可以??提升用戶體驗與交互性&#xff0c…

Spring Boot 斷點續傳實戰:大文件上傳不再怕網絡中斷

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、痛點與挑戰 在網絡傳輸大文件&#xff08;如視頻、數據集、設計稿&#xff09;時&#xff0c;常面臨&#xff1a; 上傳中途網絡中斷需重新開始服務器內…

數碼管LED顯示屏矩陣驅動技術詳解

1. 矩陣驅動原理 矩陣驅動是LED顯示屏常用的一種高效驅動方式&#xff0c;利用COM&#xff08;Common&#xff0c;公共端&#xff09;和SEG&#xff08;Segment&#xff0c;段選&#xff09;線的交叉點控制單個LED的亮滅。相比直接驅動&#xff0c;矩陣驅動可以顯著減少所需I/…

【上位機——MFC】菜單類與工具欄

菜單類 CMenu&#xff0c;封裝了關于菜單的各種操作成員函數&#xff0c;另外還封裝了一個非常重要的成員變量m_hMenu(菜單句柄) 菜單使用 添加菜單資源加載菜單 工具欄相關類 CToolBarCtrl-》父類是CWnd&#xff0c;封裝了關于工具欄控件的各種操作。 CToolBar-》父類是CC…

liunx中常用操作

查看或修改linux本地mysql端口 cat /etc/my.cnf 如果沒有port可以添加&#xff0c;有可以修改 查看本地端口占用情況 bash netstat -nlt | grep 3307 HADOOP集群 hdfs啟動與停止 # 一鍵啟動hdfs集群 start-dfs.sh # 一鍵關閉hdfs集群 stop-dfs.sh #除了一鍵啟停外&#x…

衡石chatbi如何通過 iframe 集成

iframe 集成方式是最簡單的一種&#xff0c;您只需要在您的 HTML 文件中&#xff08;或 Vue/React 組件中&#xff09;添加一個 iframe 元素&#xff0c;并設置其 src 屬性為 AI 助手的 URL。 <iframesrc"https://develop.hengshi.org/copilot"width"100%&q…

Java集合框架深度解析:HashMap、HashSet、TreeMap、TreeSet與哈希表原理詳解

一、核心數據結構總覽 1. 核心類繼承體系 graph TDMap接口 --> HashMapMap接口 --> TreeMapSet接口 --> HashSetSet接口 --> TreeSetHashMap --> LinkedHashMapHashSet --> LinkedHashSetTreeMap --> NavigableMapTreeSet --> NavigableSet 2. 核心特…

HTTP 1.0 和 2.0 的區別

HTTP 1.0 和 2.0 的核心區別體現在性能優化、協議設計和功能擴展上&#xff0c;以下是具體對比&#xff1a; 一、核心區別對比 特性HTTP 1.0HTTP 2.0連接方式非持久連接&#xff08;默認每次請求新建 TCP 連接&#xff09;持久連接&#xff08;默認保持連接&#xff0c;可復用…

gnome中刪除application中失效的圖標

什么是Application 這一塊的東西應該叫application&#xff0c;準確來說應該是applications。 正文 系統級&#xff1a;/usr/share/applications 用戶級&#xff1a;~/.local/share/applications ying192 ~/.l/s/applications> ls | grep xampp xampp.desktoprm ~/.local…

OpenFeign 使用教程:從入門到實踐

文章目錄 一、什么是 OpenFeign&#xff1f;1、什么是 OpenFeign&#xff1f;2、什么是 Feign&#xff1f;3、OpenFeign 與 Feign 的關系4、為什么選擇 OpenFeign&#xff1f;5、總結 二、OpenFeign 的使用步驟1. 導入依賴2. 啟用 OpenFeign3. 配置 Nacos 三、FeignClient 參數…