การทดลองใช้ต้นทางของ Shared Worker ที่มีอายุการใช้งานยาวนานขึ้น

เผยแพร่: 31 ก.ค. 2025

ตั้งแต่ Chrome 139 เป็นต้นไป ให้เข้าร่วมการทดสอบต้นทางใหม่สำหรับ Shared Worker ที่มีอายุการใช้งานยาวนานขึ้น ช่วงทดลองใช้จะเพิ่มextendedLifetime: trueตัวเลือกใหม่เพื่อให้ผู้ปฏิบัติงานที่แชร์ทำงานได้ต่อไปหลังจากเลิกโหลดเอกสารสุดท้าย

กรณีการใช้งานฟีเจอร์อายุการใช้งานที่ขยายเวลา

เว็บไซต์จำนวนมากต้องการทำงานบางอย่างเมื่อผู้ใช้ออกจากหน้าเว็บ เช่น การเขียนไปยังพื้นที่เก็บข้อมูล หรือการส่งข้อมูลกลับไปยังเซิร์ฟเวอร์เพื่อบันทึกสถานะหรือบันทึกข้อมูลวิเคราะห์

แพลตฟอร์มเว็บมี API บางอย่างเพื่อจัดการกับ Use Case ที่ง่ายกว่า แต่แต่ละ API ก็มีข้อจำกัด

  • JavaScript API แบบซิงโครนัส เช่น การเขียน localStorage จะทำงานจนเสร็จก่อนที่จะยกเลิกการโหลดหน้าปัจจุบัน
  • fetch API มีตัวเลือกหลายอย่าง เช่น keepalive และล่าสุดคือ fetchLater ซึ่งช่วยให้ส่งคำขอได้นานกว่าการยกเลิกการโหลดเอกสารในช่วงเวลาสั้นๆ

อย่างไรก็ตาม การดำเนินการเหล่านี้ครอบคลุมเฉพาะงานแบบซิงโครนัส ยกเว้นคำขอ fetch สุดท้าย โดยไม่อนุญาตให้ใช้ API แบบอะซิงโครนัส เช่น IndexedDB, Compression Streams หรือ Web Crypto เพื่อแฮชหรือเข้ารหัส API จำนวนมาก โดยเฉพาะ API ใหม่ๆ จะทำงานแบบไม่พร้อมกันเพื่อหลีกเลี่ยงการบล็อกเทรดหลัก ดังนั้นการไม่สามารถใช้ API เหล่านี้ในการเลิกโหลดจึงเป็นการจำกัด

อีกทางเลือกหนึ่งคือการใช้ Service Worker ซึ่งอยู่นอกวงจรหน้าเว็บแต่ละหน้า อย่างไรก็ตาม โซลูชันนี้ค่อนข้างหนักหน่วง มีวงจรและข้อกำหนดในการจัดการที่ซับซ้อนมากขึ้นสำหรับนักพัฒนาแอป และยังต้องมีกระบวนการและหน่วยความจำเพิ่มเติมสำหรับผู้ใช้ด้วย และยังไม่ตรงกับกรณีการใช้งานหลักของ Service Worker (ทำหน้าที่เป็นพร็อกซีสำหรับคำขอเครือข่าย) การใช้ Service Worker แบบเต็มเฉพาะสำหรับ Use Case ในการทำงานบางอย่างเมื่อหน้าเว็บเลิกโหลดดูเหมือนจะมากเกินไป

วิธีแก้ปัญหาที่เสนอ

SharedWorker API เป็น API ที่มีน้ำหนักเบากว่าซึ่งใช้เพื่อส่งต่อการทำงานจากเทรดหลัก อย่างไรก็ตาม ปัจจุบันคุกกี้เหล่านี้จะอยู่ได้ไม่นานกว่าอายุการใช้งานของต้นทาง (เมื่อระบบยกเลิกการโหลดหน้าสุดท้ายของต้นทางนั้น) Chrome เสนอให้เพิ่มตัวเลือกใหม่ลงใน SharedWorker API เพื่อให้ SharedWorker อยู่ได้นานกว่าการทำลายเอกสารในช่วงเวลาสั้นๆ

มาตรฐาน HTML สนับสนุนให้การติดตั้งใช้งานรักษางานที่ใช้ร่วมกันให้ทำงานต่อไปสักครู่หลังจากยกเลิกการโหลดเอกสาร เพื่อให้การไปยังหน้าร่วมต้นทางไม่เป็นการปิดและสร้างงานที่ใช้ร่วมกันขึ้นมาใหม่ ข้อเสนออายุการใช้งานที่ขยายออกไปจะขยายระยะเวลานี้โดยการแนะนำว่าแม้ผู้ใช้จะไม่ได้ไปยังปลายทางที่มีต้นทางเดียวกัน แต่ User Agent ก็ควรให้ Shared Worker ทำงานต่อไปเป็นระยะเวลาหนึ่ง เพื่อให้งานแบบอะซิงโครนัสเสร็จสมบูรณ์

ข้อเสนอคือการอนุญาตให้ Shared Worker ทำงานต่อไปหลังจากยกเลิกการโหลดเอกสารสุดท้ายเป็นระยะเวลาเท่ากับที่อนุญาตให้ Service Worker อยู่ในสถานะว่าง ซึ่งก็คือ 30 วินาทีสำหรับ Chrome โปรดทราบว่าสำหรับ Shared Worker นี่คืออายุการใช้งานสูงสุดหลังจากเลิกโหลด ไม่ใช่เวลาที่ไม่มีการใช้งาน กล่าวคือ ขีดจำกัด 30 วินาทีจะเริ่มนับจากการเลิกโหลด ไม่ใช่จากเวลาที่ไม่มีการใช้งาน ระบบจะยกเลิกงานที่เริ่มแล้วแต่ยังไม่เสร็จสมบูรณ์ภายในระยะเวลาดังกล่าว

เปิดใช้ช่วงอายุการใช้งานที่ขยายออก

คุณเปิดใช้ฟีเจอร์นี้ในเว็บไซต์สำหรับผู้ใช้ได้โดยลงทะเบียนOrigin Trial สำหรับ Shared Worker ที่มีอายุการใช้งานยาวนานขึ้น หรือนักพัฒนาแอปจะเปิดใช้สำหรับเบราว์เซอร์ของตนเองโดยใช้ฟีเจอร์chrome://flags/#enable-experimental-web-platform-featuresก็ได้

โค้ดตัวอย่าง

หลังจากเลือกใช้ช่วงทดลองใช้หรือฟีเจอร์ Flag แล้ว ให้เปิดใช้ช่วงอายุการใช้งานที่ขยายออกไปโดยทำดังนี้

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

เนื่องจาก Shared Worker รองรับ Blob ด้วย คุณจึงเปิดใช้ฟีเจอร์นี้ได้โดยไม่ต้องใช้สคริปต์แยกต่างหาก เช่น หากต้องการเขียนข้อมูลไปยัง 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 });
});

นอกจากนี้ เรายังมีตัวอย่างแอปพลิเคชันที่ https://sharedworker-extendedlifetime.netlify.app/ เมื่อโหลดหน้าเว็บซ้ำ (หรือปิดแล้วเปิดใหม่ภายใน 30 วินาที) การคำนวณก่อนหน้าจะยังคงใช้ได้

คุณดูผู้ปฏิบัติงานที่แชร์สำหรับเว็บไซต์ได้ที่ chrome://inspect/#workers และเราจะปรับปรุงในเร็วๆ นี้เพื่อแสดงว่ามีการใช้ตัวเลือก extendedLifetime หรือไม่ Shared Worker ที่มีอายุการใช้งานนานขึ้นจะยังคงแสดงในหน้านี้เป็นเวลา 30 วินาทีหลังจากเลิกโหลดหน้าเว็บ

แชร์ความคิดเห็น

เราหวังว่าจะได้รับความคิดเห็นจากคุณเกี่ยวกับช่วงทดลองใช้ Shared Worker Origin ที่ขยายเวลา

เรากำลังพูดคุยเกี่ยวกับรูปแบบ API ใน GitHub และมีคำอธิบายทางเทคนิคโดยละเอียดเพิ่มเติม

หากต้องการแสดงความคิดเห็นเกี่ยวกับการใช้งานของ Chrome ให้รายงานข้อบกพร่องของ Chromium