กล่องงานมีความยืดหยุ่นพอที่จะรองรับกระบวนการสร้างของโปรเจ็กต์ได้เกือบทั้งหมด ซึ่งหมายความว่าคุณสามารถใช้ Workbox ได้มากกว่า 1 วิธี ซึ่งจะช่วยให้คุณสามารถเลือกการผสานรวมที่เหมาะสมสำหรับโปรเจ็กต์ของคุณ ไม่ว่าคุณจะผสานรวมกับ Workbox ด้วยวิธีใดก็ตาม เครื่องมือต่างๆ ก็จะมี API ที่คล้ายกัน
generateSW พบกับ injectManifest
คุณจะใช้ 1 ใน 2 วิธีหลักของเครื่องมือสร้าง Workbox ได้แก่ generateSW หรือ injectManifest ตัวเลือกที่คุณควรใช้จะขึ้นอยู่กับว่าคุณต้องการความยืดหยุ่นมากน้อยเพียงใด generateSW ให้ความสำคัญกับความง่ายในการใช้งานและความเรียบง่ายที่มีความยืดหยุ่น ซึ่งให้คุณประกาศชุดตัวเลือกการกำหนดค่าและมอบ Service Worker ที่ใช้งานได้เต็มรูปแบบให้คุณเป็นการตอบแทน
injectManifest มีความยืดหยุ่นมากกว่าและมีความเรียบง่ายบางประการ เนื่องจากคุณจะต้องเขียนโค้ดให้ผู้ปฏิบัติงานบริการด้วยตนเองโดยที่ injectManifest จะมีไฟล์ Manifest แบบแคชล่วงหน้าที่วิธีการแคชล่วงหน้าของ Workbox จะใช้ได้
กรณีที่ควรใช้generateSW
คุณควรใช้ generateSW ในกรณีต่อไปนี้
- คุณต้องการแคชไฟล์ที่เกี่ยวข้องกับกระบวนการบิลด์ล่วงหน้า รวมถึงไฟล์ที่ URL มีแฮชที่คุณอาจไม่รู้ล่วงหน้า
- คุณต้องมีการแคชรันไทม์แบบง่ายๆ ซึ่งกำหนดค่าได้ผ่านตัวเลือกของ
generateSW
เมื่อใดที่ไม่ควรใช้ generateSW
ในทางกลับกัน คุณไม่ควรใช้ generateSW ในกรณีต่อไปนี้
- คุณต้องการใช้ฟีเจอร์อื่นๆ ของ Service Worker (เช่น ข้อความ Push จากเว็บ)
- คุณต้องมีความยืดหยุ่นมากขึ้นในการนำเข้าสคริปต์เพิ่มเติมหรือใช้โมดูล Workbox เฉพาะเพื่อปรับแต่งโปรแกรมทำงานของบริการให้ตรงกับความต้องการของแอปพลิเคชัน
กรณีที่ควรใช้injectManifest
คุณควรใช้ injectManifest ในกรณีต่อไปนี้
- คุณต้องการแคชล่วงหน้า แต่ก็ต้องการเขียน Service Worker ของคุณเอง
- คุณมีความจำเป็นในการแคชหรือการกำหนดเส้นทางที่ซับซ้อนซึ่งไม่สามารถแสดงผ่านตัวเลือกการกำหนดค่าของ
generateSWได้ - คุณต้องการใช้ API อื่นๆ ในโปรแกรมทำงานของบริการ (เช่น Web Push)
injectManifest แตกต่างจาก generateSW ตรงที่ระบบกำหนดให้คุณต้องระบุไฟล์ของ Service Worker ต้นทาง ในเวิร์กโฟลว์นี้ ไฟล์ของ Service Worker ต้นทางต้องมีสตริง self.__WB_MANIFEST พิเศษเพื่อให้ injectManifest แทนที่ด้วยไฟล์ Manifest ของแคชล่วงหน้าได้
เมื่อใดที่ไม่ควรใช้ injectManifest
คุณไม่ควรใช้ injectManifest ในกรณีต่อไปนี้
- คุณไม่ต้องการใช้แคชล่วงหน้าใน Service Worker
- ข้อกำหนดของโปรแกรมทำงานของบริการนั้นไม่ซับซ้อนพอที่จะครอบคลุมสิ่งที่
generateSWและตัวเลือกการกำหนดค่ามีให้ - คุณให้ความสำคัญกับความสะดวกในการใช้งานมากกว่าความยืดหยุ่น
ใช้เครื่องมือสร้างของ Workbox
หากคุณกำลังมองหาวิธีที่ไม่จำเป็นต้องใช้งานเฟรมเวิร์กเพื่อใช้ Workbox ในกระบวนการสร้าง คุณมี 3 ตัวเลือก ดังนี้
workbox-cliworkbox-buildเครื่องมือบรรทัดคำสั่ง- การใช้ Bundler (เช่น
workbox-webpack-plugin)
เครื่องมือบิลด์แต่ละรายการเหล่านี้มีทั้งโหมด generateSW และ injectManifest พร้อมด้วยชุดตัวเลือกที่คล้ายกัน ตัวเลือกเหล่านี้เป็นตัวเลือกที่ดีเมื่อคุณไม่ต้องการเชื่อมโยง Service Worker ที่ทำงานด้วย Workbox กับเฟรมเวิร์กบางกรอบ เพื่อให้ทราบว่าตัวเลือกใดเหมาะสมที่สุด มาดูกันทีละอย่าง
workbox-cli
หากคุณกำลังมองหาอุปสรรคที่ต่ำที่สุดในการเข้าใช้ด้วย Workbox CLI เหมาะสำหรับคุณ
npm install workbox-cli --save-dev
หากต้องการเริ่มใช้ CLI ให้เรียกใช้วิซาร์ดด้วย npx workbox wizard วิซาร์ดจะถามคำถาม 2-3 ข้อและเราจะใช้คำตอบของคำถามเหล่านั้นเพื่อสร้างโปรเจ็กต์ด้วยไฟล์ workbox-config.js ที่คุณสามารถปรับแต่งให้เหมาะกับความต้องการของคุณ ซึ่งจะมีหน้าตาดังนี้
// A config for `generateSW`
export default {
globDirectory: 'dist/',
globPatterns: [
'**/*.{css,woff2,png,svg,jpg,js}'
],
swDest: 'dist/sw.js'
};
เมื่อสร้างไฟล์การกำหนดค่าแล้ว CLI จะเรียกใช้เมธอด generateSW หรือ injectManifest ให้คุณได้ ข้อความช่วยเหลือของ CLI มีข้อมูลและตัวอย่างการใช้งานเพิ่มเติม
workbox-build
workbox-cli คือ Wrapper ของโมดูล workbox-build และอีกวิธีหนึ่งคือการใช้workbox-buildโดยตรง เมื่อใช้ workbox-build แทนที่จะระบุตัวเลือกโดยใช้ไฟล์ workbox-config.js คุณจะใช้เมธอด generateSW หรือ injectManifest โดยตรงเป็นส่วนหนึ่งของสคริปต์โหนดผ่านชุดตัวเลือกที่คล้ายกัน ดังนี้
// build-sw.mjs
import {generateSW} from 'workbox-build';
generateSW({
globDirectory: 'dist/',
globPatterns: [
'**/*.{css,woff2,png,svg,jpg,js}'
],
swDest: 'dist/sw.js'
});
ในตัวอย่างด้านบน workbox-build จะเขียน Service Worker ที่สร้างขึ้นไปยังไดเรกทอรี dist เมื่อเรียกใช้คำสั่ง node build-sw.mjs
การใช้ Bundler
Bundler ต่างๆ มีปลั๊กอิน Workbox ของตนเอง แต่ Bundler เดียวที่ทีม Workbox สนับสนุนอย่างเป็นทางการคือ Webpack ผ่าน workbox-webpack-plugin workbox-webpack-plugin จะเรียกใช้เมธอด generateSW หรือ injectManifest เช่นเดียวกับ workbox-cli และ workbox-build ยกเว้นปลั๊กอินจะใช้ตัวพิมพ์ใหญ่สำหรับชื่อเมธอดเหล่านั้นเป็น GenerateSW หรือ InjectManifest หากไม่มี การใช้งานจะคล้ายกับ workbox-build ดังนี้
// webpack.config.js
import {GenerateSW} from 'workbox-webpack-plugin';
export default {
// Other webpack config options omitted for brevity...
plugins: [
new GenerateSW({
swDest: './dist/sw.js'
})
]
};
ตัวเลือกที่คุณส่งไปยัง GenerateSW หรือ InjectManifest ไม่เหมือนกับ generateSW หรือ injectManifest แต่มีการทับซ้อนที่สำคัญ โดยเฉพาะอย่างยิ่ง คุณไม่จำเป็นสามารถคุณระบุตัวเลือก globDirectory สำหรับ GenerateSW ก็ได้ เนื่องจาก Webpack รู้อยู่แล้วว่าจะรวมเนื้อหาเวอร์ชันที่ใช้งานจริงที่ใด
ใช้เฟรมเวิร์ก
ทุกอย่างที่กล่าวถึงในจุดนี้มุ่งเน้นที่การใช้ Workbox โดยไม่คำนึงถึงค่ากำหนดเฟรมเวิร์กของผู้ใช้ อย่างไรก็ตาม คุณจะใช้ Workbox ภายในเฟรมเวิร์กที่เฉพาะเจาะจงได้หากช่วยให้การพัฒนาง่ายขึ้น ตัวอย่างเช่น create-react-app จัดส่งพร้อมกล่องงานโดยค่าเริ่มต้น การผสานรวมเฟรมเวิร์กแบบต่างๆ กับ Workbox จะกล่าวถึงในภายหลังในบทความถัดไป
โปรดทราบว่าการผสานรวม Workbox เฉพาะเฟรมเวิร์กอาจจำกัดความสามารถในการกำหนดค่า Workbox ในลักษณะที่คุณต้องการ ในกรณีเช่นนี้ คุณสามารถกลับไปใช้วิธีการที่กล่าวถึงในที่นี้ได้เสมอ
จะเกิดอะไรขึ้นหากฉันไม่มีกระบวนการบิลด์
เอกสารนี้จะสันนิษฐานว่าโครงการของคุณมีกระบวนการบิลด์ แต่อันที่จริงโครงการอาจไม่มี หากสถานการณ์ของคุณตรงกับสถานการณ์ของคุณ คุณจะยังใช้ Workbox กับโมดูล workbox-sw ได้ เมื่อใช้ workbox-sw คุณจะโหลดรันไทม์ของ Workbox ได้จาก CDN หรือในเครื่อง แล้วเขียน Service Worker ของคุณเอง
บทสรุป
ความยืดหยุ่นของ Workbox ช่วยให้คุณใช้งานโปรเจ็กต์ได้เกือบทุกโปรเจ็กต์ โดยไม่คำนึงถึงค่ากำหนดของเฟรมเวิร์กหรือเครื่องมือเชน วิธีการทั้งหมดนี้จะช่วยให้คุณทำการแคชล่วงหน้าและแคชรันไทม์ได้สำเร็จโดยใช้ 2 วิธี ขณะที่ให้ความยืดหยุ่นมากขึ้นในการสร้าง Service Worker ที่มีฟีเจอร์ขั้นสูงเพิ่มเติมเมื่อจำเป็น