Moduły ES w skryptach service worker

Nowoczesna alternatywa dla funkcji importScripts().

Tło

Moduły ES jest ulubionym tematem deweloperów od dłuższego czasu. Oprócz wielu innych korzyści, To uniwersalny format modułów, gdzie wspólny kod jest wydawana jednorazowo i działa w przeglądarkach oraz w alternatywnych środowiskach wykonawczych, takich jak Node.js. Choć wszystkie nowoczesne przeglądarki obsługują tylko niektóre moduły ES, jednak nie wszystkie są dostępne wszędzie, gdy można uruchomić kod. W szczególności obsługa importu modułów ES jest obsługiwana w przeglądarki skrypt service worker staje się coraz powszechniej dostępna.

W tym artykule znajdziesz szczegółowe informacje o obecnym stanie obsługi modułu ES w mechanizmach Service Worker w popularnych przeglądarkach oraz pewne zagrożenia, których należy unikać, oraz sprawdzone metody wysyłki kodu service worker o zgodności wstecznej.

Przypadki użycia

Idealny przypadek użycia modułów ES w mechanizmach service worker to wczytywanie z nowoczesną biblioteką lub kodem konfiguracji udostępnianym innym środowiskiem wykonawczym, obsługują moduły ES.

Próba udostępnienia kodu w ten sposób przed modułami ES polegała na wykorzystaniu starszych „uniwersalne” formatów modułów, takich jak UMD, które obejmują niepotrzebny schemat i pisanie kodu, który wprowadza zmiany w udostępnianych globalnie zmiennych.

Skrypty zaimportowane przez moduły ES mogą aktywować skrypt service worker zaktualizuj w sytuacji, gdy zmieni się ich zawartość, zachowanie z importScripts().

Obecne ograniczenia

Tylko importy statyczne

Moduły ES można importować na 2 sposoby: statycznie, przy użyciu składni import ... from '...', dynamicznie, za pomocą metody import(). W mechanizmie service worker tylko statyczny składnia jest obecnie obsługiwana.

To ograniczenie jest analogiczne do podobne ograniczenie nałożonych na użycie importScripts(). Dynamiczne wywołania adresu importScripts() nie działają wewnątrz skryptu service worker, a wszystkie wywołania importScripts(), które są jest z natury synchroniczna, musi zakończyć działanie, zanim skrypt service worker zakończy faza install. To ograniczenie daje pewność, że przeglądarka wie o możesz niejawnie buforować, czyli cały kod JavaScript potrzebny do działania mechanizmu Service Worker podczas instalacji.

W przyszłości to ograniczenie może zostać zniesione, a dynamiczna ES importowanie modułów mogą być dozwolone. Na razie używaj tylko składni statycznej zawartej w parametrze skrypt service worker.

Co z innymi pracownikami?

Pomoc: Moduły ES w „dedykowanych” pracownicy, utworzone przy użyciu new Worker('...', {type: 'module'}) – jest bardziej powszechne. jest obsługiwana w Chrome i Edge od wersji 80 oraz najnowszych wersji Safari. Zarówno statyczne, jak i dynamiczne importowanie modułów ES jest obsługiwane przez dedykowane instancje robocze.

Chrome i Edge obsługują moduły ES w współdzielone instancje robocze od wersji 83, ale nie inna przeglądarka oferuje obecnie pomoc.

Brak obsługi importowania map

Importuj mapy pozwalają środowisk wykonawczych i przepisać specyfikatory modułów, na przykład dołączając na początku Adres URL preferowanej sieci CDN, z której można ładować moduły ES.

Chrome i Edge wersji 89 i nowszych obsługują importowanie map, nie można używać z usługą pracowników.

Obsługa przeglądarek

Moduły ES w mechanizmach Service Worker są obsługiwane w Chrome i Edge, zaczynając od wersji 91.

Przeglądarka Safari dodała obsługę Wersja przedpremierowa technologii 122, a deweloperzy powinni spodziewać się udostępnienia tej funkcji w wersji stabilnej, Safari w przyszłości.

Przykładowy kod

To jest podstawowy przykład wykorzystania udostępnionego modułu języka angielskiego w sekcji window aplikacji internetowej kontekstu oraz rejestrując skrypt service worker, który korzysta z tego samego modułu ES:

// Inside config.js:
export const cacheName = 'my-cache';
// Inside your web app:
<script type="module">
  import {cacheName} from './config.js';
  // Do something with cacheName.

  await navigator.serviceWorker.register('es-module-sw.js', {
    type: 'module',
  });
</script>
// Inside es-module-sw.js:
import {cacheName} from './config.js';

self.addEventListener('install', (event) => {
  event.waitUntil((async () => {
    const cache = await caches.open(cacheName);
    // ...
  })());
});

Zgodność wsteczna

Powyższy przykład działa dobrze, gdyby wszystkie przeglądarki obsługiwały moduły ES w ale na razie tak nie jest.

Aby dostosować ją do przeglądarek, które nie mają wbudowanej obsługi, możesz skrypt service worker za pomocą pakietu zgodnego z modułem ES, aby utworzyć skrypt service worker, który zawiera cały kod modułu w tekście i będzie działać starszych przeglądarek. Jeśli moduły, które próbujesz zaimportować, są dostępne w pakietach IIFE lub UMD, możesz je importować za pomocą importScripts().

Gdy będą dostępne 2 wersje skryptu service worker – jedną, która korzysta z ES modułów, a drugie nie, musisz wykryć bieżące obsługuje i zarejestruj odpowiedni skrypt service worker. Najlepsze metody wykrywania pomocy są obecnie zmieniane, ale zwróć uwagę na dyskusja w tej Problem z GitHubem dotyczący o zaleceniach.

_Fot. Vlado Paunovic na kanale Unsplash_