คู่มือนี้มุ่งเน้นที่การเปลี่ยนแปลงที่สำคัญซึ่งเปิดตัวใน Workbox v6 พร้อมตัวอย่างการเปลี่ยนแปลงที่คุณต้องทำเมื่ออัปเกรดจาก Workbox v5
การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ
workbox-core
เมธอด skipWaiting()
ใน workbox-core
จะไม่เพิ่มตัวแฮนเดิล install
อีกต่อไปและเทียบเท่ากับการเรียกใช้ self.skipWaiting()
เท่านั้น
ตั้งแต่นี้ไป ให้ใช้ self.skipWaiting()
แทน เนื่องจากมีแนวโน้มว่า skipWaiting()
จะถูกนําออกจาก Workbox v7
workbox-precaching
- เอกสาร HTML ข้ามแหล่งที่มาสำหรับ URL ที่สอดคล้องกับการเปลี่ยนเส้นทาง HTTP จะใช้เพื่อตอบสนองคำขอการนำทางด้วย
workbox-precaching
ไม่ได้อีกต่อไป สถานการณ์นี้มักเกิดขึ้นไม่บ่อยนัก - ตอนนี้
workbox-precaching
จะไม่สนใจพารามิเตอร์การค้นหา URL ของfbclid
เมื่อค้นหาการตอบกลับที่แคชไว้ล่วงหน้าสำหรับคำขอหนึ่งๆ - ตอนนี้คอนสตรคเตอร์
PrecacheController
จะรับออบเจ็กต์ที่มีพร็อพเพอร์ตี้ที่เฉพาะเจาะจงเป็นพารามิเตอร์แทนสตริง ออบเจ็กต์นี้รองรับพร็อพเพอร์ตี้ต่อไปนี้cacheName
(มีไว้เพื่อวัตถุประสงค์เดียวกับสตริงที่ส่งไปยังคอนสตรคเตอร์ใน v5)plugins
(แทนที่เมธอดaddPlugins()
จาก v5) และfallbackToNetwork
(แทนที่ตัวเลือกที่คล้ายกันซึ่งส่งไปยังcreateHandler()
และ `createHandlerBoundToURL() ใน v5) - ตอนนี้เมธอด
install()
และactivate()
ของPrecacheController
จะใช้พารามิเตอร์เพียง 1 รายการเท่านั้น ซึ่งควรตั้งค่าเป็นInstallEvent
หรือActivateEvent
ที่เกี่ยวข้องตามลำดับ - ระบบนำเมธอด
addRoute()
ออกจากPrecacheController
แล้ว แต่จะใช้คลาสPrecacheRoute
ใหม่เพื่อสร้างเส้นทางลงทะเบียนให้คุณได้หลังจากนั้น - ระบบนำเมธอด
precacheAndRoute()
ออกจากPrecacheController
แล้ว (ยังคงมีเป็นเมธอดตัวช่วยแบบคงที่ที่ส่งออกโดยโมดูลworkbox-precaching
) รายการดังกล่าวถูกนำออกเนื่องจากมีการใช้PrecacheRoute
แทนได้ - นำเมธอด
createMatchCalback()
ออกจากPrecacheController
แล้ว คุณใช้PrecacheRoute
ใหม่แทนได้ - ระบบนำเมธอด
createHandler()
ออกจากPrecacheController
แล้ว คุณใช้พร็อพเพอร์ตี้strategy
ของออบเจ็กต์PrecacheController
เพื่อจัดการคำขอแทนได้ - การส่งออกแบบคงที่ของ
createHandler()
ออกจากโมดูลworkbox-precaching
แล้ว นักพัฒนาซอฟต์แวร์ควรสร้างอินสแตนซ์PrecacheController
และใช้พร็อพเพอร์ตี้strategy
แทน - ตอนนี้เส้นทางที่ลงทะเบียนกับ
precacheAndRoute()
กลายเป็นเส้นทาง "จริง" ที่ใช้คลาสRouter
ของworkbox-routing
ซึ่งอาจทําให้ลําดับการประเมินของเส้นทางแตกต่างออกไปหากคุณสลับการเรียกใช้registerRoute()
กับprecacheAndRoute()
workbox-routing
ตอนนี้เมธอด setDefaultHandler()
จะรับพารามิเตอร์ที่ 2 (ไม่บังคับ) ที่สอดคล้องกับเมธอด HTTP ที่ใช้ โดยค่าเริ่มต้นจะเป็น 'GET'
- หากคุณใช้
setDefaultHandler()
และคำขอทั้งหมดเป็นGET
ก็ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ - หากคุณมีคำขอที่ไม่ใช่
GET
(POST
,PUT
ฯลฯ)setDefaultHandler()
จะไม่ทําให้คําขอเหล่านั้นตรงกันอีกต่อไป
การกำหนดค่าบิลด์
ตัวเลือก mode
สำหรับโหมด getManifest
และ injectManifest
ใน workbox-build
และ workbox-cli
ไม่ได้มีไว้ให้รองรับและถูกนำออกแล้ว นโยบายนี้ไม่มีผลกับ workbox-webpack-plugin
ซึ่งรองรับ mode
ในปลั๊กอิน InjectManifest
เครื่องมือสร้างต้องใช้ Node.js v10 ขึ้นไป
workbox-webpack-plugin
, workbox-build
หรือ workbox-cli
จะไม่รองรับ Node.js เวอร์ชันก่อน v10 อีกต่อไป หากคุณใช้ Node.js เวอร์ชันเก่ากว่า v8 ให้อัปเดตรันไทม์เป็นเวอร์ชันที่รองรับ
การปรับปรุงใหม่
กลยุทธ์กล่องงาน
Workbox v6 เปิดตัววิธีใหม่สำหรับนักพัฒนาแอปบุคคลที่สามในการกำหนดกลยุทธ์ Workbox ของตนเอง ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์บุคคลที่สามสามารถขยาย Workbox ในลักษณะที่ตรงกับความต้องการของตนได้อย่างเต็มที่
คลาสฐานกลยุทธ์ใหม่
ในเวอร์ชัน 6 คลาสกลยุทธ์กล่องจดหมายทั้งหมดต้องขยายคลาสพื้นฐาน Strategy
ใหม่ กลยุทธ์ในตัวทั้งหมดได้รับการเขียนใหม่เพื่อสนับสนุนการดำเนินการนี้
คลาสพื้นฐาน Strategy
มีหน้าที่หลัก 2 อย่าง ได้แก่
- การเรียกใช้ Callback วงจรของปลั๊กอินที่พบได้ทั่วไปในเครื่องจัดการกลยุทธ์ทั้งหมด (เช่น เมื่อเริ่มต้น ตอบสนอง และสิ้นสุด)
- การสร้างอินสแตนซ์ "เครื่องจัดการ" ที่จัดการสถานะสำหรับคำขอแต่ละรายการที่กลยุทธ์จัดการอยู่ได้
คลาส "handler" ใหม่
ก่อนหน้านี้เรามีโมดูลภายในที่เรียกว่า fetchWrapper
และ cacheWrapper
ซึ่ง (ตามชื่อที่บอกไว้) จะรวม API การดึงข้อมูลและแคชต่างๆ เข้ากับฮุกในวงจรของ API กลไกนี้ช่วยให้ปลั๊กอินทำงานได้ในปัจจุบัน แต่นักพัฒนาแอปจะไม่เห็นกลไกนี้
คลาส "handler" ใหม่ StrategyHandler
จะแสดงเมธอดเหล่านี้เพื่อให้กลยุทธ์ที่กําหนดเองเรียก fetch()
หรือ cacheMatch()
และเรียกใช้ปลั๊กอินที่เพิ่มลงในอินสแตนซ์กลยุทธ์โดยอัตโนมัติ
คลาสนี้ยังช่วยให้นักพัฒนาซอฟต์แวร์เพิ่ม Callback สำหรับวงจรที่กำหนดเอง (Life Cycle Callback) ที่กำหนดเองซึ่งอาจเกี่ยวข้องกับกลยุทธ์ของตนโดยเฉพาะได้ และนักพัฒนาแอปจะ "ใช้งานได้" กับอินเทอร์เฟซปลั๊กอินที่มีอยู่
สถานะวงจรของปลั๊กอินแบบใหม่
ใน Workbox v5 ปลั๊กอินจะไม่เก็บสถานะ ซึ่งหมายความว่าหากคำขอสำหรับ /index.html
ทำให้เกิดการเรียกกลับทั้ง requestWillFetch
และ cachedResponseWillBeUsed
การเรียกกลับทั้ง 2 รายการดังกล่าวจะไม่มีวิธีสื่อสารถึงกันและกัน หรือแม้กระทั่งทราบว่ามีการทริกเกอร์โดยคำขอเดียวกัน
ใน v6 ระบบจะส่งออบเจ็กต์ state
ใหม่ไปยังการเรียกกลับของปลั๊กอินทั้งหมดด้วย ออบเจ็กต์สถานะนี้จะเป็นของออบเจ็กต์ปลั๊กอินและอินโวคาชันกลยุทธ์นี้เท่านั้น (เช่น การเรียก handle()
) ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์เขียนปลั๊กอินที่การเรียกกลับรายการหนึ่งสามารถทําบางอย่างแบบมีเงื่อนไขโดยอิงตามสิ่งที่การเรียกกลับรายการอื่นในปลั๊กอินเดียวกันทํา (เช่น คํานวณค่าต่างของเวลาระหว่างการเรียกใช้ requestWillFetch
กับ fetchDidSucceed
หรือ fetchDidFail
)
การเรียกกลับสำหรับวงจรของปลั๊กอินใหม่
เราได้เพิ่มการเรียกกลับวงจรของปลั๊กอินใหม่เพื่อให้นักพัฒนาแอปใช้ประโยชน์จากสถานะวงจรของปลั๊กอินได้อย่างเต็มที่
handlerWillStart
: เรียกใช้ก่อนที่ตรรกะตัวแฮนเดิลจะเริ่มทํางาน คุณสามารถเรียกใช้การเรียกกลับนี้เพื่อตั้งค่าสถานะตัวแฮนเดิลเริ่มต้น (เช่น บันทึกเวลาเริ่มต้น)handlerWillRespond
: เรียกใช้ก่อนเมธอดhandle()
ของกลยุทธ์จะแสดงการตอบกลับ คุณสามารถใช้สําคัญกลับนี้เพื่อแก้ไขการตอบกลับก่อนที่จะส่งกลับไปยังตัวแฮนเดิลเส้นทางหรือตรรกะที่กำหนดเองอื่นๆhandlerDidRespond
: เรียกใช้หลังจากที่เมธอดhandle()
ของกลยุทธ์แสดงผล คุณสามารถใช้สําหรับบันทึกรายละเอียดคำตอบสุดท้าย เช่น หลังจากการเปลี่ยนแปลงโดยปลั๊กอินอื่นๆhandlerDidComplete
: เรียกใช้หลังจากที่ขยายระยะเวลาการรับประกันทั้งหมดที่เพิ่มลงในเหตุการณ์จากการเรียกใช้กลยุทธ์นี้ได้รับการชำระแล้ว คุณสามารถเรียกใช้การเรียกกลับนี้เพื่อรายงานข้อมูลที่ต้องรอจนกว่าตัวแฮนเดิลจะเสร็จสิ้นเพื่อคํานวณ (เช่น สถานะการทํางานของแคช เวลาในการตอบสนองของแคช เวลาในการตอบสนองของเครือข่าย)handlerDidError
: เรียกใช้หากตัวแฮนเดิลไม่สามารถให้คำตอบที่ถูกต้องจากแหล่งที่มาใดๆ คุณสามารถใช้ Callback นี้เพื่อแสดงเนื้อหา "สำรอง" สำหรับใช้แทนข้อผิดพลาดเกี่ยวกับเครือข่าย
นักพัฒนาซอฟต์แวร์ที่ใช้กลยุทธ์ที่กําหนดเองไม่ต้องกังวลเกี่ยวกับการเรียกใช้การเรียกกลับเหล่านี้ด้วยตนเอง เนื่องจากคลาสพื้นฐาน Strategy
ใหม่จะจัดการทุกอย่างให้
ประเภท TypeScript ที่แม่นยำยิ่งขึ้นสำหรับตัวแฮนเดิล
คำจำกัดความของ TypeScript สำหรับเมธอด Callback ต่างๆ ได้รับการทำให้เป็นมาตรฐานแล้ว ซึ่งจะช่วยให้นักพัฒนาซอฟต์แวร์ที่ใช้ TypeScript และเขียนโค้ดของตนเองเพื่อติดตั้งใช้งานหรือเรียกใช้ตัวแฮนเดิลได้รับประสบการณ์การใช้งานที่ดีขึ้น
workbox-window
เมธอด messageSkipWaiting() ใหม่
เพิ่มเมธอดใหม่ messageSkipWaiting()
ลงในโมดูล workbox-window
เพื่อลดความซับซ้อนของกระบวนการบอก Service Worker ที่"รอ" ให้เปิดใช้งาน ซึ่งการอัปเดตนี้มีการปรับปรุงต่อไปนี้
- โดยเรียก
postMessage()
ด้วยเนื้อหาข้อความมาตรฐานตามจริง{type: 'SKIP_WAITING'}
ซึ่ง Service Worker ที่ Workbox สร้างขึ้นจะตรวจสอบเพื่อเรียกใช้skipWaiting()
- โดยจะเลือก Service Worker "รอ" ที่ถูกต้องเพื่อโพสต์ข้อความนี้ แม้ว่าจะไม่ใช่ Service Worker เดียวกับที่ลงทะเบียน
workbox-window
ไว้ก็ตาม
การนําเหตุการณ์ "ภายนอก" ออกเพื่อใช้พร็อพเพอร์ตี้ isExternal
ระบบนําเหตุการณ์ "ภายนอก" ทั้งหมดใน workbox-window
ออกแล้วแทนที่เหตุการณ์ "ปกติ" ที่มีการตั้งค่าพร็อพเพอร์ตี้ isExternal
เป็น true
วิธีนี้ช่วยให้นักพัฒนาแอปที่ให้ความสำคัญกับความแตกต่างดังกล่าวยังคงตรวจจับได้ ส่วนนักพัฒนาแอปที่ไม่จำเป็นต้องทราบจะไม่สนใจพร็อพเพอร์ตี้ดังกล่าวได้
สูตร "เสนอการโหลดหน้าเว็บซ้ำสำหรับผู้ใช้" ที่สะอาดขึ้น
การเปลี่ยนแปลงทั้ง 2 รายการข้างต้นช่วยให้สูตร "เสนอการโหลดหน้าเว็บซ้ำสำหรับผู้ใช้" ง่ายขึ้น ดังนี้
MULTI_LINE_CODE_PLACEHOLDER_0
workbox-routing
ระบบจะส่งพารามิเตอร์บูลีนใหม่ sameOrigin
ไปยังฟังก์ชัน matchCallback
ที่ใช้ใน workbox-routing
ค่านี้จะตั้งเป็น true
หากคำขอมีไว้สำหรับ URL ที่มีต้นทางเดียวกัน และตั้งเป็นเท็จหากไม่ใช่
ซึ่งจะช่วยลดความซับซ้อนของข้อมูลทั่วไปบางส่วนได้
MULTI_LINE_CODE_PLACEHOLDER_1
matchOptions ใน Workbox-expiration
ตอนนี้คุณตั้งค่า matchOptions
ใน workbox-expiration
ได้แล้ว ซึ่งระบบจะส่งผ่าน CacheQueryOptions
ไปยังการเรียกใช้ cache.delete()
ที่อยู่เบื้องหลัง (นักพัฒนาแอปส่วนใหญ่ไม่จําเป็นต้องทําเช่นนี้)
workbox-precaching
ใช้กลยุทธ์ Workbox
workbox-precaching
ได้รับการเขียนใหม่ให้ใช้ workbox-strategies
เป็นฐาน ซึ่งไม่ควรทำให้เกิดการเปลี่ยนแปลงที่ส่งผลเสีย และควรทําให้โมดูลทั้ง 2 รายการเข้าถึงเครือข่ายและแคชได้อย่างสอดคล้องกันมากขึ้นในระยะยาว
ตอนนี้การแคชล่วงหน้าจะประมวลผลรายการทีละรายการ ไม่ใช่แบบเป็นกลุ่ม
workbox-precaching
ได้รับการอัปเดตเพื่อให้ระบบขอและแคชรายการในไฟล์ Manifest สำหรับการแคชล่วงหน้าเพียงรายการเดียวในแต่ละครั้งแทนที่จะพยายามขอและแคชรายการทั้งหมดพร้อมกัน (ปล่อยให้เบราว์เซอร์เป็นผู้ตัดสินใจว่าจะจำกัดความเร็วอย่างไร)
การดำเนินการนี้จะช่วยลดโอกาสที่จะเกิดข้อผิดพลาด net::ERR_INSUFFICIENT_RESOURCES
รายการขณะแคชล่วงหน้า และจะลดการช่วงชิงแบนด์วิดท์ระหว่างการแคชล่วงหน้าและคำขอที่เกิดขึ้นพร้อมกันจากเว็บแอปด้วย
PrecacheFallbackPlugin ช่วยให้คุณใช้การแสดงผลสำรองแบบออฟไลน์ได้ง่ายขึ้น
ตอนนี้ workbox-precaching
มี PrecacheFallbackPlugin
แล้ว ซึ่งใช้เมธอดวงจร handlerDidError
ใหม่ซึ่งเพิ่มเข้ามาใน v6
วิธีนี้ช่วยให้คุณระบุ URL ที่แคชไว้ล่วงหน้าเป็น "สำรอง" สำหรับกลยุทธ์หนึ่งๆ ได้ง่าย เมื่อการตอบกลับไม่พร้อมใช้งาน ปลั๊กอินจะสร้างคีย์แคชที่ถูกต้องสําหรับ URL ที่แคชไว้ล่วงหน้า รวมถึงพารามิเตอร์การแก้ไขที่จําเป็น
ต่อไปนี้คือตัวอย่างการใช้เพื่อตอบกลับด้วย /offline.html
ที่แคชไว้ล่วงหน้าเมื่อกลยุทธ์ NetworkOnly
สร้างการตอบกลับสำหรับคำขอไปยังส่วนต่างๆ ไม่ได้ กล่าวคือ แสดงหน้า HTML ออฟไลน์ที่กำหนดเอง
MULTI_LINE_CODE_PLACEHOLDER_2
precacheFallback
ในการแคชรันไทม์
หากใช้ generateSW
เพื่อสร้าง Service Worker ให้คุณแทนการเขียน Service Worker ด้วยตนเอง คุณสามารถใช้ตัวเลือกการกําหนดค่า precacheFallback
ใหม่ใน runtimeCaching
เพื่อทำสิ่งเดียวกันได้ ดังนี้
{
// ... other generateSW config options...
runtimeCaching: [{
urlPattern: ({request}) => request.mode === 'navigate',
handler: 'NetworkOnly',
options: {
precacheFallback: {
// This URL needs to be included in your precache manifest.
fallbackURL: '/offline.html',
},
},
}],
}
ขอความช่วยเหลือ
เราคาดว่าการย้ายข้อมูลส่วนใหญ่จะดำเนินการได้อย่างรวดเร็ว หากคุณพบปัญหาที่ไม่ได้กล่าวถึงในคู่มือนี้ โปรดแจ้งให้เราทราบโดยการแจ้งปัญหาใน GitHub