下面给你一个 最清晰 + 最实用 + 可直接运行 的 HTML5 Web Worker(多线程)完整教程与示例代码。
✅ 一、Web Worker 是什么?
Web Worker 允许你在 浏览器开辟子线程 来执行耗时任务,例如:
- 大量计算(排序、加密、压缩)
- 网络请求并行处理
- 大数组处理
- 音视频处理
- 图像处理(像素级操作)
它的特点:
| 特点 | 说明 |
|---|---|
| ✔ 真正的多线程 | Worker 在浏览器独立线程运行 |
| ✔ 不阻塞 UI | 主线程不会卡顿 |
| ✔ 独立作用域 | Worker 不能直接操作 DOM |
| ✔ 可与主线程通信 | 使用 postMessage() |
✅ 二、最小可运行示例(推荐从这里开始)
📄 main.html(主线程)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Web Worker Demo</title></head>
<body>
<button id="start">开始计算</button>
<div id="result"></div>
<script>
let worker;
document.getElementById("start").onclick = () => {
// 创建 Worker
worker = new Worker("worker.js");
// 接收 Worker 结果
worker.onmessage = function (e) {
document.getElementById("result").innerText = "计算结果: " + e.data;
worker.terminate(); // 用完关闭
};
// 发送数据到 Worker
worker.postMessage(100000000); // 给 worker 一个参数
};
</script>
</body>
</html>
📄 worker.js(子线程)
// 接收主线程消息
onmessage = function (e) {
const max = e.data;
// 做一个耗时任务(大量累加)
let sum = 0;
for (let i = 0; i < max; i++) {
sum += i;
}
// 把结果返回给主线程
postMessage(sum);
};
📌 效果:
点击按钮,你会看到 UI 不会卡顿,因为计算在 Worker 线程执行。
✅ 三、Web Worker 的创建方法
const worker = new Worker("worker.js");
worker.postMessage(data);
worker.onmessage = (e) => console.log(e.data);
worker.terminate();
✅ 四、主线程与 Worker 通信
主线程 → Worker
worker.postMessage({ x: 1, y: 2 });
Worker → 主线程
postMessage(result);
双向通信(最通用)
// main.js
worker.onmessage = function (e) {
console.log("主线程收到:", e.data);
};
// worker.js
self.onmessage = function (e) {
console.log("worker 收到:", e.data);
};
✅ 五、Worker 内不能做什么?
| 功能 | 能用吗? |
|---|---|
| DOM 操作 | ❌ 不能 |
| window 对象 | ❌ 不能访问 |
| document | ❌ 不能使用 |
| alert / confirm | ❌ 不能 |
| Ajax(fetch/XMLHttpRequest) | ✔ 能用 |
| 定时器 setTimeout/setInterval | ✔ 能用 |
| importScripts() | ✔ 能用 |
| IndexedDB | ✔ 能用 |
✅ 六、支持模块 Worker(ES Module)
如果你项目需要 import/ESM,可这样写:
const worker = new Worker("worker.js", { type: "module" });
worker.js:
import { heavyCalc } from "./calc.js";
onmessage = (e) => postMessage(heavyCalc(e.data));
✅ 七、多个 Worker 并行加速
const workers = [];
for (let i = 0; i < 4; i++) {
workers[i] = new Worker("worker.js");
workers[i].postMessage(i);
}
用于:
- 大文件切片处理
- 图像处理
- 大规模数据计算
✅ 八、示例:利用 Worker 加速大数组排序 10 倍
main.js
const worker = new Worker("sortWorker.js");
worker.onmessage = (e) => {
console.log("排序完成", e.data);
};
worker.postMessage(largeArray);
sortWorker.js
onmessage = (e) => {
const arr = e.data;
arr.sort((a, b) => a - b);
postMessage(arr);
};
✅ 九、示例:Worker 执行 fetch
onmessage = async () => {
const res = await fetch("https://api.example.com/data");
postMessage(await res.json());
};
🔟 十、Worker 错误捕获
worker.onerror = function (err) {
console.error("worker error", err.message);
};
发表回复