Reguły i zalecenia PageSpeed

Data publikacji: 17 sierpnia 2018 r.

W tym przewodniku omawiamy reguły PageSpeed Insights w kontekście: wyjaśniamy, na co zwracać uwagę podczas optymalizacji ścieżki renderowania krytycznego, i dlaczego.

Aby skrócić czas pierwszego renderowania, zminimalizuj liczbę kluczowych zasobów na stronie i (w miarę możliwości) wyeliminuj je, zminimalizuj liczbę pobranych bajtów kluczowych i zoptymalizuj długość krytycznej ścieżki.

Zasoby JavaScript są domyślnie blokowane przez parser, chyba że są oznaczone jako async lub dodane za pomocą specjalnego fragmentu kodu JavaScript. Blokowanie parsera JavaScript zmusza przeglądarkę do oczekiwania na CSSOM i wstrzymuje tworzenie DOM, co z kolei może znacznie opóźnić pierwsze renderowanie.

Preferuj zasoby JavaScriptu asynchronicznego

Zasoby asynchroniczne odblokowują parsowanie dokumentu i umożliwiają przeglądarce uniknięcie blokowania w CSSOM przed wykonaniem skryptu. Jeśli skrypt może używać atrybutu async, często oznacza to, że nie jest on niezbędny do pierwszego renderowania. Zalecamy ładowanie skryptów niesynchronicznie po początkowym renderowaniu.

Unikaj synchronicznych wywołań serwera

Aby ograniczyć dane wysyłane przez XMLHttpRequests w obsługach unload, użyj metody navigator.sendBeacon(). Ponieważ wiele przeglądarek wymaga, aby takie żądania były asynchroniczne, mogą one spowolnić przełączanie się między stronami, czasami w znaczącym stopniu. Ten kod pokazuje, jak używać navigator.sendBeacon() do wysyłania danych na serwer w module obsługi pagehide zamiast w module obsługi unload.

<script>
  function() {
    window.addEventListener('pagehide', logData, false);
    function logData() {
      navigator.sendBeacon(
        'https://putsreq.herokuapp.com/Dt7t2QzUkG18aDTMMcop',
        'Sent by a beacon!');
    }
  }();
</script>

Metoda fetch() zapewnia lepszy sposób asynchronicznego wysyłania żądań dotyczących danych. fetch() przetwarza odpowiedzi za pomocą obietnic zamiast wielu obciążników zdarzeń. W przeciwieństwie do odpowiedzi na XMLHttpRequest odpowiedź fetch() jest obiektem strumienia. Oznacza to, że wywołanie funkcji json() zwraca również obietnicę.

<script>
  fetch('./api/some.json')
    .then(
      function(response) {
        if (response.status !== 200) {
          console.log('Looks like there was a problem. Status Code: ' +  response.status);
          return;
        }
        // Examine the text in the response
        response.json().then(function(data) {
          console.log(data);
        });
      }
    )
    .catch(function(err) {
      console.log('Fetch Error :-S', err);
    });
</script>

Metoda fetch() może też obsługiwać żądania POST.

<script>
  fetch(url, {
    method: 'post',
    headers: {
      "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
    },
    body: 'foo=bar&lorem=ipsum'
  }).then(function() { // Additional code });
</script>

Wstrzymaj analizowanie kodu JavaScript

Aby zminimalizować ilość pracy, jaką przeglądarka musi wykonać, aby wyrenderować stronę, opóźnij wczytywanie nieistotnych skryptów, które nie są niezbędne do zbudowania widocznych treści na potrzeby początkowego renderowania.

Unikaj długotrwałego JavaScriptu

Długo działający kod JavaScript uniemożliwia przeglądarce tworzenie DOM, CSSOM i renderowanie strony, dlatego odłóż na później logikę inicjowania, która nie jest niezbędna do pierwszego renderowania. Jeśli sekwencja inicjalizacji jest długa, rozważ podzielenie jej na kilka etapów, aby umożliwić przeglądarce przetwarzanie innych zdarzeń.

Optymalizacja korzystania z kodu CSS

CSS jest wymagany do tworzenia drzewa renderowania, a skrypt JavaScript często blokuje CSS podczas początkowej budowy strony. Upewnij się, że wszystkie mniej ważne elementy CSS są oznaczone jako niekrytyczne (np. dla zapytań dotyczących plików drukowanych i innych multimediów), a ilość krytycznego kodu CSS i czas na jego dostarczenie są jak najmniejsze.

Umieść kod CSS w nagłówku dokumentu

Wskazywanie wszystkich zasobów CSS jak najszybciej w dokumencie HTML, aby przeglądarka mogła jak najszybciej wykryć tagi <link> i wysłać żądanie do pliku CSS.

Unikaj importowania z CSS

Dyrektywa CSS import (@import) umożliwia jednemu arkuszowi stylów importowanie reguł z innego pliku. Unikaj jednak tych dyrektyw, ponieważ wprowadzają one dodatkowe powtórzenia ruchu na ścieżce krytycznej: zaimportowane zasoby CSS są odczytywane dopiero po odebraniu i przeanalizowaniu arkusza stylów CSS z samą regułą @import.

Wbudowany kod CSS blokujący renderowanie

Aby uzyskać najlepszą wydajność, możesz umieścić najważniejszy kod CSS bezpośrednio w dokumencie HTML. Pozwala to wyeliminować dodatkowe ścieżki na ścieżce krytycznej. Jeśli wszystko zostanie wykonane prawidłowo, można uzyskać ścieżkę krytyczna o długości „jednego przejścia”, na której tylko kod HTML jest zasobem blokującym.

Prześlij opinię