Thử nghiệm nguồn của worker dùng chung có thời gian tồn tại kéo dài

Ngày xuất bản: 31 tháng 7 năm 2025

Từ Chrome 139, hãy tham gia một thử nghiệm nguồn gốc mới cho các worker dùng chung có thời gian hoạt động kéo dài. Thử nghiệm này thêm một lựa chọn extendedLifetime: true mới để cho phép các worker dùng chung hoạt động sau khi tài liệu cuối cùng được huỷ tải.

Trường hợp sử dụng tính năng kéo dài thời gian sử dụng

Nhiều trang web muốn thực hiện một số thao tác khi người dùng chuyển hướng khỏi trang. Ví dụ: ghi vào bộ nhớ hoặc gửi dữ liệu về lại máy chủ để lưu trạng thái hoặc ghi lại số liệu phân tích.

Nền tảng web cung cấp một số API để xử lý một số trường hợp sử dụng đơn giản hơn, nhưng mỗi API đều có những hạn chế:

  • Các API JavaScript đồng bộ, chẳng hạn như thao tác ghi localStorage, sẽ chạy cho đến khi hoàn tất trước khi huỷ tải trang hiện tại.
  • fetch API có một số lựa chọn như keepalive và gần đây hơn là fetchLater, cho phép gửi các yêu cầu tồn tại lâu hơn thời gian huỷ tải tài liệu trong một khoảng thời gian ngắn.

Tuy nhiên, các yêu cầu này chỉ bao gồm công việc đồng bộ, ngoại trừ yêu cầu fetch cuối cùng. Chúng không cho phép sử dụng các API không đồng bộ như IndexedDB, Compression Streams hoặc Web Crypto để băm hoặc mã hoá. Nhiều API, đặc biệt là các API mới hơn, là không đồng bộ để tránh chặn luồng chính, do đó, việc không thể sử dụng các API này khi huỷ tải là một hạn chế.

Giải pháp thay thế là sử dụng các worker dịch vụ. Các worker này nằm ngoài vòng đời của từng trang. Tuy nhiên, đây là một giải pháp khá nặng, với các yêu cầu phức tạp hơn về vòng đời và việc quản lý đối với nhà phát triển, chưa kể đến các yêu cầu bổ sung về quy trình và bộ nhớ đối với người dùng. Ngoài ra, các API này cũng không phù hợp với trường hợp sử dụng chính của service worker (đóng vai trò là một proxy cho các yêu cầu mạng). Chỉ sử dụng full service worker cho trường hợp sử dụng hoàn tất một số công việc khi trang được dỡ tải có vẻ hơi quá.

Giải pháp đề xuất

SharedWorker API là một API nhẹ hơn, dùng để giảm tải công việc khỏi luồng chính. Tuy nhiên, các đối tượng này hiện không tồn tại ngoài thời gian tồn tại của nguồn gốc (khi trang cuối cùng cho nguồn gốc đó được huỷ tải). Chrome đề xuất thêm một lựa chọn mới vào SharedWorker API để cho phép các worker dùng chung tồn tại lâu hơn việc huỷ tài liệu trong một khoảng thời gian ngắn.

Tiêu chuẩn HTML đã khuyến khích các hoạt động triển khai duy trì hoạt động của các worker dùng chung trong một khoảng thời gian ngắn sau khi huỷ tải tài liệu, để việc điều hướng giữa các trang cùng nguồn gốc không làm gián đoạn rồi tạo lại worker dùng chung. Đề xuất về thời gian tồn tại mở rộng chỉ mở rộng thời gian này bằng cách đề xuất rằng ngay cả khi người dùng không chuyển đến một đích đến cùng nguồn, tác nhân người dùng vẫn nên duy trì hoạt động của worker dùng chung trong một khoảng thời gian nhất định để có thể hoàn thành công việc không đồng bộ.

Đề xuất này là cho phép các worker dùng chung hoạt động sau khi huỷ tải tài liệu cuối cùng, trong khoảng thời gian tương đương với thời gian mà các worker trên máy chủ được phép ở trạng thái rảnh – tức là 30 giây đối với Chrome. Xin lưu ý rằng đối với các worker dùng chung, đây là thời gian tồn tại tối đa sau khi huỷ tải, chứ không phải thời gian rảnh. Tức là giới hạn 30 giây bắt đầu từ khi huỷ tải, chứ không phải từ thời gian rảnh. Những công việc đã bắt đầu và chưa hoàn thành trong khoảng thời gian đó sẽ bị huỷ.

Bật thời gian tồn tại mở rộng

Người dùng có thể bật tính năng này trên các trang web bằng cách đăng ký thử nghiệm nguồn gốc cho các worker dùng chung có thời gian hoạt động kéo dài. Ngoài ra, nhà phát triển có thể bật chế độ này cho trình duyệt của riêng họ bằng cờ chrome://flags/#enable-experimental-web-platform-features.

Mã mẫu

Sau khi chọn sử dụng thử hoặc chọn sử dụng cờ tính năng, hãy bật thời gian tồn tại mở rộng như sau:

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

Vì các worker dùng chung cũng hỗ trợ blob, nên bạn có thể bật tính năng này mà không cần tập lệnh riêng. Ví dụ: để ghi dữ liệu vào IndexedDb:

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

Chúng tôi cũng có một ứng dụng mẫu tại đây: https://sharedworker-extendedlifetime.netlify.app/. Khi trang được tải lại (hoặc đóng rồi mở lại trong vòng 30 giây), phép tính trước đó vẫn có sẵn.

Bạn có thể xem các worker dùng chung cho một trang web tại: chrome://inspect/#workers và chúng tôi sẽ sớm cải tiến để cho biết liệu lựa chọn extendedLifetime có được dùng hay không. Các worker dùng chung có thời gian hoạt động kéo dài cũng sẽ tiếp tục xuất hiện trên trang này trong 30 giây sau khi trang được huỷ tải.

Chia sẻ ý kiến phản hồi của bạn

Chúng tôi rất mong nhận được ý kiến phản hồi của bạn về bản dùng thử nguồn gốc của worker dùng chung có thời gian tồn tại kéo dài.

Hình dạng API đang được thảo luận trên GitHub và chúng tôi có một phần giải thích chi tiết hơn về kỹ thuật.

Để gửi ý kiến phản hồi về cách triển khai của Chrome, hãy báo cáo lỗi Chromium.