Odbiór modułów obsługi danych wejściowych

Moduły obsługi danych wejściowych mogą być przyczyną problemów z wydajnością aplikacji, bo mogą blokować dokończenie klatek i powodować dodatkowe, niepotrzebne prace związane z układem.

Obsługa danych wejściowych może być potencjalną przyczyną problemów z wydajnością w Twoich aplikacjach, ponieważ może blokować tworzenie klatek i wywoływać dodatkowe, niepotrzebne operacje układu.

  • Unikaj długotrwałych procedur obsługi danych wejściowych, ponieważ mogą one blokować przewijanie.
  • Nie wprowadzaj zmian stylu w obsługach danych wejściowych.
  • Odbij moduły obsługi; zapisuj wartości zdarzeń i reaguj na zmiany stylu przy następnym wywołaniu zwrotnym requestAnimationFrame.

Unikaj długo działających modułów obsługi danych wejściowych

W najszybszym możliwym przypadku, gdy użytkownik wchodzi w interakcję ze stroną, wątek kompozytora strony może przyjąć dane dotykowe użytkownika i po prostu przenieść zawartość. Nie wymaga to działania wątku głównego, w którym wykonywane są zadania związane z JavaScriptem, układem, stylami lub renderowaniem.

Lekkie przewijanie; dotyczy tylko kompozytora.

Jeśli jednak dołączysz moduł obsługi danych wejściowych, taki jak touchstart, touchmove lub touchend, wątek kompozytora będzie musiał czekać na zakończenie działania tego modułu, ponieważ możesz wywołać funkcję preventDefault() i przerwać przewijanie dotykiem. Nawet jeśli nie wywołasz funkcji preventDefault(), kompozytor musi zaczekać, co spowoduje zablokowanie przewijania przez użytkownika, co może powodować zacinanie się i braki w klatkach.

Szybkie przewijanie; kompozytor jest zablokowany przez JavaScript.

Krótko mówiąc, musisz się upewnić, że wszystkie uruchomione przez Ciebie moduły obsługi danych wejściowych powinny działać szybko i umożliwić kompozytorowi wykonanie swojego zadania.

Unikaj zmian stylu w obsługach danych wejściowych

Moduły obsługi danych wejściowych, np. służące do przewijania i dotyku, są zaplanowane do uruchomienia tuż przed wywołaniami zwrotnymi requestAnimationFrame.

Jeśli wprowadzisz zmianę wizualną w jednym z tych modułów obsługi, na początku modułu requestAnimationFrame zostaną wprowadzone oczekujące zmiany stylu. Jeśli potem odczytasz właściwości wizualne na początku wywołania metody requestAnimationFrame, zgodnie z zaleceniem podanym w artykule „Unikaj dużych, złożonych układów i ich nadmiernego wczytywania”, spowodujesz wymuszony układ synchroniczny.

Duże przewijanie; kompozytor jest zablokowany w JavaScripcie.

Odbijanie modułów obsługi przewijania

Rozwiązanie obu powyższych problemów jest takie samo: zawsze należy odrzucić zmiany wizualne przy następnym wywołaniu zwrotnym requestAnimationFrame:

function onScroll (evt) {

    // Store the scroll value for laterz.
    lastScrollY = window.scrollY;

    // Prevent multiple rAF callbacks.
    if (scheduledAnimationFrame)
    return;

    scheduledAnimationFrame = true;
    requestAnimationFrame(readAndUpdatePage);
}

window.addEventListener('scroll', onScroll);

Dodatkową zaletą jest to, że moduły obsługi danych wejściowych są lżejsze, co jest niesamowite, ponieważ teraz nie blokujesz takich rzeczy jak przewijanie czy dotykanie kosztownego obliczeniowo kodu.