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 một trình chạy 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.

Không hoạt động và tắt máy

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ộ tính 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ờ này. Tuy nhiên, bạn nên thiết kế trình chạy dịch vụ có khả năng phục hồi chống lại việc chấm dứt bất ngờ.

Để tối ưu hoá việc sử dụng tài nguyên của tiện ích, hãy tránh duy trì hoạt động của trình thực thi 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ớ. Các lựa chọn của bạn được liệt kê bên dưới. Xin lưu ý rằng bạn không thể sử dụng Web Storage API cho trình chạy dịch vụ tiện ích.

chrome.storage API
API tiện ích cung cấp nhiều loại bộ nhớ; bộ nhớ cục bộ, bộ nhớ phiên, bộ nhớ được quản lý (miền) và bộ nhớ đồng bộ hóa. 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ác tệp và blob. API này cung cấp các dữ liệu gốc để tạo và truy xuất 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ữ của bên thứ ba được xây dựng dựa trên API này.
API Bộ nhớ đệm
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ó thấy dữ liệu mới nhất hay không và có quan trọng hay không. Để biết thêm thông tin, hãy xem Sách 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 một 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 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 giữ cho trình chạy dịch vụ vẫn 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 đối với trình chạy 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 biểu tượng 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 dài 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ỉ các trình xử lý sự kiện đang chạy mới có thể duy trì hoạt động của trình chạy 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

Tin nhắn gửi từ tài liệu ngoài màn hình sẽ đặt lại đồng hồ 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.