วงจรชีวิตของโปรแกรมทำงานของบริการส่วนขยาย

เวิร์กเกอร์บริการของเวิร์กชีตจะตอบสนองต่อทั้งเหตุการณ์เวิร์กเกอร์บริการมาตรฐานและเหตุการณ์ในเนมสเปซของเวิร์กชีต รูปแบบเหล่านี้มักถูกนำเสนอร่วมกันเนื่องจากโฆษณาประเภทหนึ่งมักจะตามหลังอีกประเภทหนึ่งระหว่างการใช้ส่วนขยาย

การติดตั้ง

การติดตั้งจะเกิดขึ้นเมื่อผู้ใช้ติดตั้งหรืออัปเดต Service Worker จาก Chrome เว็บสโตร์ หรือเมื่อผู้ใช้โหลดหรืออัปเดตส่วนขยายที่แตกไฟล์แล้วโดยใช้หน้า chrome://extensions เหตุการณ์ 3 รายการเกิดขึ้นตามลําดับด้านล่าง

ServiceWorkerRegistration.install

เหตุการณ์แรกที่เริ่มทํางานระหว่างการติดตั้งคือเหตุการณ์ install ของเวิร์กเกอร์บริการเว็บ

chrome.runtime.onInstalled

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

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

สุดท้าย ระบบจะเรียกเหตุการณ์ activate ของ Service Worker โปรดทราบว่าเหตุการณ์นี้ต่างจากโปรแกรมทำงานของบริการเว็บตรงที่เหตุการณ์จะเริ่มทำงานทันทีหลังจากติดตั้งส่วนขยาย เนื่องจากไม่มีอะไรเทียบได้กับการโหลดหน้าเว็บซ้ำในส่วนขยาย

การเริ่มต้นใช้งานส่วนขยาย

เมื่อโปรไฟล์ผู้ใช้เริ่มต้น เหตุการณ์ chrome.runtime.onStartup จะเริ่มทำงาน แต่จะไม่เรียกใช้เหตุการณ์ Service Worker

การทำงานที่ไม่ได้ใช้งานและการปิดระบบ

โดยปกติแล้ว Chrome จะสิ้นสุดการทำงานของ Service Worker เมื่อเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้

  • หลังจากไม่มีการใช้งานเป็นเวลา 30 วินาที การรับเหตุการณ์หรือการเรียก API ของส่วนขยายจะรีเซ็ตตัวจับเวลานี้
  • เมื่อคําขอเดียว เช่น เหตุการณ์หรือการเรียก API ใช้เวลาประมวลผลนานกว่า 5 นาที
  • เมื่อการตอบกลับจาก fetch() ใช้เวลานานกว่า 30 วินาที

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

หากต้องการเพิ่มประสิทธิภาพการใช้ทรัพยากรของส่วนขยาย โปรดหลีกเลี่ยงการทำให้โปรแกรมทำงานของบริการทำงานอย่างไม่มีกำหนด หากเป็นไปได้ ทดสอบส่วนขยายเพื่อให้แน่ใจว่าคุณไม่ได้ทำสิ่งนี้โดยไม่ได้ตั้งใจ

เก็บข้อมูลแทนการใช้ตัวแปรร่วม

ตัวแปรร่วมที่คุณตั้งค่าไว้จะสูญหายไปถ้าโปรแกรมทำงานของบริการปิดตัวลง บันทึกค่าลงในที่เก็บข้อมูลแทนการใช้ตัวแปรส่วนกลาง ตัวเลือกมีดังนี้ โปรดทราบว่า Web Storage API ไม่พร้อมใช้งานสำหรับ WSW

chrome.storage API
Extension API ที่ให้บริการพื้นที่เก็บข้อมูลหลายประเภท ได้แก่ พื้นที่เก็บข้อมูลในเครื่อง เซสชัน โดเมนที่จัดการ และซิงค์ API นี้จะจัดเก็บออบเจ็กต์ JSON ที่ระบุและดึงข้อมูลด้วยคีย์ที่นักพัฒนาแอปกำหนด ระบบจะไม่นำพื้นที่เก็บข้อมูลประเภทนี้ออกเมื่อผู้ใช้ล้างแคชเว็บ
IndexedDB API
API ระดับล่างสําหรับพื้นที่เก็บข้อมูลฝั่งไคลเอ็นต์ของ Structured Data ซึ่งรวมถึงไฟล์และ Blob API นี้ให้บริการพื้นฐานสําหรับการสร้างพื้นที่เก็บข้อมูลและการเรียกข้อมูลธุรกรรม แม้ว่า API นี้มักจะซับซ้อนเกินไปสำหรับกรณีการใช้งานทั่วไป แต่ยังมีโซลูชันพื้นที่เก็บข้อมูลของบุคคลที่สามต่อยอดอีกหลายโซลูชัน
CacheStorage API
กลไกพื้นที่เก็บข้อมูลถาวรสำหรับคู่ออบเจ็กต์คำขอและการตอบกลับ API นี้ออกแบบมาเพื่อเวิร์กเกอร์ของเว็บเซอร์วิสโดยเฉพาะและใช้ดึงข้อมูลจากปลายทาง การใช้ API นี้ทำได้หลายวิธี โดยขึ้นอยู่กับความสำคัญว่าผู้ใช้ควรเห็นข้อมูลล่าสุดหรือไม่และสำคัญเพียงใด ดูข้อมูลเพิ่มเติมได้ที่ตำราอาหารสำหรับใช้แบบออฟไลน์ คุณควรใช้ chrome.storage เว้นแต่คุณจะใช้พร็อกซีคำขอเครือข่ายผ่านตัวแฮนเดิลการดึงข้อมูลโดยเฉพาะ

เลือกเวอร์ชัน Chrome ขั้นต่ำ

นับตั้งแต่เปิดตัวไฟล์ Manifest เวอร์ชัน 3 เราได้ทำการปรับปรุงอายุการใช้งานของ Service Worker หลายอย่าง ซึ่งหมายความว่าหากส่วนขยาย Manifest V3 รองรับ Chrome เวอร์ชันเก่า คุณจะต้องคำนึงถึงเงื่อนไขบางอย่าง หากเงื่อนไขเหล่านี้ไม่ส่งผลต่อส่วนขยาย คุณสามารถดำเนินการต่อจากส่วนนี้ได้ หากเป็นเช่นนั้น ให้พิจารณาระบุเวอร์ชัน Chrome ขั้นต่ำในไฟล์ Manifest

Chrome 120

ตอนนี้คุณสามารถตั้งปลุกเป็นระยะเวลาขั้นต่ำ 30 วินาทีเพื่อให้ตรงกับวงจรชีวิตของ Service Worker ได้แล้ว ดูรายละเอียดเพิ่มเติมได้ที่ chrome.alarms

Chrome 118

ตอนนี้เซสชันโปรแกรมแก้ไขข้อบกพร่องที่ใช้งานอยู่ซึ่งสร้างขึ้นโดยใช้ chrome.debugger API จะเก็บ Service Worker ไว้ การดำเนินการนี้จะป้องกันไม่ให้ Service Worker หมดเวลาระหว่างการเรียกใช้ API นี้

Chrome 116

Chrome 116 มีการปรับปรุงอายุการใช้งานของ Service Worker ดังนี้

  • ตอนนี้การเชื่อมต่อ WebSocket ที่ใช้งานอยู่จะยืดอายุการทำงานของ W worker ของบริการส่วนขยาย การส่งหรือรับข้อความใน WebSocket ใน Service Worker ของส่วนขยายจะรีเซ็ตตัวจับเวลาช่วงไม่มีการใช้งานของ Service Worker

  • API ส่วนขยายเพิ่มเติมจะได้รับอนุญาตให้ทำงานเกินระยะเวลาการหมดเวลา 5 นาทีสำหรับเวิร์กเกอร์บริการส่วนขยาย API เหล่านี้จะแสดงข้อความแจ้งของผู้ใช้ ซึ่งอาจทำให้ใช้เวลาในการแก้ปัญหานานกว่า 5 นาทีพอสมควร ซึ่งได้แก่ desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall() และ permissions.request()

Chrome 114

การส่งข้อความโดยใช้การรับส่งข้อความแบบคงที่จะทำให้ Service Worker ทำงานต่อไป ก่อนหน้านี้การเปิดพอร์ตจะรีเซ็ตตัวจับเวลา แต่ส่งข้อความไม่ได้ การเปิดพอร์ตจะไม่รีเซ็ตตัวจับเวลาอีกต่อไป

Chrome 110

การเรียก Extension API จะรีเซ็ตตัวจับเวลา ก่อนหน้านี้มีเพียงตัวแฮนเดิลเหตุการณ์ที่ทำงานอยู่เท่านั้นที่จะคงสถานะของ Service Worker ไว้ เหตุการณ์ที่อยู่ในคิวแต่ยังไม่ได้เรียกใช้ตัวแฮนเดิลจะไม่ทําให้รีเซ็ต

Chrome 109

ข้อความที่ส่งจากเอกสารนอกหน้าจอจะรีเซ็ตตัวจับเวลา

Chrome 105

การเชื่อมต่อกับโฮสต์การรับส่งข้อความในเครื่องโดยใช้ chrome.runtime.connectNative() จะทำให้ Service Worker ทำงานอย่างต่อเนื่อง หากกระบวนการของโฮสต์ขัดข้องหรือปิดลง พอร์ตจะปิดและ Service Worker จะสิ้นสุดลงหลังจากตัวจับเวลาทำงานเสร็จ ป้องกันปัญหานี้โดยการเรียกใช้ chrome.runtime.connectNative() ในเครื่องจัดการเหตุการณ์ onDisconnect ของพอร์ต