Web Worker chạy JavaScript trên một luồng riêng, nên tính toán nặng không làm đứng giao diện.
// main.js
const worker = new Worker('/worker.js', { type: 'module' })
worker.postMessage({ rows }) // dữ liệu được COPY sang worker
worker.onmessage = (e) => render(e.data)
worker.onerror = (e) => console.error(e.message)
// worker.terminate() khi không cần nữa
// worker.js
self.onmessage = (e) => {
const result = heavyParse(e.data.rows) // chạy bao lâu cũng không chặn UI
self.postMessage(result)
}Worker không truy cập được DOM, window, document. Nó có fetch, WebSocket, IndexedDB, crypto — đủ cho phần lớn việc xử lý dữ liệu.
Dữ liệu qua postMessage được sao chép (structured clone), nên gửi mảng rất lớn cũng tốn thời gian. Với dữ liệu nhị phân, chuyển quyền sở hữu để tránh copy:
worker.postMessage(buffer, [buffer]) // transferable: gần như tức thìKhi nào dùng: parse file lớn (CSV, JSON hàng chục MB), xử lý ảnh, mã hoá, nén, tính toán trên tập dữ liệu lớn.
Khi nào không dùng: việc chỉ vài ms — chi phí khởi tạo worker và copy dữ liệu còn lớn hơn phần tiết kiệm được.
Lưu ý: worker không tự chia sẻ trạng thái với main thread. Muốn chia sẻ bộ nhớ thật phải dùng SharedArrayBuffer, và nó yêu cầu header Cross-Origin-Opener-Policy + Cross-Origin-Embedder-Policy — một rào cản triển khai thường bị bỏ sót.