什么是Web Workers_JavaScript中如何创建和使用Web Worker

发布时间 - 2026-01-05 00:00:00    点击率:
Web Workers 不能直接操作 DOM 或访问 window、document 等主线程对象,需通过 postMessage 通信;必须从同源外部文件加载,支持 fetch(不含 credentials: 'include'),用 self 替代 window,可调试且应按需使用。

Web Workers 不能直接操作 DOM,也不能访问 windowdocumentlocalStorage 等主线程专属对象——这是使用前必须接受的前提。

为什么主线程卡住时 Worker 仍能运行

浏览器把 JavaScript 执行分为「主线程」和「独立线程」。Web Worker 在后台新开一个 JS 线程,与主线程内存隔离,靠 postMessage() 通信。所以即使主线程正执行 while(true) 或大量计算,Worker 里的代码照常跑。

如何创建并启动一个 Web Worker

Worker 必须从外部文件加载,不能内联脚本。路径需满足同源限制,且不能是 file:// 协议(本地双击 HTML 会失败)。

  • 新建文件 worker.js,写入处理逻辑(例如:
    self.onmessage = function(e) {
      const result = e.data * 2;
      self.postMessage(result);
    };
  • 在主页面中创建实例:
    const worker = new Worker('worker.js');
  • 发送数据:
    worker.postMessage(42);
  • 监听返回:
    worker.onmessage = function(e) {
      console.log('结果:', e.data); // 输出 84
    };

常见报错和绕不过的限制

SecurityError: Failed to construct 'Worker' 多半是跨域或 file:// 加载;ReferenceError: window is not defined 是误在 Worker 里调用了 DOM API。

  • Worker 内部用 self 代替 window,全局作用域就是 self
  • 不能用 fetch?可以,但不支持 credentials: 'include'(除非显式配置 credentials: 'same-origin'
  • 想共享数据?不行。只能序列化后传值(postMessage() 底层调用结构化克隆算法),functionundefinedSymbol 会被丢弃
  • 终止 Worker:worker.terminate(),之后它不能再收发消息

多个 Worker 或复杂任务怎么组织

每个 new Worker() 启动一个新线程,开销不小。高频创建/销毁不如复用;需要频繁通信时,注意避免主线程被大量 onmessage 回调阻塞。

  • importScripts('lib1.js', 'lib2.js') 在 Worker 内加载依赖(路径相对于 worker.js
  • 想让 Worker 主动终止自己?用 self.close()
  • 调试 Worker:Chrome DevTools 的 Sources > Threads 面板能看到独立上下文,断点也有效
  • 替代方案考虑:SharedArrayBuffer + Atomics(需 HTTPS + cross-origin-isolated 头),但兼容性差,目前多数场景仍用 postMessage

真正麻烦的不是“怎么写”,而是判断“该不该用”——简单计时器、小数组排序完全没必要 Worker;但图像像素处理、加密解密、大型 JSON 解析,就值得拆出去。别为了用而用。


# javascript  # java  # html  # js  # json  # 浏览器  # ai  # win  # 跨域  # 作用域  # 为什么  # red 


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


相关推荐: Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  jQuery validate插件功能与用法详解  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  高端企业智能建站程序:SEO优化与响应式模板定制开发  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  七夕网站制作视频,七夕大促活动怎么报名?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  jQuery中的100个技巧汇总  香港服务器网站推广:SEO优化与外贸独立站搭建策略  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Windows Hello人脸识别突然无法使用  php 三元运算符实例详细介绍  简单实现Android验证码  如何用AI帮你把自己的生活经历写成一个有趣的故事?  如何在阿里云部署织梦网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何使用Telescope进行调试?(安装和使用教程)  如何快速查询网站的真实建站时间?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Python3.6正式版新特性预览  如何在宝塔面板创建新站点?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  香港服务器选型指南:免备案配置与高效建站方案解析  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  php结合redis实现高并发下的抢购、秒杀功能的实例  如何彻底删除建站之星生成的Banner?  html5的keygen标签为什么废弃_替代方案说明【解答】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?