最近我一直在研究 Web Worker,这是一份全面的指南,涵盖了开始使用 Web Worker 所需了解的所有内容。
如果您想跳过阅读博客并查看代码,这里是包含所有代码片段的 github 存储库。
Github Web Worker 存储库
目录
- 常见误解
-
Web Worker 基本设置
- 使用本机 JavaScript 设置 Web Worker
- 使用 Comlink 设置 Web Workers
- 如何检查我的工人是否已正确注册?
- 延伸阅读
常见的误解
所以,促使我探索 Web Workers 的原因是,在我构建的平台中,一项计算繁重的任务会阻塞 UI。
所以我想,‘嗯,好吧,我该如何让它不阻塞 UI’?我是否应该使用 setTimeout 来确保主线程中的所有代码都已执行完毕,然后才能运行计算量大的任务?
所以这是一个误解——使用setTimeout并不意味着UI不会被阻塞。是的,主线程上的所有内容都将在 setTimeout 回调运行之前执行,但是,当该回调从宏任务队列中弹出时,它会在主线程本身中运行,从而使 UI 无响应。
要了解更多有关 setTimeout 如何工作的信息,请参考一些参考资料 —
- 从头开始的异步 JavaScript 和事件循环 - Akshay Saini
- 事件循环、Web API、任务队列 - Lydia Hallie
Web Worker 基本设置
JavaScript 本质上是一种“单线程语言”,但是 Web Worker 使我们能够在单独的线程中运行计算量大的代码。
在开始之前,有几件事需要注意 -
- Web Worker 无法与 DOM 交互
- Web Worker 作用域是 self,而不是 window。
- Workers 相对较重,不适合大量使用。例如,为四兆像素图像的每个像素启动一名工作人员是不合适的。 [参考 - HTML 规范]
- 此外,Web Worker 并不是要让某件事需要 2 秒而不是 4 秒,而是要在 DOM 冻结 0 秒的情况下完成这件事。 [参考 - Web Workers 很慢,没关系 - Calvin Metcalf]
- 工作人员可能会产生新的工作人员,只要这些工作人员托管在与父页面相同的源中。 [参考 - MDN]
使用原生 JavaScript 的 Web Worker
- 创建一个新的 JavaScript 文件,其中包含要在工作线程中运行的代码。 (比如worker.js)
- 在主脚本中实例化worker -
const worker = new Worker("./worker.js")
注意:worker.js 不是一个模块,不能使用 import 语句。然而。 :')
要将worker.js用作模块,请在构造函数的选项中指定type: module。
const worker = new Worker("./worker.js")
- 数据通过消息系统在工作人员之间发送 - 双方都使用 postMessage() 方法发送消息,并通过 onmessage 事件处理程序响应消息
- 要在 postMessage() 中传递具有循环引用的复杂对象,请使用 StructuredClone 方法。
- 要终止 Web Worker,请使用 Worker API 的终止方法。这并不为工人提供完成其正在进行的操作的机会;它立即停止。
const worker = new Worker('./worker.js', { type: 'module' })
把它们放在一起
现在,让我们看看集成 Web Worker 后我们的代码是什么样子。
主线程代码:
worker.terminate()
工作线程代码:
// ... function workerFunction() { // Don't spin up a new worker instance if the process has already been started. if (statusElement.textContent !== PROCESS_STATUS.PROCESSING && window.Worker) { const worker = new Worker('./worker.js', { type: 'module' }) // Sending 10000000000000 to the web worker worker.postMessage(10000000000000) statusElement.textContent = PROCESS_STATUS.PROCESSING // This piece of code is executed after worker finishes its task and returns data. worker.onmessage = function (event) { statusElement.textContent = event.data } } } // ...
结果:
当我们运行应用程序时,您会注意到执行计算量大的任务时不会阻塞 UI。
使用 Comlink 设置 Web Worker
Comlink 是一个小型库(1.1kB),它消除了思考 postMessage 逻辑的心理障碍。
在更抽象的层面上,它是 postMessage 和 ES6 代理的 RPC 实现。
我使用 Comlink 的一个具体原因是我无法使用纯 JavaScript 将函数从主线程传递到工作线程。使用 Comlink 的代理,我能够轻松地将回调函数从主线程传递到工作线程。 [参考此部分]
要开始在项目中使用 comlink,请安装库
const worker = new Worker("./worker.js")
要开始使用这个库,我们需要了解以下这些方法 -
Comlink.wrap(端点)
- 它包装工作人员公开的对象,返回一个代理,您可以像本地对象一样与之交互。
- 代理将具有公开值的所有属性和功能,但访问和调用本质上是异步的。即,如果函数返回一个数字,它现在将返回该数字的承诺。
const worker = new Worker('./worker.js', { type: 'module' })
Comlink.expose(值、端点?、allowedOrigins?)
- 暴露函数将值从一个线程暴露给另一个线程(即将对象从工作线程暴露给主线程)
worker.terminate()
如何检查我的工人是否已正确注册?
- 检查工作文件是否已在网络浏览器中注册(我使用的是 Chrome)
- 右键单击→检查,然后转到源面板,您将在其中找到工作文件。
- 终止后,工作文件不应在“源”面板中可见
- 如果您在终止工作人员后仍然可以看到工作人员文件,那么很可能您已经注册了多个工作人员,但并非所有工作人员都已被终止。
延伸阅读
以上是开始之前您需要了解的有关 Web Worker 的所有信息。的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

Matter.js是一个用JavaScript编写的2D刚体物理引擎。此库可以帮助您轻松地在浏览器中模拟2D物理。它提供了许多功能,例如创建刚体并为其分配质量、面积或密度等物理属性的能力。您还可以模拟不同类型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流浏览器。此外,它也适用于移动设备,因为它可以检测触摸并具有响应能力。所有这些功能都使其值得您投入时间学习如何使用该引擎,因为这样您就可以轻松创建基于物理的2D游戏或模拟。在本教程中,我将介绍此库的基础知识,包括其安装和用法,并提供一

本文演示了如何使用jQuery和ajax自动每5秒自动刷新DIV的内容。 该示例从RSS提要中获取并显示了最新的博客文章以及最后的刷新时间戳。 加载图像是选择


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具