什么是Web Workersjavascript_如何实现多线程【教程】

发布时间 - 2026-01-21 00:00:00    点击率:
Web Workers 是通过独立执行上下文实现并发的机制,非真正多线程;必须用 new Worker() 加载同源 JS 文件或 Blob URL;通信仅靠 postMessage(),数据序列化传递,支持 transferable 零拷贝;无 DOM、window 等全局对象;console 输出在 Workers 面板;需显式 terminate() 销毁。

Web Workers 不是 JavaScr

ipt 的“多线程”(JS 主线程本身仍是单线程),而是通过独立的执行上下文实现真正的并发任务处理——它让你能把耗时计算、数据解析、加密等重活从主线程剥离,避免阻塞 UI。

Web Worker 必须用 new Worker() 实例化,且脚本路径受同源限制

Worker 脚本不能内联(不支持 new Worker("function() { ... }")),必须是一个独立的 .js 文件或使用 Blob URL 动态生成:

  • 直接加载: const worker = new Worker("./math-worker.js");
  • 动态脚本(绕过文件限制):需构造 Blob + URL.createObjectURL(),否则会报 DOMException: Failed to construct 'Worker': Script at ... violates the following Content Security Policy directive
  • 路径必须同源;跨域会触发 NetworkError,连 onerror 都可能不触发,只在控制台报错

postMessage() 是唯一通信方式,主线程和 Worker 之间无法共享变量或 DOM

Worker 运行在完全隔离的全局环境(没有 windowdocumentlocalStorage),所有数据传递靠序列化(结构化克隆算法),注意:

  • 函数、undefinedSymbol、循环引用对象会被静默丢弃
  • 传递大数组或 ArrayBuffer 时,用 transferable 参数可零拷贝移动内存(如 worker.postMessage(arr, [arr.buffer])),否则默认深拷贝,性能暴跌
  • 主线程监听用 worker.onmessage,Worker 内部用 self.onmessage(不能用 this,因为 this !== self

Worker 中不能调用 console.log?其实是能的,但输出位置不在页面控制台

Worker 的 console 输出会出现在「Application」→「Service Workers」或「Workers」面板下(Chrome / Edge),不是主页面的 Console 标签页。调试时容易误判为没执行:

  • self.console.log() 或直接 console.log() 都可以,但别指望在主控制台看到
  • 想断点调试:在 Worker 脚本里加 debugger,然后打开 DevTools → 「Sources」→ 「Workers」侧边栏,选中对应 worker 即可
  • 出错时 onerror 回调中的 event.filenameevent.lineno 指向 Worker 脚本位置,不是调用处

真正容易被忽略的是生命周期管理:Worker 实例不会自动销毁,worker.terminate() 必须显式调用,否则长期驻留内存;而一旦终止,再发 postMessage 就会静默失败——既不报错,也不触发 onerror


# javascript  # java  # js  # app  # edge  # ai  # win  # 跨域 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何在阿里云完成域名注册与建站?  如何用VPS主机快速搭建个人网站?  黑客如何通过漏洞一步步攻陷网站服务器?  jQuery 常见小例汇总  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  详解jQuery停止动画——stop()方法的使用  javascript日期怎么处理_如何格式化输出  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Bootstrap CSS布局之列表  Laravel Fortify是什么,和Jetstream有什么关系  如何在搬瓦工VPS快速搭建网站?  如何在VPS电脑上快速搭建网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在阿里云服务器自主搭建网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  详解Oracle修改字段类型方法总结  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  大型企业网站制作流程,做网站需要注册公司吗?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何在阿里云ECS服务器部署织梦CMS网站?  如何用低价快速搭建高质量网站?  制作企业网站建设方案,怎样建设一个公司网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  网站制作企业,网站的banner和导航栏是指什么?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何解决hover在ie6中的兼容性问题  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  香港网站服务器数量如何影响SEO优化效果?  公司网站制作价格怎么算,公司办个官网需要多少钱?  微信小程序 闭包写法详细介绍  如何批量查询域名的建站时间记录?  高端云建站费用究竟需要多少预算?  ,在苏州找工作,上哪个网站比较好?  如何用PHP工具快速搭建高效网站?