Как мне удалить Service Worker?

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()
} })

Документы: получитьРегистрации , отменить регистрацию

Удаление сервисных работников через пользовательский интерфейс

Вы также можете удалить обслуживающего персонала на вкладке «Приложение» в Chrome Devtools.

Даниэль Херр
источник
2
Я должен был добавить «использовать строгий»; перед этим кодом, чтобы заставить его работать.
CodeKonami
8
Есть ли время вокруг этого? Скажем, пользователь посетил один раз, зарегистрировал работника и с тех пор не возвращался, нужно ли мне на всякий случай сохранить этот фрагмент в нашей кодовой базе навсегда?
loganfsmyth
3
Подробная версия: gist.github.com/mrienstra/9c60a76009480e2240770dadb2fb96fe
mrienstra
10
У меня есть запись в блоге с обзором этого и других сервисных работников. Параметры
Крис Лав
3
Как это поможет? Страница уже кэширована установленным работником, и ваш новый скрипт никогда не будет выбран пользователями.
РИВ
107

Вы также можете перейти по URL-адресу: chrome: // serviceworker-internals / и отменить регистрацию на этом сервере.

k00k
источник
9
Вы можете ввести это в консоли разработчика, чтобы отменить регистрацию всех одним махом. document.querySelectorAll(".unregister").forEach(item=>item.click())
Senbon
Однако, если у вас есть другие посетители, которых вам также необходимо отменить регистрацию (друзья, пользователи, менеджеры проектов и т. Д.), Ответ выше (Даниэль Херр) является более эффективным решением. У вас также есть Firefox, Edge и Safari, а также версии для iOS, Android, macOS, Windows 10 для тестирования каждого.
Стивен Вентимилья
. $$ ( 'незарегистрированный') Foreach (пункт => item.click ())
Travnikov.dev
37

Вы можете сделать это с помощью Chrome Developer Tool, а также Programatics .

  1. Найдите все работающие экземпляры или сервисные работники, набрав

    хром: // serviceworker-Внутренность /

    на новой вкладке, а затем выберите сервис-работника, которого вы хотите отменить.

  2. Откройте Инструменты разработчика (F12) и выберите Приложение. Тогда либо

    Выберите Очистить хранилище -> Отменить регистрацию сервисного работника.

    или

    Выберите Service Workers -> Выберите Обновить при перезагрузке

  3. Programatically

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 на всех платформах. Например, некоторые браузеры имеют только navigator.serviceWorker.getRegistration, нет navigator.serviceWorker.getRegistrations. Таким образом, вы должны рассмотреть с обоими.

GuoX
источник
3

К вашему сведению, если вы используете браузер MacOS Safari , есть один способ принудительной отмены регистрации работника сервиса (шаги и изображения для Safari 12.1):

  1. Safari> Настройки ...> Конфиденциальность> Управление данными сайта… Настройки Safari: Конфиденциальность

  2. Введите доменное имя (например, «localhost»), нажмите «Удалить» Настройки Safari: конфиденциальность: управление данными сайта

Примечание. В дополнение к работникам служб это также приведет к удалению всех кэшей, файлов cookie и баз данных для этого домена.

terrymorse
источник
Похоже, это не работает, если сервисные работники были установлены через личное окно.
ARIS
3

В дополнение к уже полученным правильным ответам, если вы хотите также удалить кэш SW, вы можете вызвать следующий метод:

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


Подробнее в этой статье (пункт: «Отменить регистрацию работника сферы услуг»)


Еще одна возможность через браузер - открыть раздел «Хранилище кэша» и нажать кнопку «Очистить данные сайта»:

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

Francesco
источник
0

безопасно удалить Service Worker

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);
          }
        });
      }
Жизненно важно
источник