[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)