Middle
Ce sunt web workers și la ce sunt folosiți?
sobes.tech AI
Răspuns de la AI
Web workerii sunt o metodă de a executa scripturi în fire de fundal, separate de firul principal al interfeței utilizatorului.
Scopul lor principal:
- Îmbunătățirea performanței: Transferarea sarcinilor intensive în resurse (calcule complexe, procesarea unor volume mari de date, parsing) din firul principal, care se ocupă de randarea interfeței și gestionarea evenimentelor utilizatorului. Acest lucru previne blocarea paginii și îmbunătățește răspunsul aplicației.
- Paralelism: Permite executarea mai multor sarcini simultan, utilizând mai eficient procesoarele multi-core.
Există trei tipuri de web workers:
- Dedicated Workers: Asociați cu o pagină specifică și accesibili doar acesteia.
- Shared Workers: Pot fi accesibili din mai multe pagini sau file de tab din același domeniu.
- Service Workers: Funcționează ca proxy-uri de rețea, interceptând cererile de rețea și permițând implementarea funcționalităților offline, notificări push și alte capabilități ale aplicațiilor web progresive (PWA).
Principii de funcționare:
- Context separat: Worker-ul are propriul obiect global și acces la un subset al API-ului browser-ului (fără acces la DOM,
window,document,parent). - Schimb de mesaje: Interacțiunea între firul principal și worker se face prin mesaje cu
postMessage()și handler-ul de evenimenteonmessage. Datele sunt transmise prin valoare (copiate) sau prin referință (Obiecte Transferabile).
Exemplu de utilizare a unui Dedicated Worker:
// main.js (firul principal)
const worker = new Worker('worker.js'); // Crearea worker-ului
worker.onmessage = (event) => {
// Procesarea mesajului de la worker
console.log('Primite de la worker:', event.data);
};
worker.postMessage('Începe o operație complexă'); // Trimiterea mesajului către worker
// worker.js (fișierul worker)
onmessage = (event) => {
// Procesarea mesajului din firul principal
console.log('Primite de la firul principal:', event.data);
// Executarea unei sarcini complexe
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
// Trimiterea rezultatului înapoi
postMessage(result);
};