Làm cách nào để gỡ cài đặt Công nhân dịch vụ?


161

Sau khi xóa /serviceworker.jskhỏi thư mục gốc của tôi, Chrome vẫn chạy nhân viên dịch vụ mà tôi đã xóa khỏi webroot của mình. Làm cách nào để gỡ cài đặt nhân viên dịch vụ khỏi trang web của tôi và Chrome để tôi có thể đăng nhập lại vào trang web của mình?

Tôi đã theo dõi vấn đề theo cơ chế bộ đệm của Service Work và tôi chỉ muốn xóa ngay bây giờ cho đến khi tôi có thời gian để gỡ lỗi. Tập lệnh đăng nhập mà tôi đang sử dụng chuyển hướng đến các máy chủ của Google để họ đăng nhập vào tài khoản Google của họ. Nhưng tất cả những gì tôi nhận được từ trang login.php là một ERR_FAILEDtin nhắn.


2
Tôi có cùng một vấn đề trong Firefox.
Costa

Câu trả lời:


309

Loại bỏ nhân viên phục vụ theo chương trình

Bạn có thể loại bỏ nhân viên phục vụ theo chương trình như thế này:

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

Tài liệu: getRegistations , hủy đăng ký

Loại bỏ nhân viên dịch vụ thông qua giao diện người dùng

Bạn cũng có thể xóa nhân viên dịch vụ trong tab Ứng dụng trong Chrome Devtools.


2
Tôi đã phải thêm "sử dụng nghiêm ngặt"; trước mã này để làm cho nó hoạt động.
mãKonami

8
Có bất cứ lúc nào dựa trên thời gian này không? Giả sử một người dùng đã truy cập một lần, đã đăng ký nhân viên và từ đó trở lại, tôi có cần giữ đoạn mã này trong cơ sở mã của chúng tôi mãi mãi chỉ trong trường hợp không?
loganfsmyth


10
Tôi có một bài đăng blog xem xét điều này và các nhân viên dịch vụ khác xóa / gỡ cài đặt tùy chọn love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love

3
Điều đó sẽ giúp như thế nào? Trang này đã được lưu trữ bởi công nhân đã cài đặt và tập lệnh mới của bạn sẽ không bao giờ được người dùng tìm nạp.
RIV

107

Bạn cũng có thể truy cập URL: chrome: // serviceworker-internals / và hủy đăng ký một nhân viên dịch vụ từ đó.


9
Bạn có thể nhập cái này vào bảng điều khiển dev để hủy đăng ký tất cả chúng trong một cú trượt. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon

Tuy nhiên, nếu bạn có những khách truy cập khác mà bạn cũng cần hủy đăng ký (bạn bè, người dùng, người quản lý dự án, v.v.), câu trả lời ở trên (của Daniel Herr) là một giải pháp hiệu quả. Bạn cũng đã có Firefox, Edge và Safari, cũng như các hương vị của iOS, Android, macOS, Windows 10 để thử nghiệm.
Steven Ventimiglia

$$ ('. Unregister'). ForEach (item => item.click ())
Tra Mandov.dev

37

Bạn có thể thực hiện việc này thông qua Chrome Developer Tool cũng như lập trình .

  1. Tìm tất cả các cá thể đang chạy hoặc nhân viên dịch vụ bằng cách gõ

    chrome: // serviceworker-internals /

    trong một tab mới và sau đó chọn công cụ dịch vụ bạn muốn hủy đăng ký.

  2. Mở Công cụ dành cho nhà phát triển (F12) và chọn Ứng dụng. Sau đó hoặc

    Chọn Xóa bộ nhớ -> Hủy đăng ký nhân viên dịch vụ

    hoặc là

    Chọn Nhân viên phục vụ -> Chọn Cập nhật khi tải lại

  3. Có lập trình

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


22

Trong Google Chrome, bạn có thể truy cập Công cụ dành cho nhà phát triển (F12) -> Ứng dụng -> Nhân viên dịch vụhủy đăng ký nhân viên dịch vụ khỏi danh sách cho tên miền cụ thể đó.

Ảnh chụp màn hình

Phương pháp này có hiệu quả trong chế độ phát triển của một trang web và chủ yếu là chúng chạy trên localhostđó bạn có thể cần để phát triển dự án khác.


5

Bạn nên phát hiện hai API trong thiết bị của mình: getRegistationsgetRegistration . Nhân viên dịch vụ không có một bộ API duy nhất trong tất cả các nền tảng. Ví dụ, một số trình duyệt chỉ có một navigator.serviceWorker.getRegistration, không navigator.serviceWorker.getRegistrations. Vì vậy, bạn nên xem xét với cả hai.


3

FYI, trong trường hợp bạn đang sử dụng trình duyệt MacOS Safari , có một cách để hủy đăng ký một nhân viên dịch vụ (các bước và hình ảnh cho Safari 12.1):

  1. Safari> Tùy chọn ...> Quyền riêng tư> Quản lý dữ liệu trang web Tùy chọn Safari: Quyền riêng tư

  2. Nhập tên miền (ví dụ: 'localhost'), nhấp vào "Xóa" Tùy chọn Safari: Quyền riêng tư: quản lý dữ liệu trang web

Lưu ý: Ngoài nhân viên phục vụ, điều này cũng sẽ xóa tất cả bộ nhớ cache, cookie và cơ sở dữ liệu cho miền này.


Có vẻ như điều này không hoạt động nếu nhân viên dịch vụ được cài đặt qua Cửa sổ riêng.
aris

3

Ngoài các câu trả lời đã được đưa ra, nếu bạn cũng muốn xóa bộ đệm SW, bạn có thể gọi phương thức sau:

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


Thêm trong bài viết này (Đoạn: "Hủy đăng ký nhân viên phục vụ")


Một khả năng khác, thông qua Trình duyệt, là bằng cách truy cập phần "Bộ nhớ cache" và nhấp vào nút "Xóa dữ liệu trang web":

nhập mô tả hình ảnh ở đây


0

gỡ cài đặt an toàn Công nhân dịch vụ

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

để phát hiện nhân viên phục vụ:

navigator.serviceWorker.controller

Mã để xóa nhân viên phục vụ:

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);
          }
        });
      }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.