Bagaimana cara menghapus Pekerja Layanan?

161

Setelah menghapus /serviceworker.jsdari direktori root saya, Chrome masih menjalankan pekerja layanan yang saya hapus dari webroot saya. Bagaimana cara menghapus instalasi pekerja layanan dari situs web saya dan Chrome sehingga saya dapat masuk kembali ke situs web saya?

Saya telah melacak masalahnya hingga ke mekanisme cache Service Work dan saya hanya ingin menghapus untuk sekarang sampai saya punya waktu untuk men-debug itu. Skrip login yang saya gunakan mengalihkan ke server Google agar mereka masuk ke akun Google mereka. Tapi yang saya dapatkan dari halaman login.php hanyalah sebuah ERR_FAILEDpesan.

Mark Tomlin
sumber
2
Saya memiliki masalah yang sama di Firefox.
Costa

Jawaban:

309

Menghapus Pekerja Layanan Secara Programatis

Anda dapat menghapus pekerja layanan secara terprogram seperti ini:

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

Documents: getRegistrations , batalkan pendaftaran

Menghapus Pekerja Layanan Melalui Antarmuka Pengguna

Anda juga dapat menghapus pekerja layanan di bawah tab Aplikasi di Chrome Devtools.

Daniel Herr
sumber
2
Saya harus menambahkan "gunakan ketat"; sebelum kode ini untuk membuatnya berfungsi.
codeKonami
8
Apakah ada waktu berdasarkan hal ini? Katakanlah seorang pengguna mengunjungi sekali, mendaftarkan pekerja, dan belum kembali sejak itu, apakah saya perlu menyimpan potongan ini di basis kode kami selamanya untuk berjaga-jaga?
loganfsmyth
10
Saya memiliki posting blog yang mengulas hal ini dan pekerja layanan lainnya menghapus / menghapus opsi love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love
3
Bagaimana itu membantu? Halaman ini sudah di-cache oleh pekerja yang diinstal dan skrip baru Anda tidak akan pernah diambil oleh pengguna.
riv
107

Anda juga dapat membuka URL: chrome: // serviceworker-internal / dan membatalkan pendaftaran serviceworker dari sana.

k00k
sumber
9
Anda dapat mengetikkan ini ke konsol dev untuk membatalkan registrasi semuanya dalam satu gerakan. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon
Namun, jika Anda memiliki pengunjung lain yang perlu Anda batalkan pendaftaran juga (teman, pengguna, manajer proyek, dll.), Jawaban di atas (oleh Daniel Herr) lebih merupakan solusi yang efektif. Anda juga punya Firefox, Edge dan Safari, juga, dalam rasa iOS, Android, macOS, Windows 10 untuk masing-masing untuk diuji.
Steven Ventimiglia
$$ ('. batalkan pendaftaran'). forEach (item => item.click ())
Travnikov.dev
37

Anda dapat melakukan ini melalui Alat Pengembang Chrome dan juga secara terprogram .

  1. Temukan semua instance yang berjalan atau pekerja layanan dengan mengetik

    chrome: // serviceworker-internal /

    di tab baru dan kemudian pilih pekerja layanan yang ingin Anda batalkan pendaftaran.

  2. Buka Alat Pengembang (F12) dan Pilih Aplikasi. Kemudian

    Pilih Bersihkan Penyimpanan -> Hapus layanan pekerja

    atau

    Pilih Pekerja Layanan -> Pilih Perbarui saat Muat Ulang

  3. Secara terprogram

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

Sakshi Nagpal
sumber
22

Di Google Chrome, Anda dapat pergi ke Alat pengembang (F12) -> Aplikasi -> Pekerja layanan dan membatalkan pendaftaran pekerja layanan dari daftar untuk domain tertentu.

Tangkapan layar

Metode ini efektif dalam mode pengembangan situs dan sebagian besar berjalan di localhostmana Anda mungkin perlu untuk pengembangan proyek lain.

Asim KT
sumber
5

Anda harus mendeteksi dua API di perangkat Anda: getRegistrations dan getRegistration . Pekerja layanan tidak memiliki serangkaian API unik di semua platform. Misalnya, beberapa browser hanya memiliki navigator.serviceWorker.getRegistration, no navigator.serviceWorker.getRegistrations. Jadi Anda harus mempertimbangkan keduanya.

GuoX
sumber
3

FYI, jika Anda menggunakan browser MacOS Safari , ada satu cara untuk secara paksa membatalkan registrasi pekerja layanan (langkah dan gambar untuk Safari 12.1):

  1. Safari> Preferensi ...> Privasi> Kelola Data Situs Web ... Preferensi Safari: Privasi

  2. Masukkan nama domain (mis. 'Localhost'), klik "Hapus" Preferensi Safari: Privasi: mengelola data situs web

Catatan: Selain pekerja layanan, ini juga akan menghapus semua cache, cookie, dan database untuk domain ini.

terrymorse
sumber
Sepertinya ini tidak berfungsi jika pekerja layanan diinstal melalui Jendela Pribadi.
aris
3

Selain jawaban yang sudah benar diberikan, jika Anda ingin juga menghapus cache SW Anda dapat memanggil metode berikut:

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


Lebih banyak dalam artikel ini (Paragraf: "Batalkan pendaftaran seorang pekerja layanan")


Kemungkinan lain, melalui Browser, adalah dengan mengakses bagian "Penyimpanan Tembolok" dan klik tombol "Bersihkan Data Situs":

masukkan deskripsi gambar di sini

Francesco
sumber
0

uninstall Pekerja Layanan dengan aman

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

untuk mendeteksi pekerja layanan:

navigator.serviceWorker.controller

Kode untuk penghapusan pekerja layanan:

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);
          }
        });
      }
Vital
sumber