การ Register Service Worker
การ register service worker
หัวข้อที่มีชื่อว่า “การ register service worker”ก่อนที่ service worker จะดักจับ request ใด ๆ ได้ หน้าเว็บต้อง register service worker เสียก่อน การ register เป็นการบอก browser ว่าจะหาไฟล์ service worker ได้ที่ไหน และควรควบคุม URL ใดบ้าง
การเรียก register
หัวข้อที่มีชื่อว่า “การเรียก register”if ('serviceWorker' in navigator) { navigator.serviceWorker .register('/sw.js') .then((registration) => { console.log('SW registered, scope:', registration.scope); }) .catch((error) => { console.error('SW registration failed:', error); });}navigator.serviceWorker.register() คืนค่าเป็น Promise ที่ resolve ออกมาเป็น object ServiceWorkerRegistration property ที่สำคัญที่สุดบน object นั้นคือ scope
Feature detection
หัวข้อที่มีชื่อว่า “Feature detection”ควรครอบการเรียกด้วย 'serviceWorker' in navigator เสมอ browser ที่ไม่รองรับ service worker (browser รุ่นเก่ามาก ๆ บางตัว หรือหน้าเว็บที่เสิร์ฟผ่าน HTTP ธรรมดา) จะข้ามบล็อกนี้ไปเฉย ๆ อย่าปล่อยให้ API ที่หายไปทำให้หน้าเว็บของคุณพัง
scope เป็นตัวกำหนดว่า service worker ควบคุมหน้าและ sub-path ใดบ้าง โดยค่าเริ่มต้นคือไดเรกทอรีที่บรรจุไฟล์ service worker อยู่:
| ตำแหน่งไฟล์ SW | scope เริ่มต้น | หน้าที่ถูกควบคุม |
|---|---|---|
/sw.js | / | ทั้ง origin |
/app/sw.js | /app/ | เฉพาะ /app/ และที่อยู่ภายใต้นั้น |
/shop/sw.js | /shop/ | เฉพาะ /shop/ และที่อยู่ภายใต้นั้น |
คุณสามารถจำกัด scope ให้แคบลงได้ (แต่ไม่สามารถขยายให้กว้างเกินไดเรกทอรีของไฟล์ SW ได้) โดยส่ง option scope เข้าไป:
navigator.serviceWorker.register('/sw.js', { scope: '/shop/' });Secure context (HTTPS / localhost)
หัวข้อที่มีชื่อว่า “Secure context (HTTPS / localhost)”service worker จะทำงานได้บน secure origin เท่านั้น:
https://— หน้า HTTPS ใด ๆ ใน productionhttp://localhostและhttp://127.0.0.1— ได้รับการยกเว้นอย่างชัดเจนสำหรับการพัฒนาในเครื่อง
การพยายาม register บน http:// ธรรมดา (ที่ไม่ใช่ localhost) จะล้มเหลวแบบเงียบ ๆ หรือโยน SecurityError ออกมา ควร deploy PWA ของคุณผ่าน HTTPS เสมอ
ลองเล่นแบบสด ๆ
หัวข้อที่มีชื่อว่า “ลองเล่นแบบสด ๆ”เดโมด้านล่างจะ register service worker แบบ minimal เปิดโปรเจกต์ StackBlitz แล้วดูที่ console ของ browser — คุณจะเห็น log ของการ register และ scope ของ SW
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Register service worker ตั้งแต่ตอน page load | cache และ offline support พร้อมใช้งานเร็วที่สุด | เพิ่มงานให้ main thread ตอน load ครั้งแรกที่เป็นช่วงที่ user รอ critical content |
| Register หลัง load event (deferred) | ไม่แย่ง resource กับ critical rendering path ตอนโหลดหน้าแรก | ผู้ใช้ที่ปิดหน้าเร็วเกินไปอาจไม่ทัน register เลยสักครั้ง |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- Register service worker path ที่ผิด scope ทำให้ควบคุมได้แค่บาง path แทนที่จะเป็นทั้งเว็บไซต์
- ไม่ check
if ('serviceWorker' in navigator)ก่อน register ทำให้ browser เก่าที่ไม่รองรับโยน error กลางหน้า - Register ซ้ำหลายครั้งโดยไม่ระวัง ทำให้เกิด service worker หลายเวอร์ชันแย่งกัน handle fetch event
💡 ตัวอย่างจากของจริง
web.dev checklist — แนะนำให้ register service worker หลัง
loadevent เสมอ เพื่อไม่ให้แย่ง bandwidth กับ critical resource ตอนโหลดหน้าแรกTwitter Lite — register service worker แบบ deferred ทำให้ time-to-interactive ของหน้าแรกไม่ถูกกระทบจากการติดตั้ง worker