Middle
Mi azok a web worker-ek és mire jók?
sobes.tech MI
Válasz az MI-től
A web worker-ek olyan módszerek, amelyek segítségével szkriptek futtathatók háttérszálakon, elkülönítve a fő felhasználói felület szálától.
Fő céljuk:
- A teljesítmény növelése: Erőforrás-igényes feladatok (összetett számítások, nagy adatmennyiség feldolgozása, parsing) áthelyezése a fő szálról, amely a felület rendereléséért és a felhasználói események kezeléséért felelős. Ez megakadályozza az oldal lefagyását és javítja az alkalmazás válaszkészségét.
- Párhuzamosság: Lehetővé teszi több feladat egyidejű végrehajtását, hatékonyabban kihasználva a többmagos processzorokat.
Három típusú web worker létezik:
- Dedicated Workers: Egy adott oldalhoz kötöttek, és csak az adott oldalról érhetők el.
- Shared Workers: Több oldal vagy lap között is elérhetők ugyanazon domainen.
- Service Workers: Hálózati proxy-ként működnek, elfogják a hálózati kéréseket, és lehetővé teszik offline funkciók, push értesítések és más fejlett webalkalmazás (PWA) képességek megvalósítását.
Működési elvek:
- Külön kontextus: A worker saját globális objektummal rendelkezik, és hozzáférése van a böngésző API-k egy részéhez (DOM,
window,document,parenthozzáférés nélkül). - Üzenetcsere: A fő szál és a worker közötti kommunikáció az
postMessage()és azonmessageeseménykezelő segítségével történik. Az adatok érték szerint (másolva) vagy hivatkozás szerint (Transferable Objects) kerülnek átadásra.
Példa egy dedikált worker használatára:
// main.js (fő szál)
const worker = new Worker('worker.js'); // Worker létrehozása
worker.onmessage = (event) => {
// Üzenet feldolgozása a workertől
console.log('A worker-től kapott:', event.data);
};
worker.postMessage('Komplex művelet indítása'); // Üzenet küldése a worker-nek
// worker.js (worker fájl)
onmessage = (event) => {
// Üzenet feldolgozása a fő szálról
console.log('A fő szál-tól kapott:', event.data);
// Komplex feladat végrehajtása
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
// Eredmény visszaküldése
postMessage(result);
};