[Lv3] Web Worker 应用:后台运算不阻塞 UI
Web Worker 是一个在浏览器后台线程中运行 JavaScript 的 API,让你能够执行耗时的运算而不会阻塞主线程(UI 线程)。
核心概念
问题背景
JavaScript 原本是单线程的,所有代码都在主线程执行:
// ❌ 耗时运算阻塞主线程
function heavyComputation() {
for (let i = 0; i < 10000000000; i++) {
// 复杂计算
}
return result;
}
// 执行时整个页面冻结
const result = heavyComputation(); // UI 无法交互 😢
问题:
- 页面卡住,用户无法点击、 滚动
- 动画停止
- 用户体验极差
Web Worker 解决方案
Web Worker 提供多线程能力,让耗时任务在后台执行:
// ✅ 使用 Worker 在后台执行
const worker = new Worker('worker.js');
// 主线程不阻塞,页面依然可以交互
worker.postMessage({ data: largeData });
worker.onmessage = (e) => {
console.log('后台运算完成:', e.data);
};
情境 1:大数据处理
// main.js
const worker = new Worker('worker.js');
// 处理大型 JSON 数据
worker.postMessage({ data: largeDataArray, action: 'process' });
worker.onmessage = function (e) {
console.log('处理结果:', e.data);
};
// worker.js
self.onmessage = function (e) {
const { data, action } = e.data;
if (action === 'process') {
// 执行耗时的数据处理
const result = data.map((item) => {
// 复杂运算
return heavyComputation(item);
});
self.postMessage(result);
}
};
情境 2:图片处理
处理图片滤镜、压缩、像素操作等,避免冻结 UI。
情境 3:复杂计算
数学运算(如质数计算、加密解密) 大型文件的哈希值计算 数据分析和统计
使用限制与注意事项
不能在 Worker 中做的事
- 直接操作 DOM
- 访问 window、document、parent 对象
- 使用某些 Web API(如 alert)