JavaScript ha un solo thread, quindi un calcolo pesante congela l'interfaccia. I Web Worker eseguono codice in un thread separato: la UI resta fluida.

// main.js
const worker = new Worker("worker.js");
worker.postMessage({ numeri: grandeArray });
worker.onmessage = (e) => console.log("Risultato:", e.data);

// worker.js
onmessage = (e) => {
  const somma = e.data.numeri.reduce((a, b) => a + b, 0);
  postMessage(somma); // rimanda il risultato al thread principale
};

I due mondi non condividono memoria: comunicano solo con messaggi (postMessage) e li ricevono con onmessage. Il worker non può toccare il DOM, ma può fare qualsiasi calcolo, chiamare fetch, elaborare dati.

Quando usarli: parsing di file enormi, elaborazione di immagini, crittografia, qualsiasi cosa impieghi più di qualche decina di millisecondi. Sposti il carico fuori dal thread principale e l'utente continua a scrollare e cliccare senza scatti. La reattività ringrazia.