เวิร์กเกอร์บริการของเวิร์กชีตจะตอบสนองต่อทั้งเหตุการณ์เวิร์กเกอร์บริการมาตรฐานและเหตุการณ์ในเนมสเปซของเวิร์กชีต ข้อมูลเหล่านี้จะแสดงร่วมกันเนื่องจากมักจะมีการใช้ประเภทหนึ่งตามอีกประเภทหนึ่งในระหว่างการใช้งานส่วนขยาย
การติดตั้ง
การติดตั้งจะเกิดขึ้นเมื่อผู้ใช้ติดตั้งหรืออัปเดต 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 WorkerAPI ส่วนขยายเพิ่มเติมจะได้รับอนุญาตให้ทำงานเกินระยะเวลาการหมดเวลา 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 ของพอร์ต