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

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

การติดตั้ง

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

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

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

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

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

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

Chrome 109

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

Chrome 105

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