Przedstawiamy NoState Prefetch

Katie Hempenius
Katie Hempenius

Opublikowano: 20 lipca 2018 r.

Wprowadzenie

Wstępne pobieranie bez stanu to nowy mechanizm w Chrome, który jest alternatywą dla wycofanego procesu wstępnego renderowania używanego do obsługi funkcji takich jak <link rel="prerender">. Podobnie jak wstępne renderowanie pobiera zasoby z wyprzedzeniem, ale w przeciwieństwie do niego nie wykonuje JavaScriptu ani nie renderuje żadnej części strony z wyprzedzeniem. Celem wstępnego pobierania bez stanu jest zużywanie mniejszej ilości pamięci niż wstępne renderowanie przy jednoczesnym skróceniu czasu ładowania strony.

NoState Prefetch nie jest interfejsem API, ale mechanizmem używanym przez Chrome do wdrażania różnych interfejsów API i funkcji. Interfejs Resource Hints API oraz wstępne pobieranie stron przez pasek adresu Chrome są implementowane za pomocą wstępnego pobierania bez stanu. Jeśli używasz Chrome 63 lub nowszej, Twoja przeglądarka korzysta już z wstępnego pobierania bez stanu w przypadku funkcji takich jak <link rel="prerender">.

Z tego artykułu dowiesz się, jak działa funkcja NoStatePrefetch, jakie były powody jej wprowadzenia oraz jak za pomocą histogramów w Chrome wyświetlać statystyki dotyczące jej użycia.

Motywacja

Wprowadzenie wstępnego pobierania bez stanu miało 2 główne przyczyny:

Zmniejszanie zużycia pamięci

Pobieranie z wyprzedzeniem bez stanu wykorzystuje tylko około 45 MiB pamięci. Utrzymanie skanera wstępnego ładowania jest głównym kosztem pamięci w przypadku wstępnego ładowania bez stanu i pozostaje on stosunkowo stały w różnych przypadkach użycia. Zwiększenie rozmiaru lub liczby pobrań nie ma znaczącego wpływu na ilość pamięci zużywanej przez pobieranie z wyprzedzeniem bez stanu.

W przeciwieństwie do tego wstępne renderowanie zwykle zużywa 100 MiB pamięci, a jej zużycie jest ograniczone do 150 MiB. Tak duże zużycie pamięci sprawia, że nie nadaje się on do urządzeń z niskiej półki (czyli z pamięcią RAM mniejszą lub równą 512 MB). W związku z tym Chrome nie renderuje z wyprzedzeniem na słabszych urządzeniach, ale zamiast tego nawiązuje połączenie.

Ułatwianie obsługi nowych funkcji platformy internetowej

W przypadku wstępnego renderowania nie powinny występować żadne działania widoczne dla użytkownika (np. odtwarzanie muzyki lub filmu) ani działania stanowe (np. modyfikowanie pamięci sesji lub pamięci lokalnej). Zapobieganie takim działaniom podczas renderowania strony może być jednak trudne i złożone. Pobieranie z wyprzedzeniem bez stanu pobiera tylko zasoby z wyprzedzeniem: nie wykonuje kodu ani nie renderuje strony. Ułatwia to zapobieganie działaniom, które są widoczne dla użytkownika i zależą od stanu.

Implementacja

Poniżej znajdziesz opis działania funkcji NoState Prefetch.

  1. Wywoływane jest wstępne pobieranie bez stanu.

    Wskazówka dotycząca wstępnego renderowania zasobów (np. <link rel="prerender">) i niektóre funkcje Chrome będą wywoływać wstępne pobieranie bez stanu, jeśli zostaną spełnione te 2 warunki: a) użytkownik nie korzysta z urządzenia z niższej półki, b) użytkownik nie korzysta z sieci komórkowej.

  2. Dla wstępnego pobierania bez stanu tworzony jest nowy, dedykowany proces renderowania.

    W Chrome „proces renderowania” to proces odpowiedzialny za pobieranie dokumentu HTML, jego analizowanie, tworzenie drzewa renderowania i wyświetlanie wyniku na ekranie. Każda karta w Chrome, a także każdy proces wstępnego pobierania bez stanu ma własny moduł renderujący, który zapewnia izolację. Pomaga to zminimalizować skutki nieprawidłowego działania (np. awarii karty) oraz zapobiegać uzyskiwaniu przez złośliwy kod dostępu do innych kart lub części systemu.

  3. Zasób, który jest ładowany za pomocą funkcji NoState Prefetch, jest pobierany. Następnie skaner HTMLPreloadScanner skanuje ten zasób, aby wykryć wszystkie podzasoby, które należy pobrać. Jeśli główny zasób lub którykolwiek z jego podzasobów ma zarejestrowany service worker, te żądania będą przechodzić przez odpowiedni service worker.

    Wstępne pobieranie bez stanu obsługuje tylko metodę HTTP GET. Nie pobiera żadnych zasobów podrzędnych, które wymagają użycia innych metod HTTP. Nie pobiera też żadnych zasobów, które wymagają działań użytkownika (np. wyskakujących okien uwierzytelniania, certyfikatu SSL klienta ani ręcznych zastąpień).

  4. Pobierane zasoby podrzędne będą pobierane z priorytetem sieci „IDLE”.

    Priorytet sieci „IDLE” to najniższy możliwy priorytet sieci w Chrome.

  5. Wszystkie zasoby pobrane przez pobieranie z wyprzedzeniem bez stanu są zapisywane w pamięci podręcznej zgodnie z nagłówkami pamięci podręcznej.

    Wstępne pobieranie bez stanu będzie buforować wszystkie zasoby z wyjątkiem tych, które mają nagłówek no-store Cache-Control. Zasób zostanie ponownie zweryfikowany przed użyciem, jeśli zawiera nagłówek odpowiedzi Vary, nagłówek no-cache Cache-Control lub jeśli ma więcej niż 5 minut.

  6. Proces renderowania jest zamykany po wczytaniu wszystkich zasobów podrzędnych.

    Jeśli zasoby podrzędne przekroczą limit czasu, proces renderowania zostanie przerwany po 30 sekundach.

  7. Przeglądarka nie wprowadza żadnych zmian stanu poza aktualizacją magazynu plików cookie i lokalnej pamięci podręcznej DNS. Warto to podkreślić, ponieważ jest to „NoState” w „NoState Prefetch”.

    W tym momencie „normalnego” procesu wczytywania strony przeglądarka prawdopodobnie wykonałaby działania, które zmodyfikowałyby jej stan, np. uruchomiła JavaScript, zmodyfikowała sessionStorage lub localStorage, odtworzyła muzykę lub filmy, użyła interfejsu History API lub wyświetliła użytkownikowi prośbę. Jedynymi zmianami stanu, które występują w przypadku wstępnego pobierania bez stanu, są aktualizacja pamięci podręcznej DNS po otrzymaniu odpowiedzi i aktualizacja magazynu plików cookie, jeśli odpowiedź zawiera nagłówek Set-Cookie.

  8. Gdy zasób jest potrzebny, jest wczytywany w oknie przeglądarki.

    W przeciwieństwie do wstępnie renderowanej strony nie będzie ona jednak od razu widoczna – przeglądarka musi ją jeszcze wyrenderować. Przeglądarka nie użyje ponownie renderera, którego użyła do wstępnego pobierania bez stanu, tylko użyje nowego renderera. Niewczytywanie strony z wyprzedzeniem zmniejsza zużycie pamięci przez funkcję NoStatePrefetch, ale też ogranicza jej potencjalny wpływ na czas wczytywania strony.

    Jeśli strona ma skrypt service worker, jej załadowanie ponownie przejdzie przez ten skrypt.

    Jeśli funkcja NoState Prefetch nie zdąży pobrać zasobów podrzędnych, zanim strona będzie potrzebna, przeglądarka będzie kontynuować proces ładowania strony od miejsca, w którym funkcja NoState Prefetch zakończyła działanie. Przeglądarka nadal będzie musiała pobrać zasoby, ale nie tak wiele, jak byłoby to konieczne, gdyby funkcja NoState Prefetch nie została zainicjowana.

Wpływ na analitykę internetową

Strony wczytywane za pomocą funkcji NoState Prefetch są rejestrowane przez narzędzia do analizy internetowej w nieco innych momentach, w zależności od tego, czy narzędzie zbiera dane po stronie klienta, czy po stronie serwera.

Skrypty analityczne po stronie klienta rejestrują odsłonę, gdy strona jest wyświetlana użytkownikowi. Te skrypty opierają się na wykonywaniu JavaScriptu, a funkcja wstępnego pobierania bez stanu nie wykonuje żadnego JavaScriptu.

Narzędzia analityczne po stronie serwera rejestrują dane, gdy żądanie jest obsługiwane. W przypadku zasobów wczytywanych za pomocą funkcji NoState Prefetch może wystąpić znaczna różnica czasu między obsługą żądania a rzeczywistym wykorzystaniem odpowiedzi przez klienta (jeśli w ogóle zostanie wykorzystana). Od wersji 69 Chrome dodaje nagłówek Purpose: Prefetch do wszystkich żądań w ramach wstępnego pobierania bez stanu, aby odróżnić je od zwykłego przeglądania.

Sprawdź

Funkcja NoStatePrefetch została wprowadzona w grudniu 2017 roku w Chrome 63. Obecnie służy do:

  • Wdrażanie wskazówki dotyczącej zasobów prerender
  • Pobieranie pierwszego wyniku z wyników wyszukiwania Google
  • pobieranie stron, które według paska adresu Chrome prawdopodobnie odwiedzisz w następnej kolejności;

W narzędziach wewnętrznych Chrome możesz sprawdzić, jak korzystasz z funkcji NoStatePrefetch.

Aby wyświetlić listę witryn, które zostały wczytane za pomocą funkcji NoState Prefetch, otwórz stronę chrome://net-internals/#prerender.

Aby wyświetlić statystyki dotyczące korzystania z wstępnego pobierania bez stanu, otwórz stronę chrome://histograms i wyszukaj „NoStatePrefetch”. Istnieją 3 różne histogramy wstępnego pobierania bez stanu – po jednym dla każdego przypadku użycia tej funkcji:

  • „NoStatePrefetch” (statystyki dotyczące użycia wskazówek dotyczących zasobów wstępnego renderowania)
  • „gws_NoStatePrefetch” (statystyki wykorzystania przez stronę wyników wyszukiwania Google);
  • „omnibox_NoStatePrefetch” (statystyki użycia na pasku adresu Chrome)