Vòng đời trình chạy của dịch vụ tiện ích

Trình chạy dịch vụ tiện ích phản hồi cả các sự kiện trình chạy dịch vụ tiêu chuẩn và các sự kiện trong không gian tên tiện ích. Các loại này được trình bày cùng nhau vì thường thì một loại sẽ theo sau một loại khác trong quá trình sử dụng tiện ích.

Cài đặt

Quá trình cài đặt diễn ra khi người dùng cài đặt hoặc cập nhật một worker dịch vụ từ Cửa hàng Chrome trực tuyến hoặc khi họ tải hoặc cập nhật một tiện ích chưa giải nén bằng trang chrome://extensions. Ba sự kiện xảy ra theo thứ tự dưới đây.

ServiceWorkerRegistration.install

Sự kiện đầu tiên được kích hoạt trong quá trình cài đặt là sự kiện cài đặt của worker dịch vụ web.

chrome.runtime.onInstalled

Tiếp theo là sự kiện onInstalled của tiện ích. Sự kiện này được kích hoạt khi tiện ích (không phải worker dịch vụ) được cài đặt lần đầu, khi tiện ích được cập nhật lên phiên bản mới và khi Chrome được cập nhật lên phiên bản mới. Sử dụng sự kiện này để thiết lập trạng thái hoặc để khởi chạy một lần, chẳng hạn như trình đơn theo bối cảnh.

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

Cuối cùng, sự kiện kích hoạt của worker dịch vụ sẽ được kích hoạt. Xin lưu ý rằng không giống như worker dịch vụ web, sự kiện này được kích hoạt ngay sau khi cài đặt tiện ích vì không có gì tương đương với việc tải lại trang trong tiện ích.

Khởi động tiện ích

Khi hồ sơ người dùng bắt đầu, sự kiện chrome.runtime.onStartup sẽ kích hoạt nhưng không có sự kiện nào của worker dịch vụ được gọi.

Ở chế độ rảnh và tắt

Thông thường, Chrome sẽ chấm dứt một worker dịch vụ khi đáp ứng một trong các điều kiện sau:

  • Sau 30 giây không hoạt động. Việc nhận một sự kiện hoặc gọi một API tiện ích sẽ đặt lại bộ hẹn giờ này.
  • Khi một yêu cầu (chẳng hạn như một sự kiện hoặc lệnh gọi API) mất nhiều hơn 5 phút để xử lý.
  • Khi phản hồi fetch() mất hơn 30 giây để đến.

Các sự kiện và lệnh gọi đến API tiện ích sẽ đặt lại các bộ hẹn giờ này và nếu trình chạy dịch vụ đã chuyển sang trạng thái ngủ, thì một sự kiện sắp tới sẽ kích hoạt lại các bộ hẹn giờ đó. Tuy nhiên, bạn nên thiết kế worker dịch vụ để có khả năng chống chịu khi bị chấm dứt đột ngột.

Để tối ưu hoá mức tiêu thụ tài nguyên của tiện ích, hãy tránh duy trì worker dịch vụ vô thời hạn nếu có thể. Kiểm tra các tiện ích của bạn để đảm bảo rằng bạn không vô tình làm điều này.

Duy trì dữ liệu thay vì sử dụng biến toàn cục

Mọi biến toàn cục mà bạn đặt sẽ bị mất nếu worker dịch vụ ngừng hoạt động. Thay vì sử dụng biến toàn cục, hãy lưu giá trị vào bộ nhớ. Dưới đây là các lựa chọn dành cho bạn. Xin lưu ý rằng Web Storage API không dùng được cho worker dịch vụ tiện ích.

chrome.storage API
API tiện ích cung cấp nhiều loại bộ nhớ; cục bộ, phiên, được quản lý (miền) và đồng bộ hoá. API này lưu trữ các đối tượng JSON được xác định và truy xuất bằng các khoá do nhà phát triển xác định. Loại bộ nhớ này sẽ không bị xoá khi người dùng xoá bộ nhớ đệm web.
IndexedDB API
API cấp thấp để lưu trữ dữ liệu có cấu trúc phía máy khách, bao gồm cả tệp và blob. API này cung cấp các dữ liệu gốc để tạo và truy xuất bộ nhớ dữ liệu giao dịch. Mặc dù API này thường quá phức tạp đối với các trường hợp sử dụng đơn giản, nhưng một số giải pháp lưu trữ bên thứ ba được xây dựng dựa trên API này.
CacheStorage API
Cơ chế lưu trữ ổn định cho các cặp đối tượng Yêu cầu và Phản hồi. API này được thiết kế riêng cho worker dịch vụ web và dùng để truy xuất dữ liệu từ một điểm cuối. Có nhiều cách để sử dụng API này tuỳ thuộc vào việc người dùng có cần xem dữ liệu mới nhất hay không và mức độ quan trọng của việc này. Để biết thêm thông tin, hãy xem Sách dạy nấu ăn ngoại tuyến. Trừ phi bạn đang dùng proxy cụ thể cho các yêu cầu mạng thông qua trình xử lý tìm nạp, bạn nên sử dụng chrome.storage.

Chọn phiên bản Chrome tối thiểu

Kể từ khi phát hành Tệp kê khai V3, chúng tôi đã cải tiến một số điểm về thời gian hoạt động của worker dịch vụ. Điều này có nghĩa là nếu tiện ích Manifest V3 của bạn hỗ trợ các phiên bản Chrome cũ, bạn cần lưu ý một số điều kiện. Nếu các điều kiện này không ảnh hưởng đến tiện ích của bạn, bạn có thể chuyển sang phần tiếp theo. Nếu có, hãy cân nhắc chỉ định phiên bản Chrome tối thiểu trong tệp kê khai.

Chrome 120

Giờ đây, bạn có thể đặt chuông báo ở khoảng thời gian tối thiểu là 30 giây để phù hợp với vòng đời của trình chạy dịch vụ. Hãy xem chrome.alarms để biết thêm thông tin chi tiết.

Chrome 118

Các phiên trình gỡ lỗi đang hoạt động được tạo bằng API chrome.debugger hiện vẫn giữ cho worker dịch vụ hoạt động. Điều này giúp trình chạy dịch vụ không bị hết thời gian chờ trong các lệnh gọi cho API này.

Chrome 116

Chrome 116 đã giới thiệu các điểm cải tiến sau đây về vòng đời của worker dịch vụ:

  • Các kết nối WebSocket đang hoạt động hiện sẽ kéo dài thời gian hoạt động của worker dịch vụ tiện ích. Việc gửi hoặc nhận thông báo qua WebSocket trong trình chạy dịch vụ tiện ích sẽ đặt lại bộ hẹn giờ rảnh của trình chạy dịch vụ.

  • Các API tiện ích bổ sung được phép vượt quá khoảng thời gian chờ 5 phút cho worker dịch vụ tiện ích. Các API này hiển thị lời nhắc cho người dùng, do đó có thể mất nhiều hơn 5 phút để giải quyết. Các phương thức này bao gồm desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall()permissions.request().

Chrome 114

Việc gửi tin nhắn bằng tin nhắn tồn tại lâu sẽ giúp worker dịch vụ luôn hoạt động. Trước đây, việc mở cổng sẽ đặt lại bộ hẹn giờ, nhưng việc gửi thông báo sẽ không. Việc mở cổng không còn đặt lại bộ hẹn giờ nữa.

Chrome 110

Lệnh gọi API của tiện ích sẽ đặt lại bộ hẹn giờ. Trước đây, chỉ trình xử lý sự kiện đang chạy mới duy trì hoạt động của worker dịch vụ. Mọi sự kiện đã được đưa vào hàng đợi nhưng chưa được gọi trình xử lý sẽ không gây ra việc đặt lại.

Chrome 109

Các thông báo được gửi từ tài liệu ngoài màn hình sẽ đặt lại bộ hẹn giờ.

Chrome 105

Việc kết nối với máy chủ nhắn tin gốc bằng chrome.runtime.connectNative() sẽ giúp worker dịch vụ luôn hoạt động. Nếu quy trình lưu trữ gặp sự cố hoặc bị tắt, cổng sẽ bị đóng và worker dịch vụ sẽ chấm dứt sau khi bộ hẹn giờ hoàn tất. Hãy ngăn chặn điều này bằng cách gọi chrome.runtime.connectNative() trong trình xử lý sự kiện onDisconnect của cổng.