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

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

การติดตั้ง

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

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

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

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

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

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

คงข้อมูลไว้แทนที่จะใช้ตัวแปรร่วม

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

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

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

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

Chrome 120

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

Chrome 118

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

Chrome 116

Chrome 116 เปิดตัวการปรับปรุงอายุการใช้งานของโปรแกรมทำงานของบริการต่อไปนี้

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

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

Chrome 114

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

Chrome 110

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

Chrome 109

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

Chrome 105

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