เผยแพร่: 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