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

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

การติดตั้ง

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

  1. install (เหตุการณ์ Service Worker)
  2. chrome.runtime.onInstalled (เหตุการณ์ส่วนขยาย)
  3. activate (เหตุการณ์ Service Worker)

ServiceWorkerRegistration.install

เหตุการณ์แรกที่เกิดขึ้นระหว่างการติดตั้งคือเหตุการณ์ install ของ Web Service Worker

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 โปรดทราบว่าเหตุการณ์นี้จะเริ่มทำงานทันทีหลังจากติดตั้งส่วนขยาย เนื่องจากไม่มีสิ่งใดเทียบได้กับการโหลดหน้าเว็บซ้ำในส่วนขยาย ซึ่งแตกต่างจาก Service Worker ของเว็บ

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

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

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

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

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

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

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

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

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

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

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

นับตั้งแต่เปิดตัวไฟล์ Manifest V3 เราได้ทำการปรับปรุงอายุการใช้งานของ 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 ที่ใช้งานอยู่จะขยายอายุการใช้งานของ Service Worker ของส่วนขยาย การส่งหรือรับข้อความผ่าน WebSocket ใน Service Worker ของส่วนขยายจะรีเซ็ตตัวจับเวลาที่ไม่มีการใช้งานของ Service Worker

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

Chrome 114

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

Chrome 110

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

Chrome 109

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

Chrome 105

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