javascript如何实现web workers_它们如何通信
发布时间 - 2026-01-01 00:00:00 点击率:次Web Workers允许JavaScript在后台线程运行而不阻塞主线程,需通过外部同源JS文件创建,拥有独立执行环境(无DOM、localStorage等),通信仅依赖postMessage/onmessage异步消息传递,支持结构化克隆与ArrayBuffer转移,可调用worker.terminate()或self.close()终止,常见类型为Dedicated Worker(一对一)和Shared Worker(多页面共享)。
Web Workers 让 JavaScript 能在后台线程中运行脚本,不阻塞主线程(比如页面渲染、用户交互)。实现它不难,关键在于理解“独立执行环境”和“基于消息的通信”这两个核心点。
如何创建并启动一个 Web Worker
Worker 必须从外部 JS 文件加载(不能是内联脚本),且同源。浏览器会为它分配独立的全局上下文(self 代替 window),没有 DOM、document 或 localStorage 等 API。
- 新建一个文件,例如
worker.js,写入要后台执行的逻辑:
self.onmessage = function(e) {
const result = e.data * 2;
self.postMessage(result);
};
- 在主页面中创建 Worker 实例并发送消息:
const worker = new Worker('worker.js');
worker.postMessage(42); // 发送数字 42
worker.onmessage = function(e) {
console.log('收到结
果:', e.data); // 输出 84
};
主线程与 Worker 之间如何通信
通信只能通过 postMessage() 和 onmessage 进行,**是异步、事件驱动、纯消息传递**,不共享内存。所有数据都会被结构化克隆(structured clone),意味着大多数基本类型、数组、对象、Map、Set 等可传,但函数、DOM 节点、undefined、Symbol 等不行。
- 发送消息用
worker.postMessage(data)或self.postMessage(data) - 监听消息统一用
onmessage = function(e) { ... },其中e.data是传来的数据 - 支持传输 ArrayBuffer 等可转移对象(transferable),大幅提升大数据量处理效率(如图像、音频):
// 主线程中发送并转移 ArrayBuffer
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]); // 第二个参数表示转移所有权
注意:一旦转移,原上下文不能再访问该 buffer。
如何终止 Worker
避免内存泄漏或无用运行,记得及时关闭。
- 主线程调用
worker.terminate()—— 立即停止,不触发 Worker 内部清理逻辑 - Worker 自己调用
self.close()—— 安全退出,适合完成任务后主动结束
Worker 结束后,其引用可被 GC 回收;但未 terminate 的 Worker 仍驻留内存,即使页面隐藏。
常见类型:Dedicated Worker vs Shared Worker
日常用的是 Dedicated Worker(一对一),每个实例只与创建它的脚本通信。Shared Worker 则允许多个页面/脚本共用一个 Worker(需同源),通过 port 通信:
- Shared Worker 构造时需指定 name:
new SharedWorker('shared.js', 'myWorker') - 必须显式调用
port.start()启动消息通道 - 适合跨 iframe 或多标签页共享状态或轮询逻辑(如统一通知服务)
不过多数场景用 Dedicated 就够了,更简单、更可控。
基本上就这些。Web Workers 不复杂但容易忽略通信边界和生命周期管理 —— 记住:没共享内存、没 DOM、靠消息、记得关。
# javascript
# java
# js
# 大数据
# 浏览器
# ai
# win
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信小程序 五星评分(包括半颗星评分)实例代码
详解MySQL数据库的安装与密码配置
如何用PHP工具快速搭建高效网站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
javascript中的try catch异常捕获机制用法分析
七夕网站制作视频,七夕大促活动怎么报名?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何自定义分页视图?(Pagination示例)
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
如何有效防御Web建站篡改攻击?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何用搬瓦工VPS快速搭建个人网站?
Java垃圾回收器的方法和原理总结
网站页面设计需要考虑到这些问题
简单实现Android验证码
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
linux top下的 minerd 木马清除方法
昵图网官方站入口 昵图网素材图库官网入口
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
米侠浏览器网页背景异常怎么办 米侠显示修复
Laravel如何配置任务调度?(Cron Job示例)
如何在自有机房高效搭建专业网站?
如何彻底删除建站之星生成的Banner?
制作旅游网站html,怎样注册旅游网站?
Laravel如何使用Telescope进行调试?(安装和使用教程)
如何基于云服务器快速搭建个人网站?
重庆市网站制作公司,重庆招聘网站哪个好?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
C#如何调用原生C++ COM对象详解
网站图片在线制作软件,怎么在图片上做链接?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Linux系统运维自动化项目教程_Ansible批量管理实战
如何在万网主机上快速搭建网站?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
如何在局域网内绑定自建网站域名?
西安专业网站制作公司有哪些,陕西省建行官方网站?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
简历没回改:利用AI润色让你的文字更专业
如何在IIS服务器上快速部署高效网站?
Laravel如何创建自定义Artisan命令?(代码示例)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
,怎么在广州志愿者网站注册?
深圳网站制作平台,深圳市做网站好的公司有哪些?


果:', e.data); // 输出 84