Web Worker 基础

在后台线程运行 JavaScript,避免阻塞 UI

问题

Web Worker 是什么?如何使用它来避免页面卡顿?

解答

Web Worker 是 HTML5 提供的一项技术,允许 JavaScript 在后台线程运行,避免阻塞主线程。主线程可以专注于用户交互和 UI 渲染,而耗时任务交给 Worker 处理。

基本使用

创建一个 Worker:

// main.js
const worker = new Worker('worker.js');

// 发送消息给 Worker
worker.postMessage({ data: 'hello' });

// 接收 Worker 的消息
worker.onmessage = function(e) {
  console.log('收到消息:', e.data);
};

// 错误处理
worker.onerror = function(e) {
  console.error('Worker 错误:', e.message);
};

Worker 文件:

// worker.js
self.onmessage = function(e) {
  console.log('Worker 收到:', e.data);
  
  // 执行耗时计算
  const result = heavyComputation(e.data);
  
  // 返回结果
  self.postMessage(result);
};

function heavyComputation(data) {
  // 模拟耗时操作
  let sum = 0;
  for (let i = 0; i < 1000000000; i++) {
    sum += i;
  }
  return sum;
}

运行环境限制

Worker 运行在沙箱环境中,无法访问:

  • DOM 元素
  • window 对象
  • document 对象
  • parent 对象

可以使用:

  • navigator 对象
  • location 对象(只读)
  • XMLHttpRequest
  • setTimeout/setInterval
  • importScripts() 加载其他脚本

关键点

  • 在独立线程运行,不阻塞主线程
  • 通过 postMessageonmessage 进行通信
  • 无法访问 DOM,运行在受限的沙箱环境
  • 适合处理大量计算、数据处理等耗时任务
  • 浏览器和 Node.js 都支持(Node.js 使用 Worker Threads)