Як видалити сервісного працівника?


161

Після видалення /serviceworker.jsз мого кореневого каталогу Chrome все ще запускає сервісного працівника, який я видалив із своєї веб-корені. Як видалити службового службовця зі свого веб-сайту та Chrome, щоб я міг знову увійти на свій веб-сайт?

Я відстежив цю проблему до механізму кешування Service Work і просто хочу зараз видалити, поки не встигну налагодити її. Сценарій входу, який я використовую для переадресації на сервери Google, щоб увійти до свого облікового запису Google. Але все, що я отримую зі сторінки login.php, - це ERR_FAILEDповідомлення.


2
У мене така ж проблема у Firefox.
— Коста

Відповіді:


309

Видалення службових працівників програмно

Ви можете видалити службових службовців програмно так:

navigator.serviceWorker.getRegistrations().then(function(registrations) {
 for(let registration of registrations) {
  registration.unregister()
} })

Документи: getRegistrations , незареєструватися

Видалення службових службовців через інтерфейс користувача

Ви також можете видалити службових служб на вкладці Програми в Chrome Devtools.


2
Довелося додати «використовувати суворо»; перед цим кодом, щоб він працював.
— codeKonami

8
Чи є час, що базується на цьому? Скажіть, користувач відвідував одного разу, зареєстрував працівника, і з тих пір не повернувся, чи потрібно мені зберігати цей фрагмент у нашій кодовій базі назавжди про всяк випадок?
— loganfsmyth


10
У мене є повідомлення в блозі, в якому переглядаються ці та інші працівники служби видалення / видалення параметрів love2dev.com/blog/how-to-uninstall-a-service-worker
— Chris Love

3
Як би це допомогло? Сторінка вже кешована встановленим працівником, і ваш новий сценарій ніколи не буде завантажений користувачами.
— РІВ

107

Ви також можете перейти до URL: chrome: // serviceworker-Internals / та скасувати реєстрацію сервісного працівника.


9
Ви можете ввести це в консоль розробника, щоб видалити їх усі одним махом. document.querySelectorAll(".unregister").forEach(item=>item.click())
— сенбон

Однак якщо у вас є інші відвідувачі, які вам також потрібно зареєструвати (друзі, користувачі, менеджери проектів тощо), відповідь вище (від Daniel Herr) є більш ефективним рішенням. У вас також є Firefox, Edge та Safari, а також аромати для iOS, Android, macOS, Windows 10 для тестування кожного.
— Стівен Вентімілья

$$ ('. ungister'). forEach (item => item.click ())
— Travnikov.dev

37

Це можна зробити через Chrome Developer Tool , а також Programatic .

  1. Знайдіть усіх запущених екземплярів чи службових служб, ввівши

    chrome: // сервісний працівник-внутрішній /

    на новій вкладці, а потім виберіть працівника служби обслуговування, якого ви хочете скасувати.

  2. Відкрийте Інструменти для розробників (F12) та виберіть програму. Тоді або

    Виберіть Очистити сховище -> Скасувати реєстрацію сервісного працівника

    або

    Виберіть Сервісні працівники -> Виберіть Оновити при перезавантаженні

  3. Програматично

if(window.navigator && navigator.serviceWorker) {
  navigator.serviceWorker.getRegistrations()
  .then(function(registrations) {
    for(let registration of registrations) {
      registration.unregister();
    }
  });
}


22

У Google Chrome можна перейти до Інструментів для розробників (F12) -> Додаток -> Сервісний працівник та скасувати реєстрацію службовців зі списку для цього конкретного домену.

Знімок екрана

Цей метод ефективний в режимі розробки сайту, і він, здебільшого, працює на тому, localhostщо вам може знадобитися для розробки іншого проекту.


5

Ви повинні виявити два API на своїх пристроях: getRegistrations та getRegistration . Сервіс-працівник не має унікального набору API на всіх платформах. Наприклад, деякі веб-переглядачі мають лише a navigator.serviceWorker.getRegistration, no navigator.serviceWorker.getRegistrations. Тож вам слід розглянути з обома.


3

FYI, якщо ви використовуєте браузер MacOS Safari , є один спосіб насильно відреєстрації сервісного працівника (кроки та зображення для Safari 12.1):

  1. Safari> Налаштування ...> Конфіденційність> Керування даними веб-сайтів ... Налаштування Safari: конфіденційність

  2. Введіть доменне ім’я (наприклад, "localhost"), натисніть "Видалити" Налаштування Safari: конфіденційність: керування даними веб-сайту

Примітка. Окрім службових працівників, це також видалить усі кеші, файли cookie та бази даних для цього домену.


Схоже, це не працює, якщо сервісні працівники були встановлені через приватне вікно.
— виник

3

На додаток до вже правильних відповідей, якщо ви також хочете видалити SW кеш, ви можете застосувати наступний метод:

if ('caches' in window) {
    caches.keys()
      .then(function(keyList) {
          return Promise.all(keyList.map(function(key) {
              return caches.delete(key);
          }));
      })
}


Детальніше в цій статті (абзац: "Скасування реєстрації службовця")


Інша можливість, через браузер, - це відкрити розділ "Зберігання кешу" та натиснути кнопку "Очистити дані про сайт":

введіть тут опис зображення


0

безпечно видаліть сервісного працівника

if ('serviceWorker' in navigator) {
      navigator.serviceWorker.getRegistrations().then(function (registrations) {
        for (const registration of registrations) {
          // unregister service worker
          console.log('serviceWorker unregistered');
          registration.unregister();
        }
      });
    }

0

виявити працівника служби:

navigator.serviceWorker.controller

Код для видалення службового працівника:

navigator.serviceWorker.getRegistrations()
  .then(registrations => {
    registrations.forEach(registration => {
      registration.unregister();
    })
  });

  navigator.serviceWorker.getRegistrations().then(function(registrations) {
   for(let registration of registrations) {
    registration.unregister()
  } })

  if(window.navigator && navigator.serviceWorker) {
    navigator.serviceWorker.getRegistrations()
    .then(function(registrations) {
      for(let registration of registrations) {
        registration.unregister();
      }
    });
  }

  if ('caches' in window) {
      caches.keys()
        .then(function(keyList) {
            return Promise.all(keyList.map(function(key) {
                return caches.delete(key);
            }));
        })
  }

  if ('serviceWorker' in navigator) {
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          for (const registration of registrations) {
            // unregister service worker
            console.log('serviceWorker unregistered');
            registration.unregister();

            setTimeout(function(){
              console.log('trying redirect do');
              window.location.replace(window.location.href); // because without redirecting, first time on page load: still service worker will be available
            }, 3000);
          }
        });
      }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.