Web Worker 剖析与应用

什么是Web Worker?如何使用Web Worker? JavaScript 语言采用的是单线程的,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。Web Worker是一种在浏览器中实现多线程处理的技术,允许在后台线程中执行脚本,从而避免长时间运行的脚本阻塞用户界面。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。 阅读详情
一、什么是 Web Worker?

Web Worker 是 HTML5 引入的 JavaScript 多线程解决方案,允许主线程(UI 线程)创建后台线程(Worker 线程),在不阻塞主线程的情况下执行耗时操作(如复杂计算、大数据处理等),从而避免页面卡顿,提升用户体验。

JavaScript 本质是单线程语言(同一时间只能执行一个任务),Web Worker 突破了这一限制,使 CPU 密集型任务可以在后台并行处理。

二、核心特性
  1. 线程隔离
    主线程与 Worker 线程完全隔离,拥有各自的全局作用域和内存空间,不能直接共享数据。

  2. 通信机制
    通过 postMessage 发送消息,onmessage 接收消息,数据传递采用结构化克隆算法(深拷贝,非共享),支持大部分数据类型(对象、数组、基本类型等),但不支持函数、DOM 节点等。

    特殊场景下可使用 Transferable Objects(如 ArrayBuffer)实现数据 "转移"(转移后原线程无法再访问该数据),避免拷贝开销。

  3. 受限的全局作用域
    Worker 线程中不能访问:

    • DOM 节点(如 document、window)
    • window 对象的大部分属性(如 alert、localStorage)
    • 主线程的全局变量或函数

    可访问的 API:setTimeout、fetch、XMLHttpRequest、navigator、location(只读)等。

  4. 生命周期
    由主线程创建(new Worker(scriptUrl)),可通过 terminate() 强制终止(主线程调用)或 self.close() 自行关闭。

三、使用场景
  • 大数据处理(如表格数据排序、过滤、统计)
  • 复杂数学计算(如科学计算、图形学算法)
  • 加密 / 解密、数据压缩等 CPU 密集型任务
  • 后台定时任务(如周期性数据同步)

四、基本使用示例

1. 主线程(main.js)

// 创建 Worker 实例(脚本路径需同源)
const worker = new Worker('worker.js');

// 发送数据到 Worker
worker.postMessage({ type: 'calc', data: 100 });

// 接收 Worker 返回的结果
worker.onmessage = (e) => {
  console.log('计算结果:', e.data);
};

// 监听错误
worker.onerror = (err) => {
  console.error(`Worker 错误:${err.message}`);
  worker.terminate(); // 出错后终止
};

// 页面关闭时终止 Worker
window.addEventListener('beforeunload', () => {
  worker.terminate();
});

2. Worker 线程(worker.js)

// 接收主线程消息
self.onmessage = (e) => {
  const { type, data } = e.data;
  if (type === 'calc') {
    // 执行耗时计算(示例:计算斐波那契数列)
    const result = fibonacci(data);
    // 发送结果回主线程
    self.postMessage(result);
    // 完成后自行关闭(可选)
    self.close();
  }
};

// 耗时计算函数
function fibonacci(n) {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

Web Worker 在 Vue2 中的应用

一、核心思路

在 Vue2 组件中使用 Web Worker 需结合组件生命周期管理 Worker 实例,确保:

  • 组件创建时初始化 Worker
  • 组件销毁时终止 Worker(避免内存泄漏)
  • 通过消息机制与组件数据联动
二、具体实现步骤
1. 创建 Worker 脚本

在 public 目录下创建 worker.js(需放在 public 下,避免打包时被编译):

// public/worker.js
self.onmessage = (e) => {
  const { task, payload } = e.data;
  
  // 根据任务类型处理
  switch (task) {
    case 'heavy-calc':
      const result = heavyCalculation(payload);
      self.postMessage({ status: 'done', result });
      break;
    default:
      self.postMessage({ status: 'error', message: '未知任务' });
  }
};

// 模拟耗时计算(如处理10万条数据)
function heavyCalculation(data) {
  return data.map(item => {
    // 复杂逻辑(示例:平方+开方)
    return Math.sqrt(item * item * 1.5);
  });
}
2. 在 Vue 组件中使用
<template>
  <div class="worker-demo">
    <button @click="startCalc">开始计算</button>
    <p v-if="loading">计算中...</p>
    <p v-if="result">结果长度:{{ result.length }}</p>
    <p v-if="error" class="error">{{ error }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      worker: null, // Worker 实例
      loading: false,
      result: null,
      error: ''
    };
  },
  created() {
    // 初始化 Worker(组件创建时)
    this.initWorker();
  },
  beforeDestroy() {
    // 组件销毁时终止 Worker
    this.terminateWorker();
  },
  methods: {
    initWorker() {
      // 注意路径:public 目录下的文件需用绝对路径
      this.worker = new Worker('/worker.js');

      // 接收 Worker 消息
      this.worker.onmessage = (e) => {
        this.loading = false;
        if (e.data.status === 'done') {
          this.result = e.data.result;
        } else {
          this.error = e.data.message;
        }
      };

      // 监听错误
      this.worker.onerror = (err) => {
        this.loading = false;
        this.error = `计算错误:${err.message}`;
        this.terminateWorker(); // 出错后销毁
      };
    },

    terminateWorker() {
      if (this.worker) {
        this.worker.terminate();
        this.worker = null;
      }
    },

    startCalc() {
      this.loading = true;
      this.result = null;
      this.error = '';

      // 生成10万条测试数据
      const testData = Array.from({ length: 100000 }, () => Math.random() * 1000);
      
      // 发送任务到 Worker
      this.worker.postMessage({
        task: 'heavy-calc',
        payload: testData
      });
    }
  }
};
</script>

<style scoped>
.error { color: red; }
</style>
三、注意事项
  1. Worker 脚本路径问题

    • 开发环境:需放在 public 目录下,通过绝对路径(/worker.js)访问(避免相对路径导致的 404)。
    • 生产环境:确保打包后 worker.js 与页面在同一域名下(同源限制)。
  2. 数据传递限制

    • 不能传递 Vue 实例、this、DOM 节点等(结构化克隆算法不支持)。
    • 大数据传递建议用 Transferable Objects(如 worker.postMessage(buffer, [buffer])),但转移后原数据不可用。
  3. Vuex 状态同步
    Worker 中不能直接访问 Vuex,需通过主线程中转:

    // Worker 回传结果后,在主线程更新 Vuex
    this.worker.onmessage = (e) => {
      this.$store.dispatch('updateResult', e.data.result);
    };
  4. 兼容性
    现代浏览器均支持(IE 10+),可通过 if (window.Worker) 判断是否支持。

  5. 性能优化

    • 避免频繁创建 / 销毁 Worker(可复用实例)。
    • 拆分大任务为小任务,分批处理(避免 Worker 长时间占用线程)。

四、封装为 Vue 插件(进阶)

为简化多个组件使用 Worker,可封装为插件:

// plugins/workerPlugin.js
export default {
  install(Vue) {
    Vue.prototype.$createWorker = (scriptUrl) => {
      const worker = new Worker(scriptUrl);
      
      // 封装通信方法
      const send = (data) => worker.postMessage(data);
      const onMessage = (callback) => {
        worker.onmessage = (e) => callback(e.data);
      };
      const terminate = () => worker.terminate();
      
      return { send, onMessage, terminate };
    };
  }
};

在 main.js 中注册:

import workerPlugin from './plugins/workerPlugin';
Vue.use(workerPlugin);

组件中使用:

this.worker = this.$createWorker('/worker.js');
this.worker.send({ task: 'calc', data: 100 });
this.worker.onMessage((result) => {
  console.log('结果:', result);
});

Web Worker 是解决 JavaScript 单线程瓶颈的重要方案,尤其适合处理 CPU 密集型任务。在 Vue2 中使用时,需注意生命周期管理、路径配置和数据传递限制,通过合理封装可进一步提升开发效率。

超越单线程:Web Worker 在前端性能中的角色 单线程是指在一个进程中只有一个执行线程。这个线程负责处理所有的任务和操作,包括用户输入、界面更新和数据处理。多线程是指在一个进程中可以同时存在多个执行线程。这些线程可以并行处理多个任务,提高程序的效率和响应能力。2) 阅读详情

相关推荐

如何让前端拥有后端的计算能力?十万、百万条数据都是弟弟,一文彻底了解Web Worker

页面中有十万条数据,对其进行复杂运算,需要多久呢? Web Worker为前端带来了后端的计算能力,十万、百万条数据都是弟弟。 Web Worker扩大了前端的业务边界,减轻了因大量计算造成的UI阻塞

m13837120071的博客 1135

谈谈Js中的Web Worker

1.什么是web Worker? JavaScript是单线程模型,即所有任务只能在同一个线程上面完成,前面的任务没有做完,后面的就只能等待,这样当我们执行一些时间较长的js运算时候呢就会阻塞后面执行的代码。有什么办法能解决这一问题呢?web worker 就是专门解决这一问题。 Web Worker是一种网络接口,这意味着它无法访问或管理文档对象模型。Worker存在于一个不同的线程中,它和主线程互不干扰。它在一个新的Worker对象创建时接受信息,然后向worker发送信息。 2.web worker

夜神、 1万+

PWA渐进式Web应用核心技术:Service Worker与Web App Manifest实战指南

渐进式Web应用(PWA)是一套旨在提升Web应用体验的技术集合,其核心原理在于通过Service Worker、Web App Manifest和HTTPS三大支柱,赋予网页应用离线工作、可安装和快速加载等原生应用特性。从技术价值看,PWA通过**Service Worker**实现网络请求代理和资源缓存,解决了弱网和离线环境下的可用性问题;通过**Web App Manifest**定义应用元数据,实现了添加到主屏幕的“App化”体验。这使得PWA在工程实践中,尤其适用于对**性能**和**用户体验**

weixin_34235457的博客 435

详解 WebWorker 的概念、使用场景、示例

WebWorker 是 HTML5 新引入的一种技术,旨在为 Web 内容在后台运行脚本提供一种简单的方法。这样可以允许将一些大量计算工作分配到后台线程中运行,而不产生浏览器不响应或重新渲染的问题,从而可以保证程序的顺畅运行。WebWorke r是一种在 Web 应用中实现多线程运行的技术,可以将耗费 CPU 的任务交给后台线程处理,避免阻塞主线程,从而提高Web应用的响应性能和用户体验。

chenyajundd的博客 8561

PyTorch+C3D实战:用UCF101数据集训练你的第一个视频动作识别模型(附完整代码)

本文详细介绍了如何使用PyTorch和C3D模型在UCF101数据集上构建视频动作识别系统。从环境配置、数据预处理到模型训练与优化,提供了完整的代码实战指南,帮助开发者快速掌握视频行为识别技术。文章特别强调了3D卷积核设计、混合精度训练等关键技术要点,并分享了模型部署优化经验。

weixin_29233857的博客 218

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9610

高频三大worker详解

需要单个页面做耗时计算,不想卡 UI→ 用Web Worker(专用计算线程);需要同源多页面共享数据 / 通信,共享计算结果→ 用(跨页面共享线程);需要实现离线访问、缓存资源 / 接口、PWA 特性→ 用(浏览器级离线代理脚本)。

qq_34141545的博客 805

ZYNQ平台上基于SGMII接口的IEEE1588/PTP协议高效实现方案

本文深入探讨了在Xilinx ZYNQ平台上,利用SGMII接口实现高精度IEEE1588/PTP协议的方案。通过将硬件时间戳单元集成在PL端的AXI以太网子系统IP核中,该方案绕过了软件协议栈和外部PHY的延迟,实现了亚微秒级的时间同步精度。文章详细解析了硬件设计、Vivado IP配置、Linux驱动移植及PTP协议栈部署等关键步骤,为工业控制、通信等领域的高精度网络同步提供了高效、灵活的解决路径。

q5r6s7的博客 604

Unity微信小游戏性能优化:Web Worker多线程实战指南

在Web开发中,多线程编程是解决复杂计算任务、提升应用响应速度的关键技术。其核心原理在于利用独立线程并行执行任务,避免阻塞主线程的UI渲染与交互。对于性能要求苛刻的游戏和交互应用,多线程能显著提升帧率与用户体验。Web Worker作为浏览器标准API,提供了真正的后台线程能力,允许JavaScript在独立线程中执行脚本,是实现并行计算的标准方案。在Unity引擎发布到微信小游戏等WebGL平台时,传统的System.Threading多线程方案失效,开发者面临单线程性能瓶颈。此时,通过Web Worke

weixin_30631587的博客 301

k8s部署 普罗米修斯(Prometheus)监控

Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。

D2961953033的博客 3855

一次把 PRIV mode 讲透:从 ABAP 内存分配链路到定位与治理

ABAP系统进入PRIV模式的本质是Extended Memory耗尽时转向Heap内存的应急机制。该现象会导致工作进程被独占,系统吞吐量下降。触发条件包括系统EM资源池耗尽或单个用户超过配额阈值。关键参数em/address_space_MB和ztta/roll_extension需协同调整。典型症状包括SM50显示PRIV状态、响应延迟和内存dump。治理需双管齐下:系统侧合理配置内存参数,代码侧优化内存使用模式,如分页处理、减少大内表操作和下推聚合逻辑。PRIV模式应作为异常信号而非常态目标,健康系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 203

FluidCAD 新手教程:从草图到拉伸实体,10分钟完成你的第一个零件建模

FluidCAD 是一款开源的参数化 CAD 建模工具(Parametric CAD modeling with JavaScript),它用 JavaScript 驱动真实的 B-Rep 内核:你用鼠标画草图、加约束、做拉伸,它会在后台同步生成一段可读的 JavaScript 代码。改一个尺寸,整个模型自动重建。这篇 FluidCAD 新手教程带你走完「草图 → 约束 → 拉伸 → 切除」的完整

gitblog_00269的博客 252

OpenClaw 报错 TypeError: Cannot read properties of undefined (reading ‘prototype‘):Node.js 版本不兼容

国产化环境中部署OpenClaw云边协同平台时,出现"TypeError: Cannot read properties of undefined (reading 'prototype')"报错。经分析发现根本原因是Node.js版本与依赖生态不兼容,新版本Node(如v21)移除了旧依赖使用的内部API。解决方案包括:1)使用nvm切换至兼容的Node 16/18 LTS版本;2)容器化部署固定Node版本;3)遵循官方推荐的引擎版本范围。该问题揭示现代工程中版本管理的重要性,

博客 2313

深度剖析PWA应用:从原理到实践的全方位指南

本文系统介绍了渐进式Web应用(PWA)的核心技术与实践方案。首先阐述了PWA的核心特性(离线能力、安装体验、推送通知等)及其优势。然后深入解析了Service Worker、Web App Manifest等关键技术原理,并提供了完整的代码示例,展示如何实现缓存策略、离线访问等功能。文章还探讨了性能优化、安全措施等高级应用技巧,分析了PWA的局限性及未来发展趋势。通过作者的实际项目经验,为开发者提供了从基础到进阶的PWA实现指南,帮助构建高性能、跨平台的现代化Web应用。

codecode_的博客 1185

数据分片的三种方式:哈希、一致性哈希、按照数据范围分片

数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。三种常用的数据分片方式:1. 哈希分片2. 一致性哈希分片(Consistent Hash)3. 按照数据范围分片(Range Based)数据分片的应用场景:1. 数据库扩展2. 分布式缓存对集群部署多个缓存节点,提高缓存的处理能力。

wjianwei666的专栏 1135

AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程

本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。

打造全国最全的AI Agent开发知识领域的博客 5966

浏览器工作原理与实践|27:渐进式网页应用(PWA):它究竟解决了Web应用的那些问题

浏览器的三大进化路线 第一是应用程序Web化 第二是Web应用移动化 第三Web操作系统化; 但是在现在环境中是移动端既有手机APP,同时也有各家小程序,Google为了让浏览器切入到移动端,退出了PWA。 PWA(Progressive Web Application)渐进式网页应用(渐进式+网页应用) PWA 提供了一个渐进式的过渡方案,让普通站点逐步过渡到 Web 应用。采取渐进式可以降低站点改造的代价,使得站点逐步支持各项新技术,而不是一步到位。 站在技术角度来说,PWA 技术也是一个渐进式的演

Three_ST的博客 555

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

UpUp源码剖析:深入理解JavaScript离线优先实现机制

在当今移动优先的时代,网络连接却并非总是可靠。UpUp作为一款轻量级的JavaScript库,通过Service Worker技术实现了离线优先的网页访问体验。无论用户身处飞机、电梯还是海底,都能正常访问您的网站内容。🚀 ## 离线优先的核心技术原理 UpUp的核心机制建立在Service Worker之上,这是一个革命性的Web技术,允许开发者拦截和控制网络请求。当用户首次访问网站时,Up

gitblog_00240的博客 487

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Kubernetes 核心组件详解与架构深度剖析

在本文中,我们深入剖析了 Kubernetes(K8s)的核心组件,包括 Master 节点中的 API Server、Controller Manager、Scheduler,以及 Worker 节点中的 Kubelet、Kube-Proxy。详细阐述了每个组件的功能、工作原理、配置方法与优化策略,并通过架构图和流程图直观地展示了 K8s 的整体架构和组件协作流程。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1163

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

浏览器四大线程 深度解析,祝你面试一臂之力

这些API的核心思想是“线程隔离、各司其职”

码刀攻城 937

React Hooks 完全指南:从 useState 到 Web Worker

自定义 Hook 允许你将组件逻辑提取到可重用的函数中。useState:管理组件状态,驱动 UI 更新useRef:持久化存储,操作 DOM,不触发渲染useEffect:处理副作用,管理生命周期自定义 Hooks:复用逻辑,保持代码整洁结合 Web Worker 处理复杂计算,可以构建高性能、响应式的 React 应用。合理使用这些工具,能显著提升应用的用户体验和开发效率。

2401_88361338的博客 282

PWA 与 Service Worker 深度解析:从原理到实践

PWA(Progressive Web App,渐进式网页应用) 不是一项单一技术,而是一套基于标准 Web 技术(HTML/CSS/JavaScript)构建、通过浏览器增强能力逐步获得接近原生 App 体验的理念与技术集合。自由开放 + 跨平台:一套代码运行在所有设备上。这是原生 App 不具备的,也是各厂商小程序难以统一标准的痛点。在 Service Worker 之前,W3C 曾推出 Application Cache(App Cache) 标准用于离线缓存,但其设计存在严重缺陷(如无法精确控制缓存

liangshanbo1215的博客 353

电路仿真circuits网页版深度剖析:前端架构与性能优化策略

深入解析电路仿真circuits网页版的前端技术架构,探讨其加载速度、交互响应等性能优化策略,提升用户体验与运行效率。

weixin_35899324的博客 309

渐进式 Web 应用开发实例(一)

渐进式网络应用(PWAs)标志着用户体验交付的新时代。现在,每个主要浏览器和平台都支持 PWAs,消除了许多以前仅限于原生应用的缺失功能。如果您是一位从事应用前端开发的工作者,您需要了解渐进式网络应用是什么,它们的优点以及如何有效地构建现代 Web 应用。您将学习基本 PWA 要求,如 Web 清单文件以及 HTTPS 是如何通过高级服务工作者生命周期和缓存策略工作的。本书涵盖了 Web 性能优化实践和工具,以帮助您持续创建高质量的渐进式网络应用。

龙哥盟 6265

PWA与Service Worker的安全风险:从“应用化”网络到新型攻击界面

然而,这种强大的“应用化”能力,在安全视角下,正将一个传统上相对隔离、无状态的“网页”环境,转变为一个具备持久化、后台执行和网络拦截能力的新型客户端攻击界面。理解其安全风险,对防守方(开发者、架构师、安全运维)而言,是构建可信赖现代Web应用的前提;· 渐进式Web应用:PWA不是一个具体的技术,而是一套通过现代Web API实现的、能提供可靠、快速、沉浸式用户体验的Web应用理念和实践集合。—— 明确了与“Web安全基础”、“客户端存储安全”的前序联系,及与“高级客户端漏洞”、“供应链攻击”的后继联系。

Alfadi联盟 萧瑶的博客 669
上一篇: VUE3使用小技巧
下一篇: WebSocket 原理与机制
codingMan_09
博客等级 码龄2年 29粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codingMan_09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值