โปรแกรมทำงานของบริการส่วนขยายจะตอบสนองต่อทั้งเหตุการณ์ 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 ของพอร์ต