Udostępnianie nowoczesnego kodu w nowoczesnych przeglądarkach w celu szybszego wczytywania stron

Tworzenie witryn, które dobrze działają we wszystkich głównych przeglądarkach, to podstawowa zasada otwartego ekosystemu sieci. Oznacza to jednak, że musisz się dodatkowo upewnić, że cały napisany przez Ciebie kod jest obsługiwany w każdej przeglądarce, którą chcesz uwzględnić. Jeśli chcesz używać nowych funkcji języka JavaScript, musisz przetłumaczyć te funkcje na formaty zgodne ze starszymi wersjami w przypadku przeglądarek, które jeszcze ich nie obsługują.

Babel to najczęściej używane narzędzie do kompilowania kodu, który zawiera nowszą składnię, w kody zrozumiałe dla różnych przeglądarek i środowisk (np. Node). W tym przewodniku zakładamy, że używasz Babel. Jeśli jeszcze tego nie zrobiono, musisz wykonać instrukcje konfiguracji, aby uwzględnić Babel w aplikacji. Wybierz webpack w Build Systems, jeśli w swojej aplikacji używasz webpacka jako modułu pakietującego.

Aby używać Babela tylko do transpilacji tego, czego potrzebują użytkownicy, musisz:

  1. Określ przeglądarki, na które chcesz kierować reklamy.
  2. Użyj tagu @babel/preset-env z odpowiednimi celami przeglądarki.
  3. Użyj opcji <script type="module">, aby zatrzymać wysyłanie przetłumaczonego kodu do przeglądarek, które go nie potrzebują.

Określ przeglądarki, na które chcesz kierować reklamy

Zanim zaczniesz modyfikować sposób kompilacji kodu w aplikacji, musisz określić, które przeglądarki mają dostęp do aplikacji. Aby podjąć świadomą decyzję, sprawdź, z których przeglądarek korzystają obecnie użytkownicy, a także te, na które chcesz kierować reklamy.

Użyj @babel/preset-env.

Transpilacja kodu zwykle powoduje, że plik jest większy niż jego pierwotna forma. Minimalizując ilość kompilacji, możesz zmniejszyć rozmiar pakietów, aby poprawić wydajność strony internetowej.

Zamiast dołączać konkretne wtyczki do selektywnego kompilowania używanych funkcji językowych, Babel udostępnia kilka wstępnie skompilowanych zestawów, które zawierają wtyczki. Użyj @babel/preset-env, aby uwzględnić tylko te przekształcenia i polyfille, które są potrzebne w przypadku przeglądarek, które chcesz uwzględnić.

W pliku konfiguracji Babel .babelrc uwzględnij element @babel/preset-env w tablicy presets:

{
 "presets": [
   [
     "@babel/preset-env",
     {
       "targets": ">0.25%"
     }
   ]
 ]
}

W polu targets możesz określić, które wersje przeglądarki chcesz uwzględnić, dodając odpowiednie zapytanie do pola browsers. @babel/preset-envintegruje się z browserslist, czyli z konfiguracją open source udostępnianą między różnymi narzędziami do kierowania na przeglądarki. Pełną listę kompatybilnych zapytań znajdziesz w dokumentacji browserslist. Inną opcją jest użycie pliku .browserslistrc, aby podać listę środowisk, na które chcesz kierować reklamy.

Wartość ">0.25%" informuje Babel, aby uwzględniał tylko te przekształcenia, które są potrzebne do obsługi przeglądarek, które stanowią ponad 0,25% globalnego wykorzystania. Dzięki temu pakiet nie będzie zawierać niepotrzebnego kodu transpilowanego dla przeglądarek używanych przez bardzo małą liczbę użytkowników.

W większości przypadków jest to lepsze podejście niż użycie tej konfiguracji:

  "targets": "last 2 versions"

Wartość "last 2 versions" przetłumaczy Twój kod na dwie ostatnie wersje każdej przeglądarki, co oznacza, że zapewniamy obsługę przeglądarek wycofanych, takich jak Internet Explorer. Jeśli nie spodziewasz się, że te przeglądarki będą używane do uzyskiwania dostępu do aplikacji, może to niepotrzebnie zwiększyć rozmiar pakietu.

Ostatecznie musisz wybrać odpowiednią kombinację zapytań, aby kierować reklamy tylko do przeglądarek, które odpowiadają Twoim potrzebom.

Włączanie nowoczesnych poprawek błędów

@babel/preset-env grupowanie wielu funkcji składni JavaScript w kolekcje oraz włączanie i wyłączanie tych funkcji w zależności od określonych przeglądarek docelowych. Chociaż ta metoda działa dobrze, w przypadku błędu w jednej funkcji w docelowej przeglądarce zmienia się cała kolekcja funkcji składniowych. Często powoduje to przekształcenie większej ilości kodu niż to konieczne.

Ta opcja została pierwotnie opracowana jako osobna wstępna konfiguracja, a opcja poprawek błędów@babel/preset-env rozwiązuje ten problem, konwertując współczesną składnię, która jest nieprawidłowa w niektórych przeglądarkach, na najbliższą jej ekwiwalent, która nie powoduje błędów w tych przeglądarkach. W rezultacie otrzymujemy prawie identyczny nowoczesny kod z kilkoma drobnymi zmianami składni, które gwarantują zgodność we wszystkich docelowych przeglądarkach. Aby korzystać z tej optymalizacji, zainstaluj @babel/preset-env w wersji 7.10 lub nowszej, a potem ustaw właściwość bugfixes na true:

{
 "presets": [
   [
     "@babel/preset-env",
     {
       "bugfixes": true
     }
   ]
 ]
}

W Babel 8 opcja bugfixes będzie domyślnie włączona.

Użyj konta <script type="module">

Moduły JavaScriptu, czyli moduły ES, to stosunkowo nowa funkcja obsługiwana we wszystkich głównych przeglądarkach. Za pomocą modułów możesz tworzyć skrypty, które mogą importować i eksportować dane z innych modułów. Możesz też używać ich z opcją @babel/preset-env, aby kierować je tylko do przeglądarek, które je obsługują.

Zamiast wysyłać zapytanie o konkretne wersje przeglądarki lub udział w rynku, możesz w polu targets w pliku .babelrc podać wartość "esmodules" : true.

{
   "presets":[
      [
         "@babel/preset-env",
         {
            "targets":{
               "esmodules": true
            }
         }
      ]
   ]
}

Wiele nowszych funkcji ECMAScript skompilowanych za pomocą Babel jest już obsługiwanych w środowiskach, które obsługują moduły JavaScript. Dzięki temu uprościsz proces sprawdzania, czy w przypadku przeglądarek, które tego wymagają, jest używany tylko skompilowany kod.

Przeglądarki, które obsługują moduły, ignorują skrypty z atrybutem nomodule. Z kolei przeglądarki, które nie obsługują modułów, ignorują elementy skryptu z wartością type="module". Oznacza to, że możesz uwzględnić moduł i skompilowany plik zastępczy.

W idealnej sytuacji 2 wersje skryptu aplikacji są uwzględnione w ten sposób:

  <script type="module" src="main.mjs"></script>
  <script nomodule src="compiled.js" defer></script>

Przeglądarki, które obsługują moduły, pobierają i wykonują main.mjs, a ignorują compiled.js. Przeglądarki, które nie obsługują modułów, działają odwrotnie.

Jeśli używasz webpacka, możesz ustawić w konfiguracjach różne cele dla 2 oddzielnych wersji aplikacji:

  • Wersja tylko dla przeglądarek obsługujących moduły.
  • Wersja zawierająca skompilowany skrypt, który działa w dowolnej starszej przeglądarce. Plik ma większy rozmiar, ponieważ transpilacja musi obsługiwać większą liczbę przeglądarek.

Dziękujemy za opinie Connorowi Clarkowi i Jasonowi Millerowi.