Używanie funkcji requestIdleCallback

Wiele witryn i aplikacji ma do wykonania wiele skryptów. Kod JavaScript musi być często wykonywany tak szybko, jak to możliwe, ale jednocześnie nie powinien przeszkadzać użytkownikowi. Jeśli wysyłasz dane analityczne, gdy użytkownik przewija stronę, lub dołączasz elementy do DOM, gdy użytkownik klika przycisk, Twoja aplikacja internetowa może przestać odpowiadać, co spowoduje nieprzyjemne wrażenia użytkownika.

Używanie funkcji requestIdleCallback do planowania nieistotnych zadań.

Dobra wiadomość jest taka, że istnieje interfejs API, który może Ci w tym pomóc: requestIdleCallback. Podobnie jak w przypadku requestAnimationFrame, dzięki użyciu requestIdleCallback możemy prawidłowo zaplanować animacje i zmaksymalizować szanse na osiągnięcie 60 FPS. requestIdleCallback będzie planować pracę, gdy w ramach danego kadru będzie wolny czas lub gdy użytkownik będzie nieaktywny. Oznacza to, że masz możliwość wykonania swojej pracy bez przeszkadzania użytkownikowi. Jest ona dostępna od wersji 47 Chrome, więc możesz ją wypróbować już dziś w Chrome Canary. Jest to funkcja eksperymentalna, a specyfikacja wciąż się zmienia, więc w przyszłości może się to zmienić.

Dlaczego warto używać funkcji requestIdleCallback?

Samodzielne planowanie nieistotnych zadań jest bardzo trudne. Nie da się dokładnie określić, ile czasu pozostało do końca kadru, ponieważ po wykonaniu wywołań zwrotnych requestAnimationFrame występują obliczenia stylu, układ, malowanie i inne wewnętrzne operacje przeglądarki. Rozwiązanie opracowane samodzielnie nie uwzględnia żadnego z tych aspektów. Aby mieć pewność, że użytkownik nie w żaden sposób nie wchodzi w interakcję, musisz też do każdego rodzaju zdarzenia interakcji (scroll, touch, click) dołączyć listenery, nawet jeśli nie są one potrzebne do działania aplikacji. Tylko w ten sposób możesz mieć pewność, że użytkownik nie wchodzi w interakcję. Z drugiej strony przeglądarka wie dokładnie, ile czasu jest dostępne na końcu ramki i czy użytkownik wchodzi w interakcję. Dzięki temu interfejsowi requestIdleCallback otrzymujemy interfejs API, który pozwala nam wykorzystać dowolny wolny czas w najbardziej efektywny sposób.

Przyjrzyjmy się mu bliżej i zobaczmy, jak możemy go wykorzystać.

Sprawdzanie funkcji requestIdleCallback

Usługa requestIdleCallback jest jeszcze w fazie testów, dlatego przed jej użyciem sprawdź, czy jest dostępna:

if ('requestIdleCallback' in window) {
    // Use requestIdleCallback to schedule work.
} else {
    // Do what you’d do today.
}

Możesz też zastosować obejście, które wymaga setTimeout:

window.requestIdleCallback =
    window.requestIdleCallback ||
    function (cb) {
    var start = Date.now();
    return setTimeout(function () {
        cb({
        didTimeout: false,
        timeRemaining: function () {
            return Math.max(0, 50 - (Date.now() - start));
        }
        });
    }, 1);
    }

window.cancelIdleCallback =
    window.cancelIdleCallback ||
    function (id) {
    clearTimeout(id);
    }

Użycie funkcji setTimeout nie jest najlepszym rozwiązaniem, ponieważ nie wie ona o czasie bezczynności, tak jak funkcja requestIdleCallback. Jednak jeśli funkcja requestIdleCallback nie byłaby dostępna, musiałbyś wywołać funkcję bezpośrednio, więc w tym przypadku użycie funkcji zastępczej nie jest gorszym rozwiązaniem. Dzięki temu, jeśli requestIdleCallback będzie dostępny, Twoje połączenia będą automatycznie przekierowywane, co jest bardzo wygodne.

Na razie jednak załóżmy, że istnieje.

Używanie funkcji requestIdleCallback

Wywoływanie funkcji requestIdleCallback jest bardzo podobne do wywoływania funkcji