JavaScript ServiceWorker.state — стан сервісного робітника


Властивість state показує стан сервісного робітника в його життєвому циклі.

автор: NagarD

Загальний опис

Стани йдуть по черзі: installing (встановлюється) → installed/waiting (чекає) → activatingactivated (працює) → redundant (замінений або зламаний).

І саме waiting пояснює найзагадковішу поведінку сервісних робітників: «я оновив код, а в браузері старий».

Причина в тому, що новий робітник не заміняє старого одразу. Він чекає, доки закриються всі вкладки сайту — щоб дві версії не працювали водночас. А просте перезавантаження вкладку не закриває, тож чекати можна вічно.

Обійти це можна викликом skipWaiting() усередині робітника — але тоді сторінка, відкрита зі старою версією, раптом почне спілкуватись із новою.

автор: NagarD

Порада

«Оновив, а нічого не змінилось» — подивись на state. Якщо там waiting, новий робітник живий і чекає, доки закриються всі вкладки сайту.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
state 45+ 44+ 11.1+ 32+ 17+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
state 45+ yes yes 11.3+

Приклади

+ запропонувати свій приклад у пісочниці

Помітити, що оновлення чекає, і чесно сказати про це.

(async () => {
    if (!('serviceWorker' in navigator)) {
        console.log('Service Worker недоступний у цьому середовищі');
        return;
    }

    try {
        const registration = await navigator.serviceWorker.register('/sw.js');

        registration.addEventListener('updatefound', () => {
            const fresh = registration.installing;

            fresh.addEventListener('statechange', () => {
                console.log('Стан:', fresh.state);

                // новий уже готовий, але чекає закриття старих вкладок
                if (fresh.state === 'installed' && navigator.serviceWorker.controller) {
                    console.log('Доступна нова версія — перезавантаж сторінку');
                }
            });
        });
    } catch (error) {
        console.log('Реєстрація не вдалася:', error.message);
    }
})();
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід