Service Worker ของส่วนขยายจะตอบสนองต่อทั้งเหตุการณ์ Service Worker มาตรฐานและเหตุการณ์ในเนมสเปซของส่วนขยาย เราจะแสดงทั้ง 2 อย่างพร้อมกันเนื่องจากมักจะมีการใช้ส่วนขยายประเภทหนึ่งตามด้วยอีกประเภทหนึ่ง
การติดตั้ง
การติดตั้งจะเกิดขึ้นเมื่อผู้ใช้ติดตั้งหรืออัปเดต Service Worker จาก Chrome เว็บสโตร์ หรือเมื่อโหลดหรืออัปเดตส่วนขยายที่ไม่ได้แพ็ก
โดยใช้หน้า chrome://extensions
เหตุการณ์ 3 อย่างจะเกิดขึ้นตามลำดับต่อไปนี้
install
onInstall
activate
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 ระดับต่ำสำหรับการจัดเก็บข้อมูลที่มีโครงสร้างฝั่งไคลเอ็นต์ ซึ่งรวมถึงไฟล์และ Blob API นี้มีองค์ประกอบพื้นฐานสำหรับการสร้างที่เก็บข้อมูลและการดึงข้อมูลธุรกรรม แม้ว่า API นี้มักจะซับซ้อนเกินไปสำหรับกรณีการใช้งานบางอย่าง แต่โซลูชันพื้นที่เก็บข้อมูลของบุคคลที่สามจำนวนมากก็สร้างขึ้นบน API นี้
- CacheStorage API
- กลไกพื้นที่เก็บข้อมูลแบบถาวรสำหรับคู่ของออบเจ็กต์คำขอและการตอบกลับ API นี้ออกแบบมาสำหรับ Service Worker ของเว็บโดยเฉพาะ และใช้เพื่อดึงข้อมูลจากปลายทาง คุณสามารถใช้ API นี้ได้หลายวิธี ขึ้นอยู่กับว่าผู้ใช้จำเป็นต้องเห็นข้อมูลล่าสุดหรือไม่และมากน้อยเพียงใด ดูข้อมูลเพิ่มเติมได้ที่The Offline Cookbook คุณควรใช้
chrome.storage
เว้นแต่คุณจะพร็อกซีคำขอของเครือข่ายโดยใช้ตัวแฮนเดิลการดึงข้อมูลโดยเฉพาะ
เลือกเวอร์ชัน Chrome ขั้นต่ำ
นับตั้งแต่เปิดตัว Manifest V3 เราได้ปรับปรุงอายุการใช้งานของ Service Worker หลายครั้ง ซึ่งหมายความว่าหากส่วนขยาย Manifest V3 รองรับ Chrome เวอร์ชันก่อนหน้า คุณจะต้องทราบเงื่อนไขบางอย่าง หากเงื่อนไขเหล่านี้ไม่มีผลกับส่วนขยาย คุณสามารถข้ามส่วนนี้ไปได้ หากเป็นเช่นนั้น ให้พิจารณาระบุเวอร์ชันขั้นต่ำของ Chrome ในไฟล์ Manifest
Chrome 120
ตอนนี้คุณตั้งเวลาปลุกให้มีระยะเวลาขั้นต่ำ 30 วินาทีเพื่อให้ตรงกับวงจรของ Service Worker ได้แล้ว ดูรายละเอียดเพิ่มเติมได้ที่ chrome.alarms
Chrome 118
เซสชันการแก้ไขข้อบกพร่องที่ใช้งานอยู่ซึ่งสร้างขึ้นโดยใช้ API chrome.debugger
จะทำให้ Service Worker ทำงานต่อไปได้ ซึ่งจะป้องกันไม่ให้ Service Worker หมดเวลาในระหว่างการเรียก API นี้
Chrome 116
Chrome 116 ได้เปิดตัวการปรับปรุงอายุการใช้งานของ Service Worker ดังต่อไปนี้
การเชื่อมต่อ
WebSocket
ที่ใช้งานอยู่จะขยายอายุการใช้งานของ Service Worker ของส่วนขยาย การส่งหรือรับข้อความผ่านWebSocket
ใน Service Worker ของส่วนขยายจะรีเซ็ตตัวจับเวลาที่ไม่ได้ใช้งานของ Service WorkerAPI ส่วนขยายเพิ่มเติมจะได้รับอนุญาตให้เกินระยะหมดเวลา 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 ของพอร์ต