Thay thế nền hoặc trang sự kiện bằng một trình chạy dịch vụ
Trình chạy dịch vụ sẽ thay thế trang sự kiện hoặc trang nền của tiện ích để đảm bảo mã nền không nằm trên luồng chính. Điều này cho phép các tiện ích chỉ chạy khi cần, giúp tiết kiệm tài nguyên.
Các trang nền là một thành phần cơ bản của tiện ích kể từ khi được giới thiệu. Nói một cách đơn giản, các trang nền cung cấp một môi trường hoạt động độc lập với mọi cửa sổ hoặc thẻ khác. Nhờ đó, các tiện ích có thể quan sát và hành động để phản hồi các sự kiện.
Trang này mô tả các tác vụ để chuyển đổi trang nền thành các worker dịch vụ của tiện ích. Để biết thêm thông tin về trình chạy dịch vụ của tiện ích nói chung, hãy xem hướng dẫn Xử lý sự kiện bằng trình chạy dịch vụ và phần Giới thiệu về trình chạy dịch vụ của tiện ích.
Sự khác biệt giữa tập lệnh nền và worker dịch vụ của tiện ích
Trong một số ngữ cảnh, bạn sẽ thấy các worker dịch vụ của tiện ích được gọi là "tập lệnh nền". Mặc dù trình chạy dịch vụ của tiện ích chạy ở chế độ nền, nhưng việc gọi chúng là tập lệnh nền có phần gây hiểu lầm khi ngụ ý các chức năng giống hệt nhau. Những điểm khác biệt này được mô tả dưới đây.
Các thay đổi từ các trang nền
Service worker có một số điểm khác biệt so với các trang nền.
- Các tiện ích này hoạt động ngoài luồng chính, tức là chúng không can thiệp vào nội dung của tiện ích.
- Chúng có các chức năng đặc biệt như chặn các sự kiện tìm nạp trên nguồn gốc của tiện ích, chẳng hạn như các sự kiện từ cửa sổ bật lên của thanh công cụ.
- Chúng có thể giao tiếp và tương tác với các bối cảnh khác thông qua giao diện Clients.
Những thay đổi bạn cần thực hiện
Bạn cần điều chỉnh một chút mã để tính đến những điểm khác biệt giữa cách hoạt động của tập lệnh nền và worker dịch vụ. Trước tiên, cách chỉ định trình chạy dịch vụ trong tệp kê khai khác với cách chỉ định tập lệnh nền. Ngoài ra:
- Vì không thể truy cập vào DOM hoặc giao diện
window, bạn sẽ cần di chuyển các lệnh gọi như vậy sang một API khác hoặc vào một tài liệu ngoài màn hình. - Bạn không nên đăng ký trình nghe sự kiện để phản hồi các lời hứa đã trả về hoặc bên trong lệnh gọi lại sự kiện.
- Vì chúng không tương thích ngược với
XMLHttpRequest(), nên bạn cần thay thế các lệnh gọi đến giao diện này bằng các lệnh gọi đếnfetch(). - Vì các hoạt động này sẽ kết thúc khi không được sử dụng, nên bạn cần duy trì trạng thái ứng dụng thay vì dựa vào các biến chung. Việc chấm dứt các worker dịch vụ cũng có thể kết thúc bộ hẹn giờ trước khi chúng hoàn tất. Bạn cần thay thế các chế độ này bằng chuông báo.
Trang này mô tả chi tiết những việc cần làm này.
Cập nhật trường "background" trong tệp kê khai
Trong Manifest V3, các trang nền được thay thế bằng một trình chạy dịch vụ. Các thay đổi về tệp kê khai được liệt kê bên dưới.
- Thay thế
"background.scripts"bằng"background.service_worker"trongmanifest.json. Xin lưu ý rằng trường"service_worker"nhận một chuỗi chứ không phải một mảng chuỗi. - Xoá
"background.persistent"khỏimanifest.json.
{ ... "background": { "scripts": [ "backgroundContextMenus.js", "backgroundOauth.js" ], "persistent": false }, ... }
{ ... "background": { "service_worker": "service_worker.js", "type": "module" } ... }
Trường "service_worker" nhận một chuỗi duy nhất. Bạn chỉ cần trường "type" nếu sử dụng mô-đun ES (sử dụng từ khoá import). Giá trị của trường này sẽ luôn là "module". Để biết thêm thông tin, hãy xem bài viết Kiến thức cơ bản về trình chạy dịch vụ của tiện ích
Di chuyển các lệnh gọi DOM và cửa sổ sang một tài liệu ngoài màn hình
Một số tiện ích cần có quyền truy cập vào các đối tượng DOM và cửa sổ mà không cần mở một cửa sổ hoặc thẻ mới. Offscreen API hỗ trợ những trường hợp sử dụng này bằng cách mở và đóng các tài liệu không hiển thị được đóng gói cùng với tiện ích mà không làm gián đoạn trải nghiệm người dùng. Ngoại trừ việc truyền thông báo, các tài liệu ngoài màn hình không dùng chung API với các ngữ cảnh tiện ích khác, nhưng hoạt động như các trang web đầy đủ để tiện ích tương tác.
Để sử dụng Offscreen API, hãy tạo một tài liệu ngoài màn hình từ trình chạy dịch vụ.
chrome.offscreen.createDocument({
url: chrome.runtime