Service Workerをアンインストールするにはどうすればよいですか?


161

/serviceworker.jsルートディレクトリから削除した後も、Chromeはウェブルートから削除したService Workerを実行します。WebサイトとChromeからService Workerをアンインストールして、Webサイトに再度ログインするにはどうすればよいですか?

私はService Workのキャッシュメカニズムまで問題を追跡しましたが、デバッグする時間があるまで今は削除したいと思います。私が使用しているログインスクリプトは、GoogleアカウントにログインするためにGoogleのサーバーにリダイレクトします。しかし、login.phpページから取得するのはERR_FAILEDメッセージだけです。


2
Firefoxでも同じ問題が発生します。
コスタ

回答:


309

プログラムによるサービスワーカーの削除

次のようにプログラムでService Workerを削除できます。

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

ドキュメント:getRegistrations登録解除

ユーザーインターフェイスを介したサービスワーカーの削除

Chrome Devtoolsの[アプリケーション]タブでService Workerを削除することもできます。


2
「use strict」を追加する必要がありました。これを機能させるには、このコードの前に。
codeKonami 2016年

8
これに関連する時間ベースはいつですか?ユーザーが一度訪問し、ワーカーを登録し、それから戻ってこないとしたら、念のためにこのスニペットをコードベースに永久に保持する必要がありますか?
loganfsmyth


10
これと他のサービスワーカーの削除/アンインストールオプションをレビューするブログ投稿love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love

3
それはどのように役立ちますか?ページはインストールされたワーカーによってすでにキャッシュされており、新しいスクリプトがユーザーによってフェッチされることはありません。
RIV

107

URL:chrome:// serviceworker-internals /にアクセスして、そこからサービスワーカーの登録を解除することもできます。


9
これを開発コンソールに入力して、それらすべてを一度に登録解除できます。document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon

ただし、登録解除する必要がある他の訪問者(友人、ユーザー、プロジェクトマネージャーなど)がいる場合は、上記の回答(Daniel Herrによる)がより効果的な解決策です。また、テストするために、Firefox、Edge、Safari、iOS、Android、macOS、Windows 10のフレーバーも用意されています。
Steven Ventimiglia

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

37

これは、プログラムと同様にChromeデベロッパーツールを使用して行うことができます。

  1. 次のように入力して、実行中のすべてのインスタンスまたはService Workerを検索します

    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

Google Chromeでは、開発者ツール(F12)->アプリケーション->サービスワーカーに移動し、その特定のドメインのリストからサービスワーカーの登録を解除できます。

スクリーンショット

この方法は、サイトの開発モードで効果的であり、ほとんどのlocalhost場合、他のプロジェクトの開発に必要な場合に実行されます。


5

デバイスで2つのAPIを検出する必要があります:getRegistrationsgetRegistration。サービスワーカーは、すべてのプラットフォームに固有のAPIセットを備えていません。たとえば、一部のブラウザにはのみ、navigator.serviceWorker.getRegistrationはありませんnavigator.serviceWorker.getRegistrations。したがって、両方を検討する必要があります。


3

参考までに、MacOS Safariブラウザを使用している場合は、Service Workerを強制的に登録解除する1つの方法があります(Safari 12.1の手順と画像):

  1. Safari>設定...>プライバシー> Webサイトデータの管理… Safariの設定:プライバシー

  2. ドメイン名(例: 'localhost')を入力し、[削除]をクリックします Safariの設定:プライバシー:Webサイトデータの管理

注:これにより、Service Workerに加えて、このドメインのすべてのキャッシュ、Cookie、データベースが消去されます。


Service Workerがプライベートウィンドウ経由でインストールされた場合、これは機能しないようです。
アリス

3

既に与えられた正しい回答に加えて、SWキャッシュも削除したい場合は、次のメソッドを呼び出すことができます。

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


この記事の 詳細(段落:「サービスワーカーの登録解除」)


ブラウザ経由でのもう1つの可能性は、[キャッシュストレージ]セクションにアクセスし、[サイトデータのクリア]ボタンをクリックすることです。

ここに画像の説明を入力してください


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

Service Workerを検出するには:

navigator.serviceWorker.controller

Service Workerを削除するためのコード:

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.