Co deweloperzy muszą wiedzieć o trybach pamięci i oszczędzania energii w Chrome

W Chrome 108 wprowadziliśmy 2 nowe tryby: Oszczędzanie pamięci i Oszczędzanie energii, które dają użytkownikom większą kontrolę nad tym, jak Chrome wykorzystuje zasoby systemowe.

Chociaż te nowe tryby są przeznaczone głównie dla użytkowników, mają one pewne konsekwencje dla programistów stron internetowych, o których powinni pamiętać, ponieważ mogą potencjalnie wpływać na wrażenia użytkowników Twojej witryny.

W tym poście omówimy potencjalne skutki tych nowych trybów i to, co mogą zrobić deweloperzy stron internetowych, aby zapewnić jak najlepsze wrażenia.

Tryb oszczędzania pamięci

Gdy tryb Oszczędzanie pamięci jest włączony, Chrome będzie aktywnie usuwać karty, które od jakiegoś czasu nie były używane w tle. W ten sposób zwolnisz pamięć na aktywne karty i inne uruchomione aplikacje. Użytkownicy mogą zlecić Chrome, aby nie usuwał kart w przypadku określonych witryn. Jest to jednak ustawienie użytkownika, którym nie możesz zarządzać jako deweloper.

Gdy karta zostanie odrzucona, jej tytuł i ikona nadal będą widoczne na pasku kart, ale sama strona zniknie, tak jakby została zamknięta w normalny sposób. Jeśli użytkownik wróci do tej karty, strona zostanie automatycznie wczytana ponownie.

W przypadku stron zawierających tylko treści odrzucenie i ponowne załadowanie karty prawdopodobnie nie wpłynie na komfort korzystania z witryny. Jednak w przypadku bogatych, interaktywnych witryn o kompleksych ścieżkach użytkownika ponowne załadowanie w połowie ścieżki może być bardzo uciążliwe, jeśli witryna nie będzie w stanie przywrócić strony dokładnie do miejsca, w którym użytkownik ją opuścił.

Od lat Chrome odrzuca karty, aby oszczędzać pamięć, ale działo się tak tylko w sytuacjach, gdy system był pod presją pamięci. Ponieważ jest to stosunkowo rzadkie zjawisko, deweloperzy stron internetowych mogli nie zdawać sobie sprawy, że do niego dochodzi.

Od wersji 108 Chrome odrzucanie kart stanie się częstsze, dlatego ważne jest, aby witryny mogły odpowiednio sobie z tym radzić.

Sprawdzone metody obsługi zamykania kart

Zamknięcie karty nie jest nowym wyzwaniem dla programistów. Może się zdarzyć, że użytkownik załaduje stronę ponownie – celowo lub przypadkowo – przed wykonaniem zadania. Dlatego bardzo ważne było, aby witryny zapisywały stan użytkownika, aby mogły go przywrócić, gdy użytkownik opuści witrynę i wróci.

Najważniejsze nie jest czy przechowywać stan użytkownika, ale kiedy to robić. To jest kluczowe, ponieważ nie ma zdarzenia, które jest wywoływane, gdy karta jest odrzucana, więc deweloperzy nie mają możliwości zareagowania na to zdarzenie. Zamiast tego deweloperzy muszą przewidzieć taką możliwość i odpowiednio się do niej przygotować.

Najlepszy czas na przechowywanie stanu użytkownika to:

  • okresowo, gdy zmienia się stan;
  • Zawsze, gdy karta działa w tle (zdarzenie visibilitychange).

Najgorsze czasy przechowywania to:

  • W wywołaniu zwrotnym zdarzenia beforeunload.
  • W wywołaniu zwrotnym zdarzenia unload.

To najgorszy moment na przechowywanie stanu, ponieważ te zdarzenia są całkowicie niewiarygodne i nie są wywoływane w wielu sytuacjach, m.in. gdy karta jest usuwana.

Na diagramie zdarzeń cyklu życia strony możesz sprawdzić, jakie zdarzenia mają być uruchamiane w przypadku odrzucania strony. Jak widać na diagramie, karta może przejść ze stanu „ukryta” do stanu „odrzucona” bez wywoływania żadnych zdarzeń.

Stan interfejsu API cyklu życia strony i przepływ zdarzeń Wizualna reprezentacja stanu i przebiegu zdarzeń opisanych w tym dokumencie.

W rzeczywistości, gdy strona jest w stanie „ukryty”, nie ma gwarancji, że jakiekolwiek inne zdarzenia zostaną wywołane, zanim strona zostanie odrzucona przez przeglądarkę lub zamknięta przez użytkownika. Dlatego ważne jest, aby zawsze zapisywać niezapisane stany użytkownika w zdarzeniu visibilitychange, ponieważ możesz nie mieć innej okazji.

Poniższy kod zawiera przykładową logikę, która pozwala ustawić w kole kolejk zapisywanie bieżącego stanu użytkownika za każdym razem, gdy się zmieni, lub natychmiast, jeśli użytkownik przełączy się na inną kartę lub zamknie kartę:

let state = {};
let hasUnstoredState = false;

function storeState() {
  if (hasUnstoredState) {
    // Store `state` to localStorage or IndexedDB...
  }
  hasUnstoredState = false;
}

export function updateState(newState) {
  state = newState;
  hasUnstoredState = true;
  requestIdleCallback(storeState);
}

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden') {
    storeState();
  }
});

Wykrywanie, że karta została odrzucona

Jak już wspomnieliśmy, nie można wykryć, że karta ma zostać zamknięta, ale można wykryć, że została zamknięta, gdy użytkownik do niej wróci i odświeży stronę. W takich sytuacjach właściwość document.wasDiscarded będzie miała wartość true.

if (document.wasDiscarded) {
  // The page was reloaded after a discard.
} else {
  // The page was not reloaded after a discard.
}

Jeśli chcesz się dowiedzieć, jak często użytkownicy doświadczają tego typu sytuacji, możesz skonfigurować narzędzie analityczne, aby rejestrowało te informacje.

W Google Analytics możesz np. skonfigurować niestandardowy parametr zdarzenia, który pozwoli Ci określić, jaki odsetek odsłon pochodzi z odrzuconych kart:

gtag('config', 'G-XXXXXXXXXX', {
  was_discarded: document.wasDiscarded,
});

Jeśli jesteś dostawcą usług analitycznych, rozważ dodanie tego wymiaru do swoich usług domyślnie.

Testowanie witryny w trybie oszczędzania pamięci

Aby sprawdzić, jak strona reaguje na odrzucenie, wczytaj ją, a potem otwórz chrome://discards w osobnej karcie lub oknie.

W interfejsie chrome://discards możesz znaleźć kartę, którą chcesz odrzucić z listy, a potem w kolumnie Działania kliknąć Natychmiastowe odrzucenie.

Zrzut ekranu interfejsu chrome://discards z lokalizacją linku do kart odrzuconych

Spowoduje to odrzucenie karty, dzięki czemu będzie można ją ponownie otworzyć i sprawdzić, czy po ponownym załadowaniu strona jest w tym samym stanie, w jakim była, gdy ją zamknięto.

Pamiętaj, że obecnie nie ma możliwości zautomatyzowania odrzucania kart za pomocą narzędzi do testowania, takich jak webdriver czy puppeteer. Jednak odrzucanie i przywracanie kart jest prawie identyczne z ponownym wczytywaniem stron, więc jeśli sprawdzisz, czy stan użytkownika jest przywracany po ponownym wczytaniu w środku przepływu użytkownika, prawdopodobnie będzie to działać również w przypadku odrzucania/przywracania. Główna różnica między tymi dwoma metodami polega na tym, że zdarzenia beforeunload, pagehideunload nie są wywoływane, gdy karta jest odrzucana, więc dopóki nie polegasz na tych zdarzeniach, aby zachować stan użytkownika, możesz używać funkcji odświeżania, aby przetestować zachowanie podczas odrzucania i przywracania.

Tryb oszczędzania energii

Gdy tryb Oszczędzanie energii jest włączony, Chrome oszczędza baterię, zmniejszając częstotliwość odświeżania ekranu, co wpływa na jakość animacji i przewijania oraz liczbę klatek w filmie.

Zazwyczaj deweloperzy nie muszą nic robić, aby włączyć tryb oszczędzania energii. Interfejsy API CSS i JavaScriptu służące do animacji, przejśćrequestAnimationFrame() będą się automatycznie dostosowywać do każdej zmiany częstotliwości odświeżania wyświetlacza po włączeniu tego trybu.

Głównym scenariuszem, w którym ten tryb może być problematyczny, jest sytuacja, gdy Twoja witryna używa animacji opartych na JavaScript, które zakładają określoną częstotliwość odświeżania dla wszystkich użytkowników.

Jeśli np. Twoja witryna używa pętli requestAnimationFrame() i zakłada, że między wywołaniami zwrotnymi upłynie dokładnie 16,67 milisekundy, animacje będą działać dwa razy wolniej, gdy włączony jest tryb oszczędzania energii.

Pamiętaj, że deweloperzy zawsze mieli problem z założeniem domyślnej częstotliwości odświeżania na poziomie 60 Hz dla wszystkich użytkowników, ponieważ w przypadku wielu współczesnych urządzeń ta liczba może być inna.

Pomiar częstotliwości odświeżania ekranu

Nie ma dedykowanego interfejsu API do pomiaru częstotliwości odświeżania wyświetlacza. Ogólnie rzecz biorąc, nie zalecamy próbowania pomiaru częstotliwości odświeżania za pomocą obecnych interfejsów API.

W przypadku istniejących interfejsów API najlepiej jest wykorzystać sygnatury czasowe między kolejnymi wywołaniami zwrotnymi requestAnimationFrame(). W większości przypadków pozwala to oszacować częstotliwość odświeżania w danym momencie, ale nie informuje o jej zmianie. Aby to zrobić, musisz stale prowadzić ankietę requestAnimationFrame(), co uniemożliwia oszczędzanie energii lub wydłużanie czasu pracy na baterii.

Testowanie witryny w trybie oszczędzania energii

Jedną z metod testowania witryny w trybie oszczędzania energii jest włączenie tego trybu w ustawieniach Chrome i skonfigurowanie go tak, aby działał, gdy urządzenie nie jest podłączone do zasilania.

Jeśli nie masz urządzenia, które można odłączyć od zasilania, możesz też włączyć tryb ręcznie, wykonując te czynności:

  1. Włącz flagę chrome://flags/#battery-saver-mode-available.
  2. Otwórz stronę chrome://discards i kliknij link Przełącz tryb oszczędzania baterii (ważne: aby link działał, musi być włączona flaga #battery-saver-mode-available).

Zrzut ekranu z interfejsem chrome://discards pokazujący lokalizację linku do włączenia trybu oszczędzania energii

Po włączeniu tej funkcji możesz wchodzić w interakcję ze swoją witryną i sprawdzać, czy wszystko wygląda tak, jak powinno – np. czy animacje i przejścia są uruchamiane z żądaną szybkością.

Podsumowanie

Chociaż tryby Oszczędzanie pamięci i Oszczędzanie energii w Chrome są głównie funkcjami dla użytkowników, mają one też znaczenie dla deweloperów, ponieważ mogą negatywnie wpływać na wrażenia użytkowników odwiedzających Twoją witrynę, jeśli nie zostaną odpowiednio obsłużone.

Te nowe tryby zostały zaprojektowane z uwzględnieniem sprawdzonych metod dla deweloperów. Jeśli deweloperzy stosują sprawdzone metody tworzenia stron internetowych, ich witryny powinny działać w trybach obsługiwanych przez nowe systemy operacyjne.

Jeśli jednak Twoja witryna zawiera jakiekolwiek praktyki opisane w tym poście, prawdopodobnie Twoi użytkownicy mają problemy, które tylko się nasilą, gdy te 2 tryby będą włączone.

Jak zawsze najlepszym sposobem na sprawdzenie, czy użytkownicy mają przyjemność korzystania z Twojej witryny, jest przetestowanie jej w warunkach odpowiadających tym, w jakich znajdują się Twoi użytkownicy.