2016-12-07 30 views
7

Để đăng ký một nhân viên phục vụ, tôi có thể gọiviệc sử dụng của `self.Clients.claim() là gì '

navigator.serviceWorker.register('/worker.js') 

Mỗi lần tải trang nó kiểm tra các phiên bản cập nhật của worker.js. Nếu tìm thấy bản cập nhật, nhân viên mới sẽ không được sử dụng cho đến khi tất cả các tab của trang được đóng lại và sau đó mở lại. Giải pháp tôi đọc là:

self.addEventListener('install', function(event) { 
    event.waitUntil(self.skipWaiting()); 
}); 
self.addEventListener('activate', function(event) { 
    event.waitUntil(self.clients.claim()); 
}); 

Tôi có thể hiểu phần skipWaiting, nhưng chính xác thì clients.claim() làm gì? Tôi đã thực hiện một số thử nghiệm đơn giản và có vẻ như hoạt động như mong đợi ngay cả khi không có nó.

+1

Nhận xét nhanh: gọi 'registration.update()' không * bắt buộc * để kiểm tra tập lệnh nhân viên dịch vụ đã cập nhật. Trình duyệt đã được thực hiện tự động sau một yêu cầu điều hướng. 'registration.update()' cho phép bạn kiểm tra mà không phải đợi các yêu cầu điều hướng, và thường không cần thiết. –

+0

Vâng, tôi vừa phát hiện ra điều đó từ khi tôi viết câu hỏi. – BonsaiOak

Trả lời

6

Tôi excerpting sau đây từ một guide to the service worker lifecycle:

clients.claim

Bạn có thể nắm quyền kiểm soát của khách hàng không kiểm soát được bằng cách gọi clients.claim() trong lao động dịch vụ của bạn khi nó đã được kích hoạt.

Here's biến thể của bản trình diễn ở trên gọi clients.claim() trong sự kiện kích hoạt của nó. Bạn sẽ thấy một con mèo lần đầu tiên. Tôi nói "nên", bởi vì đây là thời gian nhạy cảm. Bạn sẽ chỉ thấy một con mèo nếu nhân viên dịch vụ kích hoạt và clients.claim() có hiệu lực trước hình ảnh cố gắng tải.

Nếu bạn sử dụng lao động dịch vụ của bạn để tải các trang khác với họ sẽ tải qua mạng, clients.claim() có thể trở nên khó chịu, như nhân viên phục vụ của bạn kết thúc việc kiểm soát một số khách hàng mà nạp mà không nó.

Lưu ý: Tôi thấy rất nhiều người bao gồm clients.claim() như boilerplate, nhưng tôi hiếm khi làm như vậy bản thân mình. Nó chỉ thực sự quan trọng trong lần tải đầu tiên và do tăng cường tiến bộ, trang thường hoạt động bình thường mà không cần nhân viên phục vụ.

+0

Vì vậy, tôi lấy nó rằng 'self.skipWaiting()' sẽ được sử dụng để áp dụng ngay lập tức một bản cập nhật cho một serviceWorker hiện có, và 'clients.claim()' sẽ được sử dụng để kiểm soát ngay lập tức trên tải đầu tiên. – BonsaiOak

0

Nhân viên dịch vụ nắm quyền kiểm soát từ next page-reload sau khi đăng ký. Bằng cách sử dụng self.skipWaiting()self.clients.claim(), bạn có thể yêu cầu khách hàng kiểm soát nhân viên dịch vụ theo số first load.

ví dụ

Hãy nói rằng tôi cache một file hello.txt, và một lần nữa Nếu tôi thực hiện cuộc gọi cho hello.txt nó sẽ có cuộc gọi máy chủ làm mặc dù tôi có nguồn tài nguyên trong bộ nhớ cache của tôi. Đây là kịch bản khi tôi không sử dụng self.clients.claim(). Tuy nhiên, khi thực hiện cuộc gọi máy chủ cho hello.txt khi tải lại trang tiếp theo, nó sẽ phục vụ tài nguyên từ bộ nhớ cache.

Để giải quyết vấn đề này, tôi phải sử dụng kết hợp self.skipWaiting()self.clients.claim() để nhân viên dịch vụ bắt đầu phân phối nội dung ngay sau khi được kích hoạt.

P.S:

next page-reload nghĩa là trang xem lại.

first load biểu thị thời điểm khi trang được truy cập lần đầu tiên.

+0

vì vậy việc sử dụng 'self.clients.claim' sẽ gọi máy chủ cho tệp ngay cả khi tệp đó nằm trong bộ nhớ cache? Có đúng không? bạn có thể đề cập rõ ràng ý nghĩa của 'trang tiếp theo tải lại' hoặc' tải đầu tiên' không? –

+1

Sử dụng 'self.clients.claim' sẽ không gọi máy chủ nếu tệp nằm trong bộ nhớ cache đó. Nó sẽ được phục vụ từ bộ nhớ cache. Đã chỉnh sửa bài đăng theo đề xuất của bạn về 'tải lại trang tiếp theo 'và' tải đầu tiên' –

+0

Cảm ơn bạn đã sửa đổi nhưng vẫn không rõ ràng với tôi rằng bạn sẽ sử dụng 'self.clients.claim()' và bạn sẽ không viết phương pháp này? > Nếu tôi muốn nhận nội dung tệp luôn từ máy chủ thì tôi có cần phải viết 'self.clients.claim()' và sau đó nó sẽ tìm nạp từ bộ nhớ cache. –

Các vấn đề liên quan