JavaScript Web Worker用法指南

2024-01-13 10:12

本文主要是介绍JavaScript Web Worker用法指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》

​ 

✨ 前言

        Web Worker可以将耗时任务放到后台执行,避免阻塞UI。本文将详细介绍Web Worker的用法,让你可以提升web应用性能。

通过本文你将学习:

  • Web Worker的工作原理
  • 不同类型worker的区别
  • worker的创建和通信用法
  • worker间的数据传递方法
  • worker的调试技巧
  • worker可以提升应用性能的场景
  • 弥补worker在老浏览器不兼容的方法

准备让Web Worker成为你的网页优化利器了吗?让我们开始吧!

第一节:Web Worker简介

Web Worker可以将JS代码运行在后台线程,实现多线程:

  • 不阻塞主UI线程,提升互动性
  • 与主线程同时运行,实现并行
  • 通过消息传递与主线程通信

DEDICATED WORKER:专属于一个页面 SHARED WORKER:可被多个页面共享

第二节:创建Worker

创建一个Dedicated Worker的基本步骤是:

  1. 主线程中用new Worker()实例化一个Worker对象,并传入脚本的路径
  2. 在指定的js脚本中使用self对象对worker进行编程
  3. self对象表示worker的全局作用域,可以添加事件监听器
  4. 常见的事件有onmessage、onerror等

一个典型的示例:

// 主线程
const worker = new Worker('work.js');worker.postMessage('start');// work.js
self.addEventListener('message', e => {console.log('worker recv:', e.data);self.postMessage('hello from worker');
});

Worker线程中不能直接访问DOM,但可以通过postMessage()与主线程通信。

创建一个Shared Worker步骤类似,只是用SharedWorker实例,并可以指定worker的名称。

Shared Worker可以被多个窗口访问,从而共享同一个逻辑。

Dedicated Worker专属于一个页面文档。根据实际需求选择合适的Worker类型。

创建shared worker:

// 主线程
const worker = new SharedWorker('work.js');// work.js 
self.addEventListener('connect', (e) => {// 收到连接
});

第三节:worker间通信

主线程 -> worker:

worker.postMessage('hello');

worker -> 主线程:

self.postMessage('hi from worker');

 

  1. 主线程到worker的通信

主线程使用worker对象的postMessage()方法向worker发送消息:

// 主线程 
worker.postMessage('start');

 postMessage()可以发送各种数据类型,包括原始类型、对象、数组等。

  1. worker到主线程的通信

worker中使用self.postMessage()发送:

// worker内
self.postMessage('message from worker');

 self代表worker的全局作用域。

  1. 接收消息

主线程通过worker.onmessage监听消息:

// 主线程
worker.onmessage = function(e) {console.log(e.data);
}

worker中通过self.onmessage监听:

// worker内 
self.onmessage = function(e) {console.log(e.data);
}

e.data是消息内容。

  1. 传递数据注意事项
  • 对象会串行化,记得调用JSON.parse()
  • 传递函数需要把函数字符串化

这些是worker间通信的主要方式,可以传递不同类型的数据,充分利用多线程带来的好处。

第五节:Worker中的异步请求

Worker线程可以发出AJAX请求,使用与主线程相同的XMLHttpRequest对象:

// Worker内
const xhr = new XMLHttpRequest();
xhr.open('GET', '/data');
xhr.onload = () => {self.postMessage(xhr.response); 
}
xhr.send();

这样可以在Worker中完成异步数据加载,不影响主UI线程。

第六节:调试Worker

主线程可以通过inspect()调试运行中的Worker:

const worker = new Worker();
worker.inspect();

 

这会打开DevTools来调试worker线程。

也可以将console日志发送到主线程:

// Worker内
self.postMessage(console.log.apply(console, arguments));

第七节:使用场景

Worker常用于:

  • 超大数据排序、搜索、处理
  • 数据转换与编译,如Json、Excel
  • 高延迟任务或高计算工作,如机器学习

第八节:兼容性和代替方案

低版本浏览器可能不支持Worker,可以使用polyfill或只在新浏览器使用。

也可以使用setTimeout模拟后台线程。

✨ 结语     

        在这篇文章中,我们全面介绍了Web Worker的用法 - 它可以将JavaScript代码运行在后台线程,实现多线程计算。

        首先,我们看到Web Worker的优点,它不会阻塞主UI线程,可以实现并行执行任务。然后,我们介绍了Dedicated Worker和Shared Worker的区别,以及创建和终止Worker的方法。

        接下来,我们重点讲解了Worker之间的消息通信机制,这是利用多线程的关键。我们也讨论了Worker中发起异步请求和调试技巧。

        最后,给出了Web Worker的实际应用场景,以及需要注意的兼容性问题。

        我尽量用通俗的语言和示例给出了全面的讲解,希望这篇文章可以帮助大家正确使用Web Worker来优化web应用性能。如果还有任何问题,欢迎在评论交流!

这篇关于JavaScript Web Worker用法指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601107

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏