ฉันจะถอนการติดตั้ง Service Worker ได้อย่างไร


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

Docs: getRegistrations , unregister

การลบพนักงานบริการผ่านส่วนต่อประสานผู้ใช้

คุณสามารถลบพนักงานบริการภายใต้แท็บแอปพลิเคชันใน Chrome Devtools


2
ฉันต้องเพิ่ม "ใช้เข้มงวด"; ก่อนหน้ารหัสนี้เพื่อให้ทำงานได้
codeKonami

8
มีเวลาตามนี้ไหม? พูดว่าผู้ใช้เข้าเยี่ยมชมครั้งเดียวลงทะเบียนผู้ปฏิบัติงานและไม่ได้กลับมาตั้งแต่ฉันต้องเก็บข้อมูลโค้ดนี้ไว้ใน codebase ของเราตลอดไปหรือไม่?
loganfsmyth


10
ฉันมีโพสต์บล็อกที่ตรวจสอบเรื่องนี้และพนักงานบริการคนอื่น ๆ ลบ / ถอนการติดตั้งตัวเลือกlove2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love

3
มันจะช่วยได้อย่างไร หน้านี้ถูกแคชไว้โดยผู้ปฏิบัติงานที่ติดตั้งแล้วและสคริปต์ใหม่ของคุณจะไม่ถูกเรียกใช้โดยผู้ใช้
riv

107

คุณยังสามารถไปที่ URL: chrome: // serviceworker-internals /และยกเลิกการลงทะเบียน serviceworker จากที่นั่น


9
คุณสามารถพิมพ์สิ่งนี้ลงในคอนโซล dev เพื่อยกเลิกการลงทะเบียนทั้งหมดในคราวเดียว 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 เครื่องมือสำหรับนักพัฒนาเช่นเดียวกับProgramatically

  1. ค้นหาอินสแตนซ์ที่ทำงานอยู่ทั้งหมดหรือพนักงานบริการโดยการพิมพ์

    chrome: // ServiceWorker-internals /

    ในแท็บใหม่แล้วเลือกเจ้าหน้าที่บริการที่คุณต้องการยกเลิกการลงทะเบียน

  2. เปิดเครื่องมือผู้พัฒนา (F12) และเลือกแอปพลิเคชัน จากนั้นทั้งสองอย่าง

    เลือก Clear Storage -> ยกเลิกการลงทะเบียนพนักงานบริการ

    หรือ

    เลือกพนักงานบริการ -> เลือกอัปเดตเมื่อโหลดซ้ำ

  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

คุณควร detecte สอง API ในอุปกรณ์ของคุณ: getRegistrationsและgetRegistration พนักงานบริการไม่มีชุด API เฉพาะในทุกแพลตฟอร์ม ยกตัวอย่างเช่นเบราว์เซอร์บางเพียง แต่มีไม่มีnavigator.serviceWorker.getRegistration navigator.serviceWorker.getRegistrationsดังนั้นคุณควรพิจารณาทั้งสองอย่าง


3

FYI ในกรณีที่คุณใช้เบราว์เซอร์MacOS Safariมีวิธีหนึ่งในการบังคับให้ยกเลิกการลงทะเบียนพนักงานบริการ (ขั้นตอนและรูปภาพสำหรับ Safari 12.1):

  1. Safari> ค่ากำหนด ... > ความเป็นส่วนตัว> จัดการข้อมูลเว็บไซต์ ... การตั้งค่า 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.