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


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.