Előfordult már, hogy kódot kellett futtatnia a böngészőben, amely olyan sokáig tartott, amíg az alkalmazás nem válaszol egy ideig? A HTML5 webmunkásaival ezt soha többé nem kell megtapasztalnia.
A webmunkások lehetővé teszik a régóta futó kód elkülönítését, és az oldalon futó egyéb kódoktól függetlenül történő futtatását. Ezáltal a felhasználói felület érzékeny marad, még összetett műveletek során is.
Mik azok a webmunkások?
A JavaScript hagyományosan egyszálú nyelv. Ez azt jelenti, hogy semmi más nem futhat, amíg egy kódrészlet fut. Például, ha kódja egy DOM-elemet próbál animálni, a változót módosítani próbáló kódnak meg kell várnia az animáció végét, mielőtt futhat.
A webmunkások olyan JavaScript-fájlok, amelyek külön szálban futnak le, és nincs közvetlen hozzáférésük a DOM-hoz.
A webmunkások egyik módja az, hogy olyan kóddarabokról van szó, amelyek futtatása sok időt vesz igénybe, ezért átadja őket a böngészőnek, hogy a háttérben végrehajtsák. Mivel ez a kód most a háttérben fut, nincs hatással a weboldaláért felelős JavaScript-re.
Mellékhatásként már nem tud közvetlenül kapcsolatba lépni a kód többi részével, így a webes dolgozók nem férhetnek hozzá a DOM-hoz. Sok más böngésző API azonban továbbra is elérhető, beleértve a WebSocket és a Fetch API-kat.
A webmunkások azonban nincsenek teljesen elszigetelve a fő száltól. Amikor egy dolgozónak kommunikálnia kell a főszállal, üzenetet küldhet, a főszál pedig saját üzenetet küldhet válaszul.
Miért webmunkások?
A webmunkások előtt a JavaScript futtatásának egyetlen módja, amely sok időt igényelt a böngészőben, a következő volt:
- Fogadja el, hogy az oldal egy ideig nem válaszol.
- Törje be a kódot aszinkron darabok.
Mivel a nem reagáló oldal általában rossz felhasználói élményt jelent, választhatja az aszinkron opciót. A kód ilyen módon történő megírása azt jelenti, hogy kisebb részekre osztja azt a böngésző, amelyet akkor is futtathat, amikor nem kezeli a felhasználói felületet. A daraboknak elég kicsinek kell lenniük ahhoz, hogy ha a felhasználói felület frissítésre szorul, a böngésző befejezhesse az aktuális darab végrehajtását, és kezelhesse a felhasználói felületet.
A webmunkásokat hozzáadták a HTML5-höz, hogy jobb megoldást kínáljanak erre a problémára. Ahelyett, hogy kreatívnak kényszerítenék az aszinkron kódot, lehetővé teszik a függvények tisztán elkülönítését, hogy a saját elszigetelt szálában fussanak.
Ez megkönnyítette a fejlesztők számára az ilyen kódok megírását, és javította a felhasználói élményt is.
Használati esetek webmunkásoknak
Minden olyan alkalmazás, amely sok számítást igényel az ügyféloldalon, profitálhat a webes dolgozókból.
Tegyük fel például, hogy az alkalmazás használati jelentést szeretne létrehozni, és adatvédelmi aggályok miatt tárolja az ügyfél összes adatát.
A jelentés létrehozásához a webalkalmazásnak le kell kérnie az adatokat, számításokat kell futtatnia rajtuk, rendszereznie kell az eredményeket, és be kell mutatnia a felhasználónak.
Ha ezt a főszálban próbálná megtenni, a felhasználó teljesen képtelen lenne használni az alkalmazást, amíg az alkalmazás feldolgozta az adatokat. Ehelyett a kód egy részét vagy egészét áthelyezheti egy webmunkásba. Ez lehetővé teszi a felhasználó számára, hogy továbbra is használja az alkalmazást a számítások végrehajtása közben.
Web Workers használata JavaScriptben
Az Web Worker API meghatározza, hogyan kell használni a webmunkásokat. Ennek az API-nak a használata magában foglalja a Worker objektum létrehozását a Worker konstruktorral, így:
legyen newWorker = Dolgozó('dolgozó.js');
Az Munkás A konstruktor elfogadja a JavaScript fájl nevét paraméterként, és egy új szálban futtatja a fájlt. Egy Worker objektumot ad vissza, hogy lehetővé tegye a fő szálnak, hogy kölcsönhatásba lépjen a dolgozó szállal.
A dolgozók oda-vissza üzenetek küldésével lépnek kapcsolatba a főszállal. Használod a postMessage funkció események küldésére a dolgozó és a fő szál között. Használja a üzenetben eseményfigyelő, amellyel meghallgathatja a másik fél üzeneteit.
Itt van egy kódpélda. Először is, egy főszál így nézhet ki:
hagyja munkás = új Dolgozó('dolgozó.js')
worker.postMessage('Hé!')
dolgozó.onmessage = funkció(e) {
console.log('Munkásszál azt mondja', e.data)
}
Ez a főszál létrehoz egy worker objektumot a worker.js fájlból, majd üzenetet küld neki a következővel dolgozó.postÜzenet. Ezután meghatároz egy eseményfigyelőt, amely hasonló a koncepcióhoz DOM eseményfigyelő. Egy esemény minden alkalommal aktiválódik, amikor a dolgozó üzenetet küld vissza a fő szálnak, és a kezelő naplózza a dolgozó üzenetét a konzolon.
A dolgozón belüli kód (worker.js) egy feladattal rendelkezik:
onmessage = funkció(e) {
hagyja üzenet = e.data;
console.log('Fő szál mondta', üzenet);
postMessage('Szia!')
}
Figyeli a fő szálról küldött üzeneteket, naplózza az üzenetet a konzolon, és visszaküldi a fő szálnak.
Ebben a példában az üzenetek mind karakterláncok voltak, de ez nem feltétel: szinte bármilyen típusú adatot elküldhet üzenetként.
Azokat a munkásokat, amelyeket eddig látott, elkötelezett munkásoknak hívják. Csak abból a fájlból érheti el őket, amelyben létrehozta őket (ezt szánják). A megosztott dolgozók ennek az ellenkezője: több fájlból is fogadhatnak és küldhetnek üzeneteket. A megosztott munkavállalók fogalmilag ugyanazok, mint az elkötelezett munkavállalók, de egy kicsit másképp kell őket használni.
Nézzünk egy példát. A Worker konstruktor használata helyett minden fájlnak, amely megosztott dolgozót szeretne használni, létre kell hoznia egy worker objektumot a SharedWorker():
hagyja shareWorker = új SharedWorker('worker.js')
A különbségek azonban nem állnak meg itt. Ahhoz, hogy egy fájl üzenetet küldhessen vagy fogadhasson egy megosztott dolgozótól, ezt az a kikötő tárgyat, ahelyett, hogy ezt közvetlenül tenné. Így néz ki:
sharedWorker.port.postMessage('Szia!')
shareWorker.port.onMessage = funkció(e) {
console.log('A megosztott munkás küldött', e.data);
}
A port objektumot a dolgozón belül is használni kell:
onconnect = funkció(e) {
const port = e.ports[0];
port.onmessage = funkció(e) {
console.log('Üzenet érkezett', e.data)
port.postMessage('Szia!');
}
}
Az onconnect a figyelő minden alkalommal aktiválódik, amikor egy porthoz csatlakozik (amikor egy üzenetben eseményfigyelő van beállítva a főszálban).
Amikor ez megtörténik, a kód megkapja azt a portot, amelyre éppen csatlakozott a csatlakozási eseményből, és egy változóban tárolja. Ezután a kód regisztrálja a üzenetben figyelő a port objektumon. A kód ezután naplózza az üzenetet a konzolon, és a portot használja az üzenet visszaküldésére a fő szálnak.
A webmunkások javítják a felhasználói élményt
A webmunkások olyan JavaScript-szálak, amelyek lehetővé teszik összetett és hosszú ideig futó kódrészletek futtatását a háttérben. Ez a kód elkerüli a felhasználói felület blokkolását. A webmunkások használata sokkal könnyebbé teszi az ilyen típusú kódok írását, és javítja az alkalmazás felhasználói élményét. A webmunkás API segítségével webmunkásokat hozhat létre, és interakcióba léphet velük.