HTML Web Workers
Run JavaScript in the background without blocking the UI
⚡ What are Web Workers?
Web Workers allow you to run JavaScript in the background, separate from the main thread. This prevents heavy computations from freezing your web page.
// Create a new Web Worker
const worker = new Worker('worker.js');
// Send data to worker
worker.postMessage('Hello Worker!');
// Receive data from worker
worker.onmessage = function(e) {
console.log('Message from worker:', e.data);
};
Try it:
Web Worker Features
Background Processing
Run scripts without blocking the UI
// Heavy computation in worker
for(let i = 0; i < 1000000; i++) {
// Complex calculation
}
Message Passing
Communicate between main thread and worker
// Send message
worker.postMessage(data);
// Receive message
worker.onmessage = (e) => {
console.log(e.data);
};
Isolated Environment
Workers run in separate context
// Worker can't access DOM
// No window object
// No parent object
Performance
Improve app responsiveness
// UI stays responsive
// while worker processes data
worker.postMessage(bigData);
🔹 Creating a Simple Web Worker
Here's how to create and use a basic Web Worker:
// main.js - Main thread
const worker = new Worker('worker.js');
// Send data to worker
worker.postMessage({
command: 'calculate',
numbers: [1, 2, 3, 4, 5]
});
// Listen for messages from worker
worker.onmessage = function(e) {
document.getElementById('result').textContent = e.data;
};
// Handle errors
worker.onerror = function(error) {
console.error('Worker error:', error);
};
Worker File (worker.js):
// worker.js - Worker thread
self.onmessage = function(e) {
const { command, numbers } = e.data;
if (command === 'calculate') {
const sum = numbers.reduce((a, b) => a + b, 0);
self.postMessage(`Sum: ${sum}`);
}
};
🔹 Practical Example: Prime Number Calculator
Let's create a worker that calculates prime numbers without freezing the UI:
<!-- HTML -->
<button onclick="calculatePrimes()">Calculate Primes</button>
<div id="prime-result"></div>
<div id="ui-test">
<button onclick="testUI()">Test UI Responsiveness</button>
</div>
// JavaScript
function calculatePrimes() {
const worker = new Worker('prime-worker.js');
worker.postMessage({ start: 1, end: 10000 });
worker.onmessage = function(e) {
document.getElementById('prime-result').innerHTML =
`Found ${e.data.count} prime numbers: ${e.data.primes.slice(0, 10).join(', ')}...`;
};
}
function testUI() {
alert('UI is responsive!');
}