Xoá trình chạy dịch vụ bị lỗi

Đôi khi, một trình chạy dịch vụ lỗi được triển khai, và sau đó xảy ra sự cố. 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ã lỗi trong sự kiện fetch có thể khiến sự kiện đó không phản hồi yêu cầu, dẫn đến một 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à một trình chạy dịch vụ chỉ trả về các phản hồi mã đá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 nhân viên dịch vụ có thể kích hoạt lại và đó là một vấn đề đáng sợ trên trang web sản xuất. Mặc dù vậy, tất cả vẫn không bị mất. Có nhiều cách để khắc phục tình huống này và trở lại đúng hướng.

Triển khai trình chạy dịch vụ không hoạt động

Để xử lý một trình chạy dịch vụ lỗi thông thường, bạn chỉ cần triển khai một trình chạy dịch vụ không hoạt động cơ bản. Trình chạy này sẽ 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 bằng WindowClient mà worker đang kiểm soát.

Điều quan trọng là một worker 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ý các yêu cầu, các yêu cầu đó sẽ 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 trình chạy dịch vụ không hoạt động, trình chạy dịch vụ lỗi có thể được khắc phục và triển khai dưới dạng bản cập nhật sau này.

Phương pháp này có hiệu quả một phần vì các trình duyệt có các biện pháp bảo vệ mạnh mẽ để chống lại việc đưa trình chạy dịch vụ vào bộ nhớ đệm HTTP cũng như do các trình duyệt thực hiện việc kiểm tra nội dung của trình chạy dịch vụ theo từng byte để tìm các bản cập nhật. Các giá trị 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 chạy dịch vụ 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 lỗi, nhưng bạn có thể thực hiện thêm các biện pháp nếu cần.

Nếu bạn không biết URL của trình chạy dịch vụ cũ thì sao?

Đôi khi, không xác định được URL của một trình chạy dịch vụ đã cài đặt trước đó. Điều này có thể là do tệp đã được tạo phiên bản (ví dụ: 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 ghi nhớ từng hàm băm cho mọi phiên bản trình chạy dịch vụ đã được triển khai.

Rất may là một tiêu đề của yêu cầu HTTP hữu ích sẽ được gửi cùng với một yêu cầu về 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 worker không hoạt động. Việc hoàn thành thành tích này phụ 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 để biết cách làm việc này.

Đối với các lần 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 không được tạo phiên bản (ví dụ: sw.js). Điều này sẽ giúp mọi thứ trở nên ít phức tạp hơn 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 bạn đặt tiêu đề phản hồi Clear-Site-Data có giá trị 'storage'. Tuy nhiên, có một số điều bạn cần lưu ý với phương pháp này:

Bởi vì hỗ trợ cho tiêu đề này không phải là toàn bộ, nên không thể dựa vào một mình để khắc phục sự cố. Do đó, tốt nhất bạn nên xem Clear-Site-Data như một biện pháp cần thực hiện bên cạnh việc triển khai trình chạy dịch vụ không hoạt động.

Thiệt hại không vĩnh viễn

Thật đáng sợ khi trải nghiệm người dùng bị làm gián đoạn bởi một nhân viên dịch vụ lỗi — đặc biệt đố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à khắc phục được!

Nếu cần 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, hãy dành thời gian sau khi thực tế để tìm hiểu chính xác vấn đề. Trong tương lai, hãy đảm bảo rằng một trình chạy dịch vụ chỉ xử lý các yêu cầu như dự kiến. Thường xuyên kiểm thử trong giai đoạn thử nghiệm và chỉ triển khai bản cập nhật khi đã tự tin.