前端性能优化:所有权转移

前端性能优化:所有权转移

在学习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.mzph.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 参数…