2020-10-13 03:09:14
Web Workers 允许在后台线程中运行脚本,避免阻塞主线程,适用于处理耗时任务(如复杂计算、数据处理)。 以下是具体使用方法和注意事项:
1. 创建 Web Worker步骤 1:编写独立的 Worker 脚本创建一个单独的 JavaScript 文件(如 worker.js),在其中定义任务逻辑。Worker 通过 self.onmessage 接收主线程消息,并通过 self.postMessage 返回结果。
// worker.jsself.onmessage = function(event) { const data = event.data; const result = performHeavyComputation(data); // 耗时操作 self.postMessage(result); // 返回结果};function performHeavyComputation(data) { for (let i = 0; i < 100000000; i++) { data += i; // 模拟计算 } return data;}步骤 2:在主线程中初始化 Worker通过 new Worker('worker.js') 创建 Worker 实例,并通过 postMessage 发送数据,通过 onmessage 接收结果。
// main.jsconst worker = new Worker('worker.js');worker.onmessage = function(event) { console.log('Received result:', event.data); // 处理结果};worker.postMessage('Start computation'); // 发送数据主线程与 Worker 通信
主线程 → Worker:使用 worker.postMessage(data) 发送数据。
Worker → 主线程:通过 self.postMessage(result) 返回结果,主线程通过 worker.onmessage 监听。
数据类型:支持基本类型(字符串、数字等)和可序列化对象(如 JSON)。
示例
// 主线程发送对象worker.postMessage({ type: 'compute', payload: 1000 });// Worker 处理并返回self.onmessage = (e) => { const { type, payload } = e.data; if (type === 'compute') { self.postMessage(payload * 2); }};任务粒度:短任务可能因通信开销降低性能,适合长时间运行的任务。
SharedArrayBuffer:共享内存提高多 Worker 数据交换效率(需注意安全限制)。
Dedicated Worker vs. Shared Worker:
Dedicated Worker:一对一通信(常用)。
Shared Worker:多标签页/窗口共享(需通过端口通信)。
Web Workers 是提升 Web 应用性能的关键工具,尤其适合处理阻塞主线程的耗时任务。通过合理设计通信和错误处理机制,可以显著改善用户体验。使用时需权衡任务复杂度与通信开销,避免过度使用导致资源浪费。