Web Worker API

news2024/9/29 13:26:21

Web Worker API

Web Worker 使得在一个独立于 Web 应用程序主执行线程的后台线程中运行脚本操作成为可能。这样做的好处是可以在独立线程中执行费时的处理任务,使主线程(通常是 UI 线程)的运行不会被阻塞/放慢。

Web Worker概念与用法

Worker 是一个使用构造函数创建的对象(例如 Worker),它运行一个具名 JavaScript 文件——该文件包含将在 worker 线程中运行的代码。

除了标准的 JavaScript 函数集(如 String、Array、Object、JSON 等),你可以在 worker 线程中运行任何你喜欢的代码,有一些例外:你不能直接在 worker 线程中操作 DOM 元素,或使用 window对象中的某些方法和属性。

数据通过消息系统在 worker 和主线程之间发送——双方都使用 postMessage() 方法发送消息,并通过 onmessage 事件处理程序响应消息(消息包含在 message 事件的 data 属性中)。数据是复制的,而不是共享的。

Worker类型

有许多不同类型的 worker:

  • 专用 worker 是由单个脚本使用的 worker。该上下文由 DedicatedWorkerGlobalScope
    对象表示。
  • Shared worker 是可以由在不同窗口、IFrame 等中运行的多个脚本使用的 worker ,只要它们与 worker 在同一域中。它们比专用的 worker 稍微复杂一点——脚本必须通过活动端口进行通信。
  • Service Worker 基本上是作为代理服务器,位于 web 应用程序、浏览器和网络(如果可用)之间。它们的目的是(除开其他方面)创建有效的离线体验、拦截网络请求,以及根据网络是否可用采取合适的行动并更新驻留在服务器上的资源。它们还将允许访问推送通知和后台同步 API。

备注: 根据 web worker 规范,worker 错误事件不应该冒泡(参见 Firefox bug 1188141)。该规范已在 Firefox 42 中实现。

Worker全局上下文和函数

worker 在一个与当前 window不同的全局上下文中运行!虽然  Window 不能直接用于 worker,但许多相同的方法被定义在一个共享的混入(WindowOrWorkerGlobalScope)中,并通过 worker 自己的 ​​​​​​​WorkerGlobalScope 衍生的上下文提供给它们:

  •  DedicatedWorker GlobalScope用于专用 worker
  • SharedWorker GlobalScope (en-US) 用于共享 worker
  • ServiceWorkerGlobalScope 用于 service worker

支持的WebAPI

备注: 如果列出的 API 被某一平台的特定版本所支持,那么一般可以认为它在 web worker 中是可用的。你也可以使用网站来测试对某个特定对象/函数的支持:Worker Playground

以下 Web API 对 worker 是可用的:​​​​​​​

  • Barcode Detection API (en-US)
  • Broadcast Channel API
  • Cache API
  • Channel Messaging API
  •  Console API
  • Web Crypto API (例如 Crypto)
  • CSS Font Loading API
  • CustomEvent
  • Encoding API(例如TextEncoder、TextDecoder)
  • Fetch API
  • FileReader
  • FileReaderSync(仅在worker中有效!)
  • FormData
  • ImageBitmap
  • ImageData
  • IndexedDB
  • Media Source Extensions API (仅限专用 worker)
  • Network Information API
  • Notifications API
  • OffscreenCanvas
  • (和所有的canvascontextAPI)

...​​​​​​​

worker 也可以派生其他 worker,所以这些 API 也是可用的:

  • ​​​​​​​​​​​​​​Worker
  • WorkerGlobalScope
  • WorkerLocation (en-US)
  • WorkerNavigator (en-US)

Web Worker接口

Worker

表示正在运行的worker线程,允许你将信息传递到正在运行的worker程序代码。
WorkerLocation (en-US)
定义由Worker执行的脚本的绝对位置。
SharedWorker
表示一种特定的worker,可以从多个浏览上下文(即窗口、标签或iframe)甚至其他worker访
问。
WorkerGlobalScope
表示任意worker的通用作用域(对于正常的网页类容来说与Winddow有相同的作用)。不同类型
的worker都有从接口继承作用域对象,并且可以添加更多特定特定特性生。
DedicatedWorker GlobalScope
表示一个专用worker的作用域,继承自WorkerGlobalScope,且可添加一些特有的特性。
SharedWorker GlobalScope (en-US)
表示一个共享worker的作用域,继承自WorkerGlobalScope,且可添加一些特有的特性。
WorkerNavigator (en-US)
表示用户代理(客户端)的身份和状态。

示例

本次先讲一下 Worker的使用

代码结构

 index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width">

    <title>Web Workers basic example</title>

    <link rel="stylesheet" href="style.css">
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
  </head>

  <body>
    <h1>Web<br>Workers<br>basic<br>example</h1>

    <div class="controls" tabindex="0">
      <form>
        <div>
          <label for="number1">Multiply number 1: </label>
          <input type="text" id="number1" value="0">
        </div>
        <div>
          <label for="number2">Multiply number 2: </label>
          <input type="text" id="number2" value="0">
        </div>
      </form>

      <p class="result">Result: 0</p>
    </div>
    <script src="main.js"></script>
  </body>
</html>

main.js

const first = document.querySelector('#number1');
const second = document.querySelector('#number2');

const result = document.querySelector('.result');

if (window.Worker) {
  const myWorker = new Worker("worker.js");

  first.onchange = function() {
    myWorker.postMessage([first.value, second.value]);
    console.log('Message posted to worker');
  }

  second.onchange = function() {
    myWorker.postMessage([first.value, second.value]);
    console.log('Message posted to worker');
  }

  myWorker.onmessage = function(e) {
    result.textContent = e.data;
    console.log('Message received from worker');
  }
} else {
  console.log('Your browser doesn\'t support web workers.');
}

worker.js

onmessage = function(e) {
    console.log('Worker: Message received from main script');
    const result = e.data[0] * e.data[1];
    if (isNaN(result)) {
      postMessage('Please write two numbers');
    } else {
      const workerResult = 'Result: ' + result;
      console.log('Worker: Posting message back to main script');
      postMessage(workerResult);
    }
  }

style.css

html {
	background-color: #7D2663;
	font-family: sans-serif;
}

h1 {
	margin: 0;
	font-size: 20vmin;
	letter-spacing: -0.2rem;
	position: absolute;
	top: 0;
	z-index: -1;
}

p {
	margin: 0;
}

.controls {
	padding: 4vw;
	width: 75%;
	margin: 10vw auto;
	background-color: rgba(255,255,255,0.7);
	border: 5px solid black;
	opacity: 0.3;
	transition: 1s all;
}

.controls:hover, .controls:focus {
  opacity: 1;
}

.controls label, .controls p, .controls input {
	font-size: 3vw;
}

.controls div {
  padding-bottom: 1rem;
}

结果 

 

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

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

相关文章

【iOS安全】OpenSSH使用

安装OpenSSH 在 Cydia 中直接查找和安装 OpenSSH 使用OpenSSH http://orinchen.github.io/blog/2014/01/15/install-and-use-openssh-on-ios/ 保证PC和iPhone在同一网段下 查看iPhone的IP地址 ssh root10.168.xx.xx 口令默认是alpine 或者也可以使用XShell等集成终端

自动化测试的统筹规划

背景 回顾以前自动化测试编写的经历&#xff0c;主要是以开发者自驱动的方式进行&#xff0c;测试的编写随心而动&#xff0c;没有规划&#xff0c;也没有章法&#xff0c;这样就面临如下的一些问题&#xff1a; 测试用例设计不到位&#xff0c;覆盖不全&#xff0c;或者不够…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统&#xff0c;默认情况下是与窗口坐标系统相同&#xff0c;它以canvas的左上角为坐标原点&#xff0c;沿X轴向右为正值&#xff0c;沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系&#xff0c;且每个方向都有可使用的值的…

android kernel移植5-RK3568

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.添加开发板默认配置文件前言 前面我们已经学会了移植uboot,其实就是把瑞芯微的关于uboot的一些文件的名字和编译指定的文件改为自己定义的问价和名字,那么接下来的Android kernel其实也是…

【数据结构】排序算法系列

常见的排序如下&#xff1a; 一、比较类排序 1. 交换排序 &#xff08;1&#xff09; 冒泡排序 【数据结构】交换排序&#xff08;一&#xff09;——冒泡排序_Jacky_Feng的博客-CSDN博客 &#xff08;2&#xff09; 快速排序 【数据结构】交换排序&#xff08;二&#xf…

WebDAV之π-Disk派盘 + 薄荷记账

薄荷记账是一款为用户提供专业记账服务的手机应用,轻松记录个人的账目支出以及收入,什么时间花在哪都能知晓,养成良好的记账习惯,让生活更有条理。 π-Disk派盘 – 知识管理专家 派盘是一款面向个人和企业的本地云存储解决方案,它可以帮助用户打造“数字第二大脑”,并支…

如何批量实现多行合并后居中

思路&#xff1a; 1.先填充数据 2.数据分类统计制作格式 3.格式刷刷制作出的格式 1.填充数据 思路&#xff1a;选中&#xff0c;F5定位空值&#xff0c;&#xff0c;⬆&#xff08;键盘上的上下左右哪里的上键&#xff09;&#xff0c;按住Ctrl然后按Enter。 2.数据分类统计…

Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】

题目 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2]输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链表长度 < 10000 解题思路 1.题目要求我们从尾到头反过…

线上java程序CPU及内存占用过高问题排查总结

背景 最近发现线上的一个JAVA程序总是过段时间慢慢卡死&#xff0c;最后导致无法提供服务&#xff0c;外部请求接口超时。 经排查发现&#xff0c;该程序CPU及内存占用都很高&#xff0c;导致整个系统负载很高。 到这里&#xff0c;就想到了对程序内存进行分析。排查过程 查询…

vue- form动态表单验证规则-表单验证

前言 以element官网的form表单的-动态增减表单项为例讲解表单验证规则 动态的功能就是v-model配合push v-for 便利来实现的 我们需要熟知2个知识点prop表单验证需要跟v-model绑定的值是一样的&#xff0c; 如果是一个数组便利的表单&#xff0c;那就需要绑定这个数组每一项…

Adaptive autosar 都有哪些模块?各有什么功能?

Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…

Python-Django中间件执行顺序

Django 中间件作用&#xff1a; 修改请求&#xff0c;即传送到 view 中的 HttpRequest 对象。修改响应&#xff0c;即 view 返回的 HttpResponse 对象。 中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。 配置中的每个字符串选项都是一个类&#xff0c;也就是一个…

Redis 6.5 服务端的读取缓冲区和输出缓冲区执行源码

通篇全文都是不开启事务&#xff0c;不开启多线程&#xff0c;只有主线程去执行 借鉴 Redis源码与设计剖析 – 18.Redis网络连接库分析 客户端与集群之间数据的交互 IO多路复用与客户端、输出缓冲区和读取缓冲区之间的关系一、读取缓冲区1、新客户端连接时注册从socket读取事件…

用友和金蝶:管理软件巨头引领企业转型潮流,新技术开始崭露头角

打造企业帝国的管理软件 在当今企业界&#xff0c;管理软件已经成为提高工作效率、优化业务流程的重要工具。 在众多管理软件中&#xff0c;用友和金蝶凭借其卓越的功能和全面的解决方案成为了众多企业的首选。 用友和金蝶的管理软件是国内知名企业管理软件&#xff0c;广泛应…

HotSpot虚拟机之Class文件及字节码指令

目录 一、javac编译 1. 编译过程 2. 语法糖 二、Class文件 1. 文件格式 2. 常量池项目 3. 属性类型 三、Class文件实例 1. 源代码 2. javap分析Class文件 四、字节码指令 五、参考资料 一、javac编译 1. 编译过程 javac命令由Java语言编写&#xff0c;目的将Ja…

wonderful-sql 作业

Sql 作业 作业1&#xff1a; 答&#xff1a; create table Employee (Id integer not null, Name varchar(32) , Salary integer, departmentId integer, primary key (Id) );create table Department( Id integer primary key, Name varchar(30) not null );insert into emp…

《向量数据库指南》——使用 AI原生云向量数据库Milvus Cloud的好处

目录 3. 使用 Milvus Cloud的好处 a. 高效存储和检索 b. 高度灵活、可扩展 c. 高性能、高可用 d. 易用性 e. 可靠性 3. 使用 Milvus Cloud的好处 Milvus Cloud生态系统提供了有效的数据库监控、数据迁移和数据量估算工具。如果不想要花时间和精力维护 Milvus,也可以选择…

k8s存储卷

目录 一、为什么要存储卷&#xff1f;二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录&#…

记录一次Linux环境下遇到“段错误核心已转储”然后利用core文件解决问题的过程

参考Linux 下Coredump分析与配置 在做项目的时候&#xff0c;很容易遇到“段错误&#xff08;核心已转储&#xff09;”的问题。如果是语法错误还可以很快排查出来问题&#xff0c;但是碰到coredump就没办法直接找到问题&#xff0c;可以通过设置core文件来查找问题&#xff0…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--搭建Vue 前端工程[一]

文章目录 SSM--搭建Vue 前端工程--项目基础界面实现功能01-搭建Vue 前端工程需求分析/图解代码实现搭建Vue 前端工程下载node.js LTS 并安装: node.js 的npm创建Vue 项目使用idea 打开ssm_vue 项目, 并配置项目启动 Vue3 项目目录结构梳理Vue3 项目结构介绍 配置Vue 服务端口El…