Đôi khi, một trình chạy dịch vụ bị lỗi được triển khai,
sau đó là gặp vấn đề.
Ví dụ: một trình chạy dịch vụ có thể được phân tích cú pháp tại thời điểm đăng ký và hoàn tất quá trình cài đặt thành công.
Tuy nhiên, mã bị lỗi trong sự kiện fetch
có thể khiến mã này không phản hồi các yêu cầu,
khiến trang trống. Một khả năng khác là mã đánh dấu trang được lưu vào bộ nhớ đệm thường xuyên,
và trình chạy dịch vụ chỉ trả về các phản hồi đánh dấu cũ từ thực thể Cache
cho các lượt truy cập tiếp theo.
Có nhiều cách để một trình chạy dịch vụ tác động ngược lại, và đó là một vấn đề đáng sợ gặp phải trên trang web sản xuất. Dù vậy, tất cả vẫn không mất đi. Có nhiều cách để khắc phục tình huống và trở lại đúng hướng.
Triển khai một trình chạy dịch vụ không hoạt động
Thông thường, để xử lý một trình chạy dịch vụ bị lỗi, tất cả những gì bạn cần làm là triển khai
no-op (không hoạt động) có thể cài đặt và kích hoạt ngay lập tức mà không cần trình xử lý sự kiện fetch
:
// sw.js
self.addEventListener('install', () => {
// Skip over the "waiting" lifecycle state, to ensure that our
// new service worker is activated immediately, even if there's
// another tab open controlled by our older service worker code.
self.skipWaiting();
});
self.addEventListener('activate', () => {
// Optional: Get a list of all the current open windows/tabs under
// our service worker's control, and force them to reload.
// This can "unbreak" any open windows/tabs as soon as the new
// service worker activates, rather than users having to manually reload.
self.clients.matchAll({
type: 'window'
}).then(windowClients => {
windowClients.forEach((windowClient) => {
windowClient.navigate(windowClient.url);
});
});
});
Trình chạy dịch vụ này sẽ cài đặt và kích hoạt ngay lập tức bằng cách gọi
self.skipWaiting()
trong sự kiện install
.
Bạn có thể tuỳ ý triển khai mã bổ sung trong sự kiện activate
để buộc tải lại mọi thẻ đang mở khác có WindowClient
mà trình chạy dịch vụ đang kiểm soát.
Điều rất quan trọng là trình chạy dịch vụ không hoạt động không chứa trình xử lý sự kiện fetch
.
Khi một trình chạy dịch vụ không xử lý yêu cầu,
các yêu cầu đó chuyển đến trình duyệt như thể không có trình chạy dịch vụ nào.
Sau khi triển khai một trình chạy dịch vụ không hoạt động, bạn có thể sửa trình chạy dịch vụ bị lỗi và triển khai dưới dạng bản cập nhật vào lúc khác.
Phương pháp này phát huy hiệu quả một phần do trình duyệt có các biện pháp bảo vệ mạnh mẽ để tránh đặt trình chạy dịch vụ vào bộ nhớ đệm HTTP và vì trình duyệt thực hiện kiểm tra từng byte đối với nội dung của trình chạy dịch vụ để cập nhật. Các chế độ mặc định này giúp bạn có thể triển khai phương thức thay thế không hoạt động cho một trình thực thi dịch vụ bị lỗi để nhanh chóng khắc phục sự cố.
Các biện pháp khác cần thực hiện
Việc triển khai một trình chạy dịch vụ không hoạt động là đủ để vô hiệu hoá một trình chạy dịch vụ bị lỗi, nhưng có thể thực hiện các biện pháp bổ sung nếu cần thiết.
Nếu bạn không biết URL của trình chạy dịch vụ cũ thì sao?
Đôi khi URL của trình chạy dịch vụ đã cài đặt trước đó không xác định. Điều này có thể là do phiên bản đã được tạo phiên bản (chẳng hạn như có chứa hàm băm trong tên tệp). Trong trường hợp này, bạn có thể gặp khó khăn khi triển khai một trình chạy dịch vụ không hoạt động khớp với URL của từng trình chạy dịch vụ cũ có thể được đăng ký. Điều này đi ngược lại với các phương pháp hay nhất, vì các nhà phát triển có thể sẽ không nhớ mọi hàm băm cho mọi phiên bản trình chạy dịch vụ đã được triển khai.
May mắn thay, tiêu đề yêu cầu HTTP hữu ích sẽ được gửi cùng với yêu cầu tập lệnh trình chạy dịch vụ:
Service-Worker
.
Trên máy chủ web, hãy kiểm tra tiêu đề này và chặn yêu cầu phân phát một trình chạy dịch vụ không hoạt động.
Việc này còn tuỳ thuộc vào máy chủ web và ngăn xếp phụ trợ được sử dụng. Vì vậy, hãy tham khảo tài liệu của ngôn ngữ liên quan về cách thực hiện việc này.
Đối với việc triển khai trình chạy dịch vụ trong tương lai, hãy sử dụng tên thành phần chưa tạo phiên bản (ví dụ: sw.js
).
Việc này sẽ giúp mọi thứ bớt phức tạp hơn rất nhiều sau này.
Đặt tiêu đề Clear-Site-Data
Một số trình duyệt sẽ huỷ đăng ký tất cả trình chạy dịch vụ cho một nguồn gốc nếu một
Đã đặt tiêu đề phản hồi Clear-Site-Data
có giá trị 'storage'
.
Tuy nhiên, có một vài điều bạn cần lưu ý về phương pháp này:
- Xin lưu ý rằng thao tác này sẽ xoá tất cả bộ nhớ cho máy chủ gốc liên quan. Bộ nhớ đó bao gồm
localStorage
, IndexedDB,sessionStorage
và các bộ nhớ khác (nhưng không phải bộ nhớ đệm HTTP cho máy chủ gốc). - Tiêu đề này không được hỗ trợ trong một số trình duyệt.
Vì sự hỗ trợ cho tiêu đề này không phải là toàn bộ, nên bạn không thể dựa vào một mình để khắc phục sự cố.
Do đó, tốt nhất là bạn nên xem Clear-Site-Data
làm một biện pháp cần thực hiện ngoài việc triển khai trình chạy dịch vụ không hoạt động.
Tổn thương không tồn tại vĩnh viễn
Có thể bạn sẽ cảm thấy sợ hãi khi trải nghiệm người dùng bị gián đoạn bởi một nhân viên dịch vụ bị lỗi — đặc biệt là đối với các trang web lớn và nổi tiếng — nhưng thiệt hại chỉ là tạm thời và có thể khắc phục!
Nếu cần phải triển khai một trình chạy dịch vụ không hoạt động để khắc phục tình huống này, hãy dành thời gian sau khi thực tế để tìm ra chính xác vấn đề đã xảy ra. Trong tương lai, hãy đảm bảo rằng trình chạy dịch vụ chỉ xử lý các yêu cầu dự kiến. Thường xuyên thử nghiệm trong giai đoạn thử nghiệm và chỉ triển khai bản cập nhật khi đã tự tin.