Docs
README
18.4 Web Workers
Overview
Web Workers allow JavaScript to run in background threads, enabling parallel execution without blocking the main thread.
Why Web Workers?
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Main Thread Problem ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā WITHOUT WEB WORKERS: ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Main Thread ā ā
ā ā āāāāāāā āāāāāāāāāāāāāāāāāāāāāāāā āāāāāāā ā ā
ā ā ā UI ā ā Heavy Computation ā ā UI ā ā ā
ā ā āāāāāāā āāāāāāāāāāāāāāāāāāāāāāāā āāāāāāā ā ā
ā ā ā UI FROZEN! ā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā
ā WITH WEB WORKERS: ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Main Thread ā ā
ā ā āāāāāāā āāāāāāā āāāāāāā āāāāāāā āāāāāāā ā ā
ā ā ā UI ā ā UI ā ā UI ā ā UI ā ā UI ā ā Smooth! ā ā
ā ā āāāāāāā āāāāāāā āāāāāāā āāāāāāā āāāāāāā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Worker Thread ā ā
ā ā āāāāāāāāāāāāāāāāāāāāāāāā ā ā
ā ā ā Heavy Computation ā ā Runs in parallel ā ā
ā ā āāāāāāāāāāāāāāāāāāāāāāāā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Types of Workers
| Type | Scope | Use Case |
|---|---|---|
| Dedicated Worker | Single page | Heavy computation |
| Shared Worker | Multiple pages | Shared state |
| Service Worker | App-wide | Caching, offline |
Basic Worker Usage
Main Thread (main.js)
// Create worker
const worker = new Worker('worker.js');
// Send message to worker
worker.postMessage({ type: 'calculate', data: [1, 2, 3] });
// Receive message from worker
worker.onmessage = (event) => {
console.log('Result:', event.data);
};
// Handle errors
worker.onerror = (error) => {
console.error('Worker error:', error);
};
// Terminate worker
worker.terminate();
Worker Thread (worker.js)
// Receive messages
self.onmessage = (event) => {
const { type, data } = event.data;
if (type === 'calculate') {
const result = heavyCalculation(data);
self.postMessage(result);
}
};
function heavyCalculation(data) {
// CPU-intensive work here
return data.reduce((a, b) => a + b, 0);
}
Communication Pattern
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Message Passing ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Main Thread Worker Thread ā
ā āāāāāāāāāāā āāāāāāāāāāā ā
ā ā ā postMessage(data) ā ā ā
ā ā ā āāāāāāāāāāāāāāāāāāāāāā¶ ā ā ā
ā ā ā ā process ā ā
ā ā ā postMessage(result) ā ā ā
ā ā ā āāāāāāāāāāāāāāāāāāāāāā ā ā ā
ā āāāāāāāāāāā āāāāāāāāāāā ā
ā ā
ā Note: Data is COPIED, not shared (structured clone) ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Transferable Objects
// Transfer ownership (no copy, just move)
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]);
// buffer is now unusable in main thread!
Worker Limitations
- ā¢No DOM access
- ā¢No window object
- ā¢Limited APIs available
- ā¢Communication overhead
- ā¢No shared memory (except SharedArrayBuffer)
Summary
- ā¢Web Workers enable parallel JavaScript
- ā¢Use for CPU-intensive tasks
- ā¢Communication via postMessage
- ā¢Data is copied, not shared
- ā¢Use transferables for large data