คู่มือนี้มุ่งเน้นที่การเปลี่ยนแปลงที่สำคัญซึ่งเปิดตัวใน Workbox v4 พร้อมตัวอย่างการเปลี่ยนแปลงที่คุณต้องทำเมื่ออัปเกรดจาก Workbox v3
การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ
workbox-precaching
อัปเดตรูปแบบการตั้งชื่อสำหรับรายการที่แคชไว้ล่วงหน้าแล้ว สำหรับรายการที่มี URL ที่ต้องระบุข้อมูลการแก้ไข (นั่นคือรายการที่มีช่อง revision
ใน ไฟล์ Manifest สำหรับการแคชล่วงหน้า) ระบบจะจัดเก็บข้อมูลเวอร์ชันนั้นเป็นส่วนหนึ่งของคีย์แคชในพารามิเตอร์การค้นหาของ URL __WB_REVISION__
แบบพิเศษต่อท้าย URL เดิม (ก่อนหน้านี้ ระบบจะจัดเก็บข้อมูลนี้แยกจากคีย์แคชโดยใช้ IndexedDB)
นักพัฒนาซอฟต์แวร์ที่ใช้การแคชล่วงหน้าผ่าน workbox.precaching.precacheAndRoute()
ซึ่งเป็น Use Case ที่พบบ่อยที่สุด ไม่จำเป็นต้องเปลี่ยนแปลงการกำหนดค่า Service Worker เมื่ออัปเกรดเป็น Workbox v4 ชิ้นงานที่แคชไว้ของผู้ใช้จะย้ายข้อมูลไปยังรูปแบบคีย์แคชใหม่โดยอัตโนมัติ และหลังจากนี้ไป ระบบจะแสดงทรัพยากรที่แคชไว้ล่วงหน้าในลักษณะเดียวกับก่อนหน้านี้
การใช้คีย์แคชโดยตรง
นักพัฒนาแอปบางรายอาจต้องเข้าถึงรายการที่แคชไว้ล่วงหน้าโดยตรง นอกบริบทของ workbox.precaching.precacheAndRoute()
เช่น คุณอาจแคชรูปภาพไว้ล่วงหน้าเพื่อใช้เป็นคำตอบ "สำรอง" เมื่อดึงข้อมูลรูปภาพจริงจากเครือข่ายไม่ได้
หากคุณใช้เนื้อหาที่แคชไว้ล่วงหน้าด้วยวิธีนี้ ตั้งแต่ Workbox v4 เป็นต้นไป คุณจะต้องดำเนินการเพิ่มเติมเพื่อแปล URL เดิมเป็นคีย์แคชที่ตรงกันซึ่งจะใช้อ่านรายการที่แคชไว้ได้ โดยโทรไปที่ workbox.precaching.getCacheKeyForURL(originURL)
ตัวอย่างเช่น หากคุณทราบว่า 'fallback.png'
มีการแคชไว้ล่วงหน้า ให้ทำดังนี้
const imageFallbackCacheKey =
workbox.precaching.getCacheKeyForURL('fallback.png');
workbox.routing.setCatchHandler(({event}) => {
switch (event.request.destination) {
case 'image':
return caches.match(imageFallbackCacheKey);
break;
// ...other fallback logic goes here...
}
});
การล้างข้อมูลเก่าที่แคชไว้ล่วงหน้า
การเปลี่ยนแปลงที่ทํากับการแคชล่วงหน้าใน Workbox v4 หมายความว่าการแคชล่วงหน้าเวอร์ชันเก่าที่สร้างโดย Workbox เวอร์ชันก่อนหน้าจะใช้ร่วมกันไม่ได้ โดยค่าเริ่มต้น ระบบจะคงทรัพยากรไว้ตามเดิม และหากคุณอัปเกรดจาก Workbox v3 เป็น Workbox v4 คุณจะมีทรัพยากรที่แคชไว้ล่วงหน้าทั้งหมด 2 สำเนา
เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถเพิ่มการเรียกใช้ไปยัง workbox.precaching.cleanupOutdatedCaches()
ให้กับ Service Worker ได้โดยตรง หรือตั้งค่าตัวเลือก cleanupOutdatedCaches: true
ใหม่หากใช้เครื่องมือบิลด์ในโหมด GenerateSW
เนื่องจากตรรกะการล้างแคชจะทำงานตามรูปแบบการตั้งชื่อแคชเพื่อค้นหาแคชที่แคชไว้ล่วงหน้าเก่าๆ และเนื่องจากนักพัฒนาแอปมีตัวเลือกในการลบล้างรูปแบบเหล่านั้น เราจึงเลือกที่จะปลอดภัยไว้ก่อนและไม่ได้เปิดใช้ฟีเจอร์นี้โดยค่าเริ่มต้น
เราขอแนะนำให้นักพัฒนาแอปที่พบปัญหาใดๆ ขณะใช้ฟีเจอร์นี้ เช่น การตรวจหารายการที่ตรงกันโดยไม่ได้ตั้งใจเกี่ยวกับการลบ แจ้งให้เราทราบ
การใช้อักษรตัวพิมพ์ใหญ่ของพารามิเตอร์
เราได้เปลี่ยนชื่อพารามิเตอร์ที่ไม่บังคับ 2 รายการที่ส่งไปยัง workbox.precaching.precacheAndRoute()
และ workbox.precaching.addRoute()
เพื่อกำหนดรูปแบบการใช้อักษรตัวพิมพ์ใหญ่โดยรวมให้เป็นมาตรฐาน ignoreUrlParametersMatching
เปลี่ยนชื่อเป็น ignoreURLParametersMatching
และ cleanUrls
เปลี่ยนชื่อเป็น cleanURLs
workbox-strategies
การสร้างอินสแตนซ์ของตัวแฮนเดิลใน workbox-strategies
มี 2 วิธีซึ่งเทียบเท่ากัน เราจะเลิกใช้งานวิธีการจากโรงงานเพื่อเรียกตัวสร้างของกลยุทธ์อย่างชัดแจ้ง
// This factory method syntax has been deprecated:
const networkFirstStrategy = workbox.strategies.networkFirst({...});
// Instead, use the constructor directly:
// (Note that the class name is Uppercase.)
const networkFirstStrategy = new workbox.strategies.NetworkFirst({...});
แม้ว่าไวยากรณ์เมธอดจากโรงงานจะยังทำงานต่อไปในเวอร์ชัน 4 แต่การใช้ไวยากรณ์ดังกล่าวจะบันทึกคำเตือน และเราขอแนะนำให้นักพัฒนาแอปย้ายข้อมูลก่อนที่จะนำการรองรับออกจากเวอร์ชัน 5 ในอนาคต
Workbox-ซิงค์พื้นหลัง
เราได้เขียนคลาส workbox.backgroundSync.Queue
ใหม่เพื่อให้นักพัฒนาแอปมีความยืดหยุ่นและควบคุมวิธีเพิ่มคําขอลงในคิวและเล่นซ้ำได้มากขึ้น
ใน v3 คลาส Queue
มีวิธีเดียวในการเพิ่มคําขอลงในคิว (เมธอด addRequest()
) แต่ไม่มีวิธีแก้ไขคิวหรือนําคําขอออก
ใน v4 ระบบได้นำเมธอด addRequests()
ออกและเพิ่มเมธอดที่คล้ายอาร์เรย์ต่อไปนี้
pushRequest()
popRequest()
shiftRequest()
unshiftRequest()
ใน v3 คลาส Queue
ยังยอมรับการเรียกกลับหลายรายการที่ให้คุณสังเกตได้เมื่อมีการเล่นคำขอซ้ำ (requestWillEnqueue
, requestWillReplay
, queueDidReplay
) แต่นักพัฒนาแอปส่วนใหญ่พบว่านอกจากการสังเกตแล้ว ยังต้องการควบคุมวิธีเล่นคิวซ้ำด้วย รวมถึงความสามารถในการแก้ไข เรียงลําดับใหม่ หรือแม้แต่ยกเลิกคําขอแต่ละรายการแบบไดนามิก
ใน v4 ระบบได้นำการเรียกกลับเหล่านี้ออกแล้วแทนที่ด้วยการเรียกกลับ onSync
รายการเดียว ซึ่งจะเรียกใช้ทุกครั้งที่เบราว์เซอร์พยายามเล่นซ้ำ โดยค่าเริ่มต้น ฟังก์ชันการเรียกคืน onSync
จะเรียกใช้ replayRequests()
แต่หากต้องการควบคุมกระบวนการเล่นซ้ำได้มากขึ้น คุณสามารถใช้เมธอดที่คล้ายกับอาร์เรย์ที่ระบุไว้ข้างต้นเพื่อเล่นคิวซ้ำได้ตามต้องการ
ตัวอย่างตรรกะการเล่นซ้ำที่กําหนดเองมีดังนี้
const queue = new workbox.backgroundSync.Queue('my-queue-name', {
onSync: async ({queue}) => {
let entry;
while ((entry = await this.shiftRequest())) {
try {
await fetch(entry.request);
} catch (error) {
console.error('Replay failed for request', entry.request, error);
await this.unshiftRequest(entry);
return;
}
}
console.log('Replay complete!');
},
});
ในทํานองเดียวกัน คลาส workbox.backgroundSync.Plugin
จะยอมรับอาร์กิวเมนต์เดียวกับคลาส Queue
(เนื่องจากสร้างอินสแตนซ์ Queue
ภายใน) จึงมีการเปลี่ยนแปลงในลักษณะเดียวกัน
workbox-expiration
เราได้เปลี่ยนชื่อแพ็กเกจ npm
เป็น workbox-expiration
เพื่อให้สอดคล้องกับรูปแบบการตั้งชื่อที่ใช้กับโมดูลอื่นๆ แพ็กเกจนี้มีฟังก์ชันการทำงานเทียบเท่ากับแพ็กเกจ workbox-cache-expiration
เวอร์ชันเก่าซึ่งเลิกใช้งานแล้ว
workbox-broadcast-update
เราได้เปลี่ยนชื่อแพ็กเกจ npm
เป็น workbox-broadcast-update
เพื่อให้สอดคล้องกับรูปแบบการตั้งชื่อที่ใช้กับโมดูลอื่นๆ แพ็กเกจนี้มีฟังก์ชันการทำงานเทียบเท่ากับแพ็กเกจ workbox-broadcast-cache-update
เวอร์ชันเก่าซึ่งเลิกใช้งานแล้ว
workbox-core
ใน Workbox v3 คุณสามารถควบคุมระดับการพิมพ์รายละเอียดของบันทึกผ่านเมธอด workbox.core.setLogLevel()
ซึ่งคุณจะต้องส่งค่าใดค่าหนึ่งใน workbox.core.LOG_LEVELS
enum นอกจากนี้ คุณยังอ่านระดับบันทึกปัจจุบันผ่าน workbox.core.logLevel
ได้ด้วย
ใน Workbox v4 เราได้นําสิ่งเหล่านี้ทั้งหมดออกแล้ว เนื่องจากตอนนี้เครื่องมือสําหรับนักพัฒนาซอฟต์แวร์สมัยใหม่ทั้งหมดมาพร้อมกับความสามารถในการกรองบันทึกอย่างละเอียด (ดูการกรองเอาต์พุตคอนโซลสําหรับเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ของ Chrome)
workbox-sw
เราได้ย้ายเมธอด 2 รายการที่ก่อนหน้านี้แสดงในเนมสเปซ workbox
โดยตรง (ซึ่งสอดคล้องกับโมดูล workbox-sw
) ไปยัง workbox.core
แทน workbox.skipWaiting()
เปลี่ยนเป็น workbox.core.skipWaiting()
และ workbox.clientsClaim()
เปลี่ยนเป็น workbox.core.clientsClaim()
การกำหนดค่าเครื่องมือสร้าง
มีการเปลี่ยนแปลงการตั้งชื่อตัวเลือกบางรายการที่ส่งผ่านไปยัง workbox-cli, workbox-build หรือ workbox-webpack-plugin ได้ เมื่อใดก็ตามที่มีการใช้ "URL" ในชื่อตัวเลือก ระบบจะเลิกใช้งาน "URL" แทน ซึ่งหมายความว่าคุณควรเลือกใช้ชื่อตัวเลือกต่อไปนี้
dontCacheBustURLsMatching
ignoreURLParametersMatching
modifyURLPrefix
templatedURLs
รูปแบบ "Url" ของชื่อตัวเลือกเหล่านั้นจะยังคงใช้งานได้ในเวอร์ชัน 4 แต่ระบบจะแสดงข้อความเตือน เราขอแนะนำให้นักพัฒนาแอปย้ายข้อมูลล่วงหน้าก่อนที่จะมีการเปิดตัวเวอร์ชัน 5
ฟังก์ชันการทำงานใหม่
workbox-window
โมดูล workbox-window
ใหม่ช่วยให้กระบวนการลงทะเบียน Service Worker และการตรวจหาการอัปเดตง่ายขึ้น รวมถึงมีวิธีการสื่อสารมาตรฐานระหว่างโค้ดที่ทำงานใน Service Worker กับโค้ดที่ทำงานในบริบท window
ของเว็บแอป
แม้ว่าการใช้ workbox-window
จะไม่ใช่สิ่งจําเป็น แต่เราหวังว่านักพัฒนาแอปจะพบว่า workbox-window
มีประโยชน์และพิจารณาย้ายข้อมูลตรรกะบางส่วนที่เขียนด้วยตนเองไปใช้ workbox-window
เมื่อเหมาะสม ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ workbox-window
ได้ในคู่มือของโมดูล
ตัวอย่างการย้ายข้อมูล
ดูตัวอย่างการย้ายข้อมูลในชีวิตจริงจาก Workbox v3 ไปยัง v4 ได้ในพุลคำขอนี้
การขอความช่วยเหลือ
เราคาดว่าการย้ายข้อมูลส่วนใหญ่จะดำเนินการได้อย่างรวดเร็ว หากพบปัญหาที่ไม่ได้กล่าวถึงในคู่มือนี้ โปรดแจ้งให้เราทราบโดยเปิดปัญหาใน GitHub