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ả sự kiện của trình chạy dịch vụ chuẩn và các sự kiện trong vùng chứa tên tiện ích. Chúng được hiển thị cùng nhau vì thường một loại 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 trình chạy 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 tiện ích đã 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 install của trình chạy dịch vụ web.

chrome.runtime.onInstalled

Tiếp theo là sự kiện onInstalled của tiện ích, được 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 tiên, 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 kích hoạt của trình chạy dịch vụ được kích hoạt. Lưu ý rằng không giống như trình chạy 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ì so sánh với việc tải lại một 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 của trình chạy dịch vụ nào được gọi.

Không hoạt động và tắt

Thông thường, Chrome sẽ chấm dứt trình chạy 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 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 hơn 5 phút để xử lý.
  • Khi phản hồi fetch() mất hơn 30 giây để nhận được.

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

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

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

Mọi biến toàn cục 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 được liệt kê dưới đây. Xin lưu ý rằng Web Storage API không dùng được cho trình chạy dịch vụ tiện ích.

API chrome.storage
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 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.
API IndexedDB
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ả các tệp và blob. API này cung cấp các dữ liệu gốc để tạo bộ nhớ 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
Một cơ chế lưu trữ cố đị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 trình chạy 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à tầm quan trọng của việc đó. Để biết thêm thông tin, hãy xem Sổ tay nấu ăn ngoại tuyến. Trừ phi bạn đang ủy quyền cụ thể 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 Manifest V3, chúng tôi đã thực hiện một số điểm cải tiến đối với vòng đời của trình chạy 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ũ, 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 phần mở rộng của bạn, bạn có thể tiếp tục từ phần này. Nếu có, hãy cân nhắc việc chỉ định một phiên bản Chrome tối thiểu trong tệp kê khai.

Chrome 120

Giờ đây, bạn có thể đặt khoảng thời gian tối thiểu là 30 giây cho chuông báo để phù hợp với vòng đời của trình chạy dịch vụ. 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 giờ đây sẽ giúp trình chạy dịch vụ tiếp tục 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 khi gọi API này.

Chrome 116

Chrome 116 đã ra mắt các điểm cải tiến về vòng đời của trình chạy dịch vụ như sau:

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

  • Các API tiện ích khác đượ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 sẽ hiển thị lời nhắc cho người dùng, nên có thể mất hơn 5 phút để giải quyết một cách hợp lý. Các thuộc tính này bao gồm desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall()permissions.request().

Chrome 114

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

Chrome 110

Các lệnh gọi API Tiện ích sẽ đặt lại bộ tính giờ. Trước đây, chỉ chạy trình xử lý sự kiện mới có thể giúp một trình chạy dịch vụ tiếp tục hoạt động. Mọi sự kiện đã được đưa vào hàng đợi nhưng trình xử lý chưa được gọi sẽ không gây ra việc đặt lại.

Chrome 109

Tin nhắn đượ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 duy trì dịch vụ trên một trình chạy dịch vụ. Nếu quá trình lưu trữ gặp sự cố hoặc bị tắt, cổng sẽ đóng và trình chạy dịch vụ sẽ chấm dứt sau khi bộ tính giờ kết thúc. 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 onNgắt kết nối của cổng.