DEV Community

Atlas Whoff
Atlas Whoff

Posted on

Web Workers: Run Heavy Computation Without Freezing the UI

Web Workers: Run Heavy Computation Without Freezing the UI

JavaScript is single-threaded. Heavy computation on the main thread blocks everything — animations, input response, scrolling. Web Workers run JS in a background thread.

When to Use Workers

Use a Web Worker for tasks taking more than ~16ms:

  • Parsing large JSON or CSV files
  • Image processing
  • Cryptographic operations
  • Complex data transformations over large datasets

Basic Setup

// worker.ts
self.addEventListener('message', (event: MessageEvent) => {
  const { data, operation } = event.data;
  if (operation === 'sort') {
    const sorted = data.sort((a: number, b: number) => a - b);
    self.postMessage({ result: sorted });
  }
});
Enter fullscreen mode Exit fullscreen mode
// main.ts
const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });

worker.addEventListener('message', (event) => setData(event.data.result));

function sortInBackground(data: number[]) {
  worker.postMessage({ operation: 'sort', data });
  // Returns immediately — UI stays responsive
}
Enter fullscreen mode Exit fullscreen mode

Comlink: The Clean API

// worker.ts
import { expose } from 'comlink';
expose({ async parseCSV(csv: string) { return parse(csv); } });

// main.ts
import { wrap } from 'comlink';
const api = wrap<typeof api>(new Worker('./worker.ts'));
const result = await api.parseCSV(csvString); // runs in worker
Enter fullscreen mode Exit fullscreen mode

Transferable Objects

For large ArrayBuffers, transfer ownership instead of copying:

const buffer = new ArrayBuffer(100 * 1024 * 1024);
worker.postMessage({ buffer }, [buffer]); // zero-copy transfer
Enter fullscreen mode Exit fullscreen mode

Web Workers, optimistic updates, code splitting — the performance patterns that separate fast apps from slow ones are part of the Ship Fast Skill Pack.

Top comments (0)