Web Workers 是一项强大的浏览器功能,它允许在 Web 应用程序的后台线程中运行 JavaScript 代码,而不会阻塞主线程(通常是 UI 线程)。
核心问题:JavaScript 是单线程的
浏览器中,JavaScript 运行在单个线程(主线程)上。这个线程负责处理一切:渲染 UI、响应用户交互(点击、滚动)、执行 JavaScript 逻辑等。如果有一个计算密集型任务(例如循环处理大量数据、复杂的图像处理),它会阻塞主线程,导致页面卡顿、无响应,用户体验极差。
Web Workers 的解决方案
Web Workers 允许开发者创建一个在后台运行的“Worker 线程”。你可以将一些繁重的计算任务交给 Worker 去处理。在此期间,主线程可以继续保持响应,处理用户交互和页面渲染。当 Worker 完成任务后,再通过消息机制将结果返回给主线程。
运行后,页面不会卡住 —— 因为计算在 Worker 的后台线程进行。
index.html:
<!DOCTYPE html>
<html>
<body>
<button onclick="startWorker()">开始计算</button>
<p id="result"></p>
<script>
let worker;
function startWorker() {
// 创建 Worker
worker = new Worker("worker.js");
// 接收 Worker 发送的消息
worker.onmessage = function (event) {
document.getElementById("result").innerText = "后台计算结果:" + event.data;
};
// 发送消息给 Worker(可选)
worker.postMessage("start");
}
</script>
</body>
</html>
worker.js:
// 接收主线程的消息
onmessage = function (event) {
// 模拟耗时任务(累加 1~1e8)
let sum = 0;
for (let i = 0; i < 100000000; i++) {
sum += i;
}
// 把结果发送给主线程
postMessage(sum);
};
Worker 处于独立线程,没有 window / document:
但它可以:
主线程 → Worker:
worker.postMessage("hello");
Worker → 主线程:
postMessage({ count: 100 });
主线程接收:
worker.onmessage = (e) => console.log(e.data);
Worker 接收:
onmessage = (e) => console.log(e.data);
主线程终止:
worker.terminate();
Worker 自己终止:
close();
只要任务可能卡住 UI,就应该丢到 Worker。