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

Các worker dịch vụ của tiện ích sẽ phản hồi cả các sự kiện worker dịch vụ tiêu chuẩn và các sự kiện trong không gian tên của tiện ích. Chúng đượ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 đóng gói bằng trang chrome://extensions. Ba sự kiện xảy ra theo thứ tự sau:

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

Tiếp theo là sự kiện onInstalled của tiện ích. Sự kiện này sẽ kích hoạt khi tiện ích (không phải trình chạy 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 để đặt 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 activate của service worker sẽ được kích hoạt. Xin lưu ý rằng không giống như trình chạy dịch vụ web, sự kiện này sẽ được kích hoạt ngay sau khi cài đặt mộ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 một 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 trình chạy dịch vụ nào đượ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 một trong các điều kiện sau được đáp ứng:

  • Sau 30 giây không hoạt động. Việc nhận được 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 duy nhất (chẳng hạn như một sự kiện hoặc lệnh gọi API) mất 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. Nếu trình thực thi dịch vụ đã ngừng hoạt động, thì một sự kiện đến sẽ khôi phục chúng. 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 trước tình trạng chấm dứt không mong muốn.

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

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

Mọi biến chung mà bạn đặt sẽ bị mất nếu trình chạy dịch vụ tắt. Thay vì sử dụng các 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 sẽ xuất hiện.

chrome.storage API
Một 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 trên web.
IndexedDB API
Một 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 thành phần cơ bản để tạo hoạt động lưu trữ 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 một số trường hợp sử dụng, 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.
CacheStorage API
Cơ chế lưu trữ liên tục cho các cặp đối tượng Yêu cầu và Phản hồi. API này được thiết kế dành riêng cho các worker dịch vụ web và được 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 độ cần thiết của việc này. Để biết thêm thông tin, hãy xem The Offline Cookbook (Sổ tay ngoại tuyến). Trừ phi đang đặc biệt chuyển yêu cầu mạng qua proxy bằng 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 Manifest V3, chúng tôi đã thực hiện một số điểm cải tiến đối với 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ũ hơn, thì bạn cần lưu ý một số điều kiện. Nếu những điều kiện này không ảnh hưởng đến tiện ích của bạn, thì 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 gỡ lỗi đang hoạt động được tạo bằng API chrome.debugger hiện vẫn duy trì hoạt động của service worker. Điều này giúp các worker 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 những điểm cải tiến sau đây về thời gian hoạt động của worker dịch vụ:

  • Các kết nối WebSocket đang hoạt động hiện 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 trên WebSocket trong một trình chạy dịch vụ tiện ích sẽ đặt lại bộ hẹn giờ ở trạng thái 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ờ năm phút đối với các worker dịch vụ của tiện ích. Các API này hiển thị lời nhắc cho người dùng và do đó, có thể mất nhiều thời gian 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 một thông báo bằng tin nhắn tồn tại lâu dài sẽ duy trì hoạt động của worker dịch vụ. Việc mở một cổng sẽ không còn đặt lại đồng hồ hẹn giờ nữa.

Chrome 110

Lệnh gọi Extension API 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 duy trì hoạt động của một service worker. 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 quá trình đặt lại.

Chrome 109

Các thông báo được gửi từ mộ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ột máy chủ nhắn tin gốc bằng chrome.runtime.connectNative() sẽ duy trì hoạt động của một worker dịch vụ. Nếu quy trình máy chủ gặp sự cố hoặc bị tắt, thì cổng sẽ đóng và worker dịch vụ sẽ kết thúc 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.