Do tej pory duża część treści w tym kursie skupiała się na takich zagadnieniach, jak: ogólne kwestie dotyczące wydajności kodu HTML, wskazówki dotyczące zasobów, optymalizację różnych typów zasobów w celu skrócenia czasu początkowego wczytywania strony i reagowania na użytkownika oraz leniwe ładowanie konkretnych zasobów.
Jest jednak jeden aspekt wydajności JavaScriptu, który nie był dotąd omówione już w ramach tego szkolenia. Taka rola pracowników internetowych w responsywność danych wejściowych, którą omawiamy w tym i następnym module.
JavaScript jest często określany jako język jednowątkowy. W praktyce odnosi się do wątku głównego, czyli pojedynczego wątku, w którym przeglądarka większość czynności, które wykonujemy w przeglądarce. Te zadania obejmują zadania w obszarach takich jak obsługa skryptów, niektóre rodzaje renderowania, analiza HTML i CSS, i inne, które zwiększają wygodę użytkowników. Tak naprawdę przeglądarki używają innych wątków, by wykonać pracę, której nie zwykle mają bezpośredni dostęp, np. do wątków GPU.
Jeśli chodzi o obsługę języka JavaScript, zazwyczaj ograniczono się do wykonywania w wątku głównym, ale tylko domyślnie. Można zarejestrować się i korzystać w kolejnych wątkach w JavaScripcie. Funkcja umożliwiająca wielowątkowość JavaScript jest nazywany interfejsem Web Workers API.
Internetowe instancje robocze przydają się, gdy praca wymaga kosztownych obliczeń, nie można uruchomić w wątku głównym bez wywoływania długich zadań, które tworzą stronę nie odpowiada. Mogą one z pewnością wpłynąć na interakcje z witryną Next Paint (INP), aby dowiedzieć się, kiedy masz pracę, którą można całkowicie poza głównym wątkiem. W ten sposób można uzyskać więcej miejsca wykonywać inne zadania w wątku głównym, co przyspieszy interakcję z użytkownikami.
W tym module i kolejnej prezentacji przedstawiającej konkretny przypadek użycia odnoszą się pracowników. Sama demonstracja pokazuje, jak można wykorzystać narzędzie internetowe do wykonania danej pracy. odczytu metadanych obrazu z pliku JPEG poza wątkiem głównym. mogą przywrócić te metadane z powrotem do wątku głównego widocznego dla użytkownika.
Uruchamianie narzędzia Web Worker
Proces internetowy można zarejestrować przez utworzenie instancji klasy Worker. Kiedy to zrobisz
więc musisz określić, gdzie znajduje się kod instancji internetowej, który wczytuje
a potem tworzy nowy wątek na ich temat. Powstały wątek jest często nazywany
wątek roboczy.
const myWebWorker = new Worker('/js/my-web-worker.js');
W pliku JavaScript instancji roboczej – w tym przypadku my-web-worker.js – możesz
Napisać kod, który będzie uruchamiany w osobnym wątku roboczym.
Ograniczenia instancji internetowych
W przeciwieństwie do JavaScriptu, który działa w wątku głównym, instancje internetowe nie mają bezpośredniego dostępu.
w kontekście window. i mieć ograniczony dostęp do interfejsów API, Sieć
instancje robocze podlegają tym ograniczeniom:
- Instancje robocze nie mają bezpośredniego dostępu do DOM.
- Pracownicy internetowe mogą komunikować się z kontekstem
windowza pomocą wiadomości potoku, co oznacza, że narzędzie internetowe może pośrednio uzyskać dostęp do DOM. - Zakres instancji roboczej to
self, a niewindow. - Zakres instancji roboczej ma dostęp do elementów podstawowych JavaScript
a także interfejsy API, takie jak
fetchi dość dużą liczbę innych interfejsów API.
Jak pracownicy internetowi komunikują się z window
Pracownik internetowy może komunikować się z elementem window wątku głównego
w kontekście
potoku wiadomości. Ten potok umożliwia przesyłanie danych do
z wątku głównego i instancji roboczej. Aby wysłać dane z instancji roboczej do
w wątku głównym, skonfigurowano zdarzenie message w kontekście instancji roboczej (self)
// my-web-worker.js
self.addEventListener("message", () => {
// Sends a message of "Hellow, window!" from the web worker:
self.postMessage("Hello, window!");
});
Następnie w skrypcie w kontekście window w wątku głównym możesz uzyskać
wiadomość z wątku Web Worker przy użyciu jeszcze innego zdarzenia message:
// scripts.js
// Creates the web worker:
const myWebWorker = new Worker('/js/my-web-worker.js');
// Adds an event listener on the web worker instance that listens for messages:
myWebWorker.addEventListener("message", ({ data }) => {
// Echoes "Hello, window!" to the console from the worker.
console.log(data);
});
Potok do komunikacji dla pracownika internetowego to pewna możliwość wyjścia z sieci
kontekstu instancji roboczej. Za jego pomocą możesz wysyłać dane z interfejsu webowego do window
których można użyć do aktualizacji DOM lub wykonać inne prace
w wątku głównym.
Sprawdź swoją wiedzę
W jakim wątku działa narzędzie Web Worker?
Do jakich treści może mieć dostęp pracownik internetowy?
window,
w tym fetch.
window, ale tylko pośrednio.W jaki sposób pracownik internetowy może uzyskać dostęp do kontekstu okna?
window.
window.
postMessage
w kontekście instancji roboczej (self).
Kolejny krok: konkretny przypadek użycia dla pracowników internetowych
W następnym module przedstawiliśmy szczegółowy przykład użycia środowiska internetowego, co pokazujemy. W tym module narzędzie Web Worker pobiera plik JPEG z danego adresu URL i odczytać jego metadane EXif w instancji roboczej. Dane te są następnie wysyłane aby wrócić do wątku głównego.