DEV Community

Mohsen Fallahnejad
Mohsen Fallahnejad

Posted on Edited on Originally published at bitlyst.blog

Web Workers Explained for Frontend Developers

Web Workers Explained for Frontend Developers

JavaScript in the browser is single-threaded β€” but modern web apps often need to do heavy work without freezing the UI.

That’s where Web Workers come in.

Web Workers allow real parallel execution of JavaScript code in the browser.


🧠 The Problem Web Workers Solve

Without workers, heavy computations block the main thread:

button.onclick = () => {
  heavyCalculation(); // ❌ UI freezes
};
Enter fullscreen mode Exit fullscreen mode

Symptoms:

  • Scrolling jank
  • Input lag
  • β€œPage is unresponsive” warnings

Why?
πŸ‘‰ The main thread is responsible for:

  • Rendering
  • User input
  • Running JS

Block it, and everything stops.


πŸš€ What Is a Web Worker?

A Web Worker is:

  • A separate JavaScript thread
  • Running in parallel to the main thread
  • With its own event loop
  • No access to the DOM

This is true parallelism, not just async I/O.


🧱 Main Thread vs Worker

Capability Main Thread Web Worker
Run JS βœ… βœ…
DOM access βœ… ❌
Parallel execution ❌ βœ…
Network requests βœ… βœ…
Timers βœ… βœ…
Blocking UI ❌ ❌ (isolated)

βš™οΈ Basic Example

worker.js

self.onmessage = (event) => {
  const result = event.data * 2;
  self.postMessage(result);
};
Enter fullscreen mode Exit fullscreen mode

main.js

const worker = new Worker("worker.js");

worker.postMessage(10);

worker.onmessage = (event) => {
  console.log("Result from worker:", event.data);
};
Enter fullscreen mode Exit fullscreen mode

Flow:

Main Thread β†’ postMessage β†’ Worker
  └─ Worker responds β†’ postMessage β†’ Main Thread
Enter fullscreen mode Exit fullscreen mode

πŸ” Communication Model

Workers communicate via message passing, not shared memory (by default).

  • Data is copied using the structured clone algorithm
  • No race conditions
  • No shared mutable state
worker.postMessage({ numbers: [1, 2, 3] });
Enter fullscreen mode Exit fullscreen mode

⚑ Transferable Objects (Advanced)

To avoid copying large data:

worker.postMessage(buffer, [buffer]);
Enter fullscreen mode Exit fullscreen mode
  • Ownership transfers to the worker
  • Zero-copy
  • Original buffer becomes unusable on main thread

Great for:

  • Image processing
  • Audio buffers
  • Large datasets

🧩 Real-World Use Cases

βœ… CPU-heavy work:

  • Data processing
  • Encryption / hashing
  • Image resizing
  • PDF parsing
  • Chart calculations

❌ Not for:

  • DOM updates
  • Simple async calls
  • Lightweight logic

βš›οΈ Using Web Workers with React

useEffect(() => {
  const worker = new Worker(new URL("./worker.js", import.meta.url));

  worker.postMessage(data);

  worker.onmessage = (e) => {
    setResult(e.data);
  };

  return () => worker.terminate();
}, []);
Enter fullscreen mode Exit fullscreen mode

Best practice:

  • Create workers lazily
  • Terminate when not needed
  • Keep worker logic pure

🧠 Web Workers vs async/await

Feature async/await Web Worker
Parallel JS ❌ βœ…
I/O concurrency βœ… βœ…
CPU offloading ❌ βœ…
DOM access βœ… ❌

πŸ§ͺ Types of Workers

Type Description
Dedicated Worker One page ↔ one worker
Shared Worker Multiple tabs share
Service Worker Network proxy / offline

This article focuses on Dedicated Workers.


⚠️ Common Mistakes

❌ Doing DOM work in workers

❌ Spawning too many workers

❌ Sending huge objects without transferables

❌ Forgetting to terminate workers


🧠 Mental Model

  • Main thread = UI brain
  • Worker = background CPU
  • Messages = mailbox

Workers do the heavy lifting.
Main thread stays smooth.


βœ… Summary

Concept Meaning
Web Worker Background JS thread
Parallelism Real CPU parallel execution
Communication postMessage
DOM access Not allowed
Best use Heavy computation

✨ Final Takeaway

If async/await gives you concurrency, Web Workers give you parallelism.

Use them when performance truly matters.


Suggested follow-ups

  • SharedArrayBuffer & Atomics
  • Worker Pools
  • OffscreenCanvas

Originally published on Bitlyst.

Top comments (0)