서비스 워커를 어떻게 제거합니까?


161

/serviceworker.js루트 디렉토리에서 삭제 한 후에도 Chrome은 여전히 ​​웹 루트에서 제거한 서비스 워커를 실행합니다. 웹 사이트 및 Chrome에서 서비스 워커를 제거하여 웹 사이트에 다시 로그인하려면 어떻게해야합니까?

Service Work의 캐시 메커니즘에 대한 문제를 추적했으며 디버깅 할 시간이 될 때까지 지금 제거하고 싶습니다. 내가 사용하는 로그인 스크립트는 Google 서버로 리디렉션되어 Google 계정에 로그인합니다. 그러나 login.php 페이지에서 얻는 것은 ERR_FAILED메시지입니다.


2
Firefox에서도 같은 문제가 있습니다.
Costa

답변:


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
어떻게 도움이 되나요? 설치된 작업자가 페이지를 이미 캐시했으며 사용자가 새 스크립트를 가져 오지 않습니다.
riv

107

chrome : // serviceworker-internals / URL로 이동할 수도 있습니다 . 하여 서비스 작업자를 등록 취소 할 수도 있습니다.


9
이것을 dev 콘솔에 입력하여 한 번에 모두 등록을 취소 할 수 있습니다. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon

그러나 등록을 취소해야하는 다른 방문자 (친구, 사용자, 프로젝트 관리자 등)가있는 경우 위의 답변 (Daniel Herr의 답변)이 더 효과적인 솔루션입니다. 또한 iOS, Android, macOS, Windows 10의 맛으로 Firefox, Edge 및 Safari를 테스트 할 수 있습니다.
Steven Ventimiglia

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

37

프로그래밍 방식 은 물론 Chrome 개발자 도구 를 통해이 작업을 수행 할 수 있습니다 .

  1. 다음을 입력하여 실행중인 모든 인스턴스 또는 서비스 워커 찾기

    chrome : // serviceworker-internals /

    새 탭에서 등록을 취소 할 서비스 작업자를 선택하십시오.

  2. 개발자 도구 (F12)를 열고 응용 프로그램을 선택하십시오. 그런 다음

    스토리지 지우기-> 서비스 작업자 등록 취소를 선택하십시오.

    또는

    서비스 워커 선택-> 다시로드시 업데이트 선택

  3. 프로그래밍 방식으로

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


22

Chrome에서는 개발자 도구 (F12)-> 응용 프로그램-> 서비스 작업자로 이동 하여 해당 특정 도메인의 목록에서 서비스 작업자등록 취소 할 수 있습니다.

스크린 샷

이 방법은 사이트의 개발 모드에서 효과적이며 대부분 localhost프로젝트에서 실행 되므로 다른 프로젝트 개발에 필요할 수 있습니다.


5

장치에서 두 개의 API ( getRegistrationsgetRegistration)를 감지해야합니다 . 서비스 작업자에게는 모든 플랫폼에 고유 한 API 세트가 없습니다. 예를 들어 일부 브라우저에는 navigator.serviceWorker.getRegistration, no 만 있습니다 navigator.serviceWorker.getRegistrations. 따라서 두 가지를 모두 고려해야합니다.


3

참고로, MacOS Safari 브라우저를 사용 하는 경우 서비스 워커를 강제로 등록 해제하는 방법이 있습니다 (Safari 12.1의 단계 및 이미지).

  1. Safari> 기본 설정 ...> 개인 정보 보호> 웹 사이트 데이터 관리… 사파리 기본 설정 : 개인 정보

  2. 도메인 이름 (예 : 'localhost')을 입력하고 "제거"를 클릭하십시오 Safari 환경 설정 : 개인 정보 : 웹 사이트 데이터 관리

참고 : 서비스 워커 외에도이 도메인의 모든 캐시, 쿠키 및 데이터베이스가 지워집니다.


서비스 워커가 개인 창을 통해 설치된 경우 작동하지 않는 것 같습니다.
aris

3

SW 캐시를 삭제하려는 경우 이미 제공된 정답 외에도 다음 방법을 호출 할 수 있습니다.

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


이 문서 ( "서비스 노동자 등록 취소"단락)


브라우저를 통한 또 다른 가능성은 "캐시 저장소"섹션에 액세스하고 "사이트 데이터 지우기"단추를 클릭하는 것입니다.

여기에 이미지 설명을 입력하십시오


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);
          }
        });
      }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.