Sobes.tech
Middle

Ce sunt web workers și la ce sunt folosiți?

sobes.tech AI

Răspuns de la AI

Web workerii sunt o modalitate de a rula cod JavaScript într-un fir de execuție de fundal, separat de firul principal de UI al browserului.

Scop:

  • Executarea calculurilor intensive în resurse fără blocarea firului principal, prevenind blocarea interfeței.
  • Procesarea datelor mari sau efectuarea operațiunilor lungi (de exemplu, parsing, comprimare, solicitări de rețea în unele cazuri) în fundal.
  • Îmbunătățirea performanței și a răspunsului aplicațiilor web.

Tipuri de web worker:

  1. Dedicated Worker: Asociat cu scriptul care l-a creat.
  2. Shared Worker: Poate fi partajat între mai multe scripturi care rulează în ferestre sau file diferite ale aceluiași domeniu.
  3. Service Worker: Interceptează solicitările de rețea, gestionează cache-ul, oferă acces offline, suportă notificări push.

Exemplu de creare și utilizare a unui Dedicated Worker:

// main.js (firul principal)
const worker = new Worker('worker.js');

// Trimiterea unui mesaj către worker
worker.postMessage('Începe calcule grele');

// Primirea mesajelor de la worker
worker.onmessage = function(event) {
  console.log('Primite de la worker:', event.data);
};

// worker.js (codul workerului)
self.onmessage = function(event) {
  console.log('Primite în worker:', event.data);

  // Simulare de calcule grele
  let result = 0;
  for (let i = 0; i < 1000000000; i++) {
    result += i;
  }

  // Trimiterea mesajului înapoi către firul principal
  self.postMessage('Calculul s-a încheiat, rezultatul: ' + result);
};

Limitări:

  • Fără acces direct la DOM.
  • Nu se pot folosi unele variabile globale ale firului principal (de exemplu, window, document).
  • Comunicația se face prin schimb asincron de mesaje (postMessage și onmessage/addEventListener('message')).
  • Datele între fire sunt transferate prin copiere (algoritmul de clonare structurată), dar pentru date mari se pot folosi Transferable Objects pentru transfer prin referință (cu pierderea accesului în firul original).