การแคชรันไทม์ด้วย Workbox

เจฟ พอสนิก
เจฟฟ์ พอสนิก

การแคชรันไทม์หมายถึงการค่อยๆ เพิ่มการตอบกลับไปยังแคช "เมื่อใช้" แม้ว่าการแคชรันไทม์จะไม่ช่วยเรื่องความน่าเชื่อถือของคำขอปัจจุบัน แต่ก็ช่วยให้คำขอในอนาคตสำหรับ URL เดียวกันมีความเสถียรมากขึ้นได้

แคช HTTP ของเบราว์เซอร์เป็นตัวอย่างของการแคชรันไทม์ โดยจะมีการป้อนข้อมูลหลังคำขอสำหรับ URL ที่ระบุเท่านั้น แต่โปรแกรมทำงานของบริการให้คุณใช้การแคชรันไทม์ที่มีมากกว่าแค่แคช HTTP เพียงอย่างเดียว

การกำหนดกลยุทธ์

การแคชรันไทม์สามารถรวมการเข้าถึงเครือข่ายและแคชเข้าด้วยกันได้หลายวิธี ซึ่งตรงข้ามกับการแคชล่วงหน้า (ซึ่งจะพยายามแสดงชุดไฟล์ที่กำหนดไว้ล่วงหน้าจากแคช) โดยปกติชุดค่าผสมแต่ละชุด จะเรียกว่ากลยุทธ์การแคช กลยุทธ์การแคชที่สำคัญ ได้แก่

  • เน้นเครือข่ายเป็นหลัก
  • แคชเป็นหลัก
  • ไม่มีอัปเดตขณะตรวจสอบใหม่

เน้นเครือข่ายเป็นหลัก

ในวิธีนี้ โปรแกรมทำงานของบริการจะพยายามเรียกข้อมูลการตอบสนองจากเครือข่ายก่อน หากคำขอเครือข่ายสำเร็จ ก็เยี่ยมเลย การตอบกลับจะส่งกลับไปยังเว็บแอปของคุณ และสำเนาของการตอบกลับจะจัดเก็บโดยใช้ Cache Storage API ไม่ว่าจะสร้างรายการใหม่หรืออัปเดตรายการก่อนหน้าสำหรับ URL เดียวกัน

แผนภาพแสดงคำขอที่เริ่มจากหน้าเว็บไปยัง Service Worker และจาก Service Worker ไปยังเครือข่าย คำขอเครือข่ายล้มเหลวจึงส่งคำขอไปยังแคช

หากคำขอของเครือข่ายล้มเหลวทั้งหมด หรือใช้เวลานานเกินไปในการส่งคืนการตอบกลับ ระบบจะส่งการตอบกลับล่าสุดจากแคชแทน

แคชเป็นหลัก

กลยุทธ์แบบเน้นแคชเป็นหลัก ตรงข้ามกับการใช้เครือข่ายเป็นหลัก ในวิธีการนี้ เมื่อ Service Worker สกัดกั้นคำขอ โปรแกรมจะใช้ Cache Storage API ก่อนเพื่อดูว่ามีการตอบกลับที่แคชไว้หรือไม่ หากมี ระบบจะส่งการตอบสนองดังกล่าวไปยังเว็บแอป

หากระบบไม่พบแคช โปรแกรมทำงานของบริการจะไปที่เครือข่ายและพยายามเรียกคืนการตอบกลับจากที่นั่น สมมติว่าคำขอเครือข่ายสำเร็จ ระบบจะส่งกลับไปที่เว็บแอปของคุณและบันทึกสำเนาไว้ในแคช สำเนาที่แคชไว้นี้จะใช้เพื่อข้ามเครือข่ายในครั้งต่อไปที่มีการส่งคำขอสำหรับ URL เดียวกัน

แผนภาพแสดงคำขอที่เริ่มจากหน้าเว็บไปยัง Service Worker และจาก Service Worker ไปยังแคช คำขอแคชล้มเหลวจึงส่งคำขอไปยังเครือข่าย

ไม่มีอัปเดตขณะตรวจสอบใหม่

ข้อมูลที่ไม่มีอัปเดตขณะตรวจสอบใหม่เป็นวิธีการแบบผสม เมื่อใช้งาน โปรแกรมทำงานของบริการจะตรวจสอบคำตอบที่แคชไว้ทันที และหากพบคำตอบก็จะส่งกลับไปที่เว็บแอปของคุณ

ในระหว่างนี้ ไม่ว่าจะมีแคชตรงกันหรือไม่ โปรแกรมทำงานของบริการจะเริ่มส่งคำขอเครือข่ายเพื่อรับคำตอบ "ใหม่" กลับมาด้วย การตอบกลับนี้ใช้เพื่ออัปเดตการตอบกลับที่แคชไว้ก่อนหน้านี้ หากการตรวจสอบแคชในเบื้องต้นพลาดไป ระบบจะส่งสำเนาของการตอบสนองของเครือข่ายกลับไปยังเว็บแอปด้วย

แผนภาพแสดงคำขอที่เริ่มจากหน้าเว็บไปยัง Service Worker และจาก Service Worker ไปยังแคช แคชจะส่งคืนการตอบกลับทันที และยังดึงข้อมูลอัปเดตจากเครือข่ายสำหรับคำขอในอนาคตด้วย

เหตุใดจึงควรใช้ Workbox

กลยุทธ์การแคชเหล่านี้มาจากสูตรอาหารที่ปกติคุณจะต้องเขียนใหม่ในโปรแกรมทำงานของบริการของคุณเองซ้ำแล้วซ้ำอีก แทนที่จะทำเช่นนั้น Workbox ให้คุณนำ Workbox มาเป็นแพ็กเกจไว้เป็นส่วนหนึ่งของไลบรารีกลยุทธ์ ซึ่งคุณสามารถนำไปใช้ใน Service Worker ได้

นอกจากนี้ Workbox ยังรองรับการกำหนดเวอร์ชัน ซึ่งทำให้คุณหมดอายุในรายการที่แคชไว้โดยอัตโนมัติ หรือแจ้งเตือนเว็บแอปเมื่อมีการอัปเดตรายการที่แคชไว้ก่อนหน้านี้ได้

คุณควรแคชเนื้อหาใดโดยใช้กลยุทธ์ใด

มองว่าการแคชรันไทม์ช่วยเสริมการแคชล่วงหน้าได้ หากเนื้อหาทั้งหมดของคุณมีการแคชล่วงหน้าอยู่แล้ว ก็เพียงแค่นี้ก็เรียบร้อย ไม่จำเป็นต้องแคชเนื้อหาในระหว่างรันไทม์ แต่สำหรับเว็บแอปที่ค่อนข้างซับซ้อน คุณคงไม่ต้องทำการแคชทุกอย่างไว้ก่อน

ไฟล์สื่อขนาดใหญ่ เนื้อหาที่แสดงจากโฮสต์ของบุคคลที่สาม เช่น CDN หรือการตอบสนองจาก API เป็นเพียงตัวอย่างบางส่วนของประเภทเนื้อหาที่ไม่สามารถทำการแคชล่วงหน้าได้อย่างมีประสิทธิภาพ ใช้แผง "เครือข่าย" ในเครื่องมือสำหรับนักพัฒนาเว็บเพื่อระบุคำขอที่อยู่ในหมวดหมู่นี้ และสำหรับแต่ละรายการ ลองพิจารณาว่าความใหม่กับความน่าเชื่อถือแบบใดเหมาะสม

ใช้ "ไม่มีอัปเดตขณะตรวจสอบใหม่" เพื่อให้ความสำคัญกับความน่าเชื่อถือมากกว่าความใหม่

เนื่องจากกลยุทธ์ที่ไม่มีการอัปเดตขณะตรวจสอบอีกครั้งจะส่งคืนการตอบกลับที่แคชไว้เกือบจะทันที หลังจากที่ระบบป้อนแคชผ่านคำขอแรกแล้ว คุณจึงจะเห็นประสิทธิภาพที่รวดเร็วและเชื่อถือได้เมื่อใช้กลยุทธ์นี้ ซึ่งมาพร้อมกับข้อดีที่ต้องแลกกับการรับข้อมูลการตอบกลับซึ่งอาจเก่าเกินไปเมื่อเทียบกับข้อมูลที่ดึงมาจากเครือข่าย การใช้กลยุทธ์นี้ได้ผลดีที่สุดสำหรับเนื้อหาอย่างรูปภาพโปรไฟล์ผู้ใช้หรือคำตอบจาก API เริ่มต้นที่ใช้ในการสร้างมุมมอง เมื่อคุณทราบว่าการแสดงบางสิ่งทันทีคือกุญแจสำคัญ แม้ว่าจะเป็นค่าเก่าก็ตาม

ใช้เครือข่ายเป็นหลักเพื่อให้ความสำคัญกับความใหม่มากกว่าความน่าเชื่อถือ

ในบางสถานการณ์ การใช้กลยุทธ์ที่เน้นเครือข่ายเป็นหลักคือการยอมรับความพ่ายแพ้ในการต่อสู้ของคุณกับเครือข่าย ซึ่งเป็นเรื่องที่สำคัญมาก แต่ก็นำมาซึ่งความไม่แน่นอนเกี่ยวกับความน่าเชื่อถือ สำหรับเนื้อหาบางประเภท การดูคำตอบใหม่จะดีกว่า เมื่อต้องการรับข้อมูลเก่า คุณอาจต้องการความใหม่เมื่อส่งคำขอ API สำหรับข้อความของบทความที่มีการอัปเดตเป็นประจำ เช่น

การใช้กลยุทธ์ที่ให้ความสำคัญกับเครือข่ายเป็นอันดับแรกภายในโปรแกรมทำงานของบริการ (Service Worker) แทนการมุ่งโต้ตอบกับเครือข่ายโดยตรงจะช่วยให้คุณได้รับประโยชน์จากการกลับไปทำบางอย่างได้ แม้ว่าจะเป็นการตอบกลับที่อาจล้าสมัยก็ตาม คุณอาจทำงานได้ไม่เสถียร แต่อย่างน้อยคุณก็ยังเสถียรได้ขณะออฟไลน์

ใช้แคชเป็นหลักสำหรับ URL ที่มีการกำหนดเวอร์ชัน

ในกลยุทธ์ที่เน้นแคชเป็นอันดับแรก เมื่อมีการแคชรายการแล้ว ระบบจะไม่อัปเดตรายการนั้น ดังนั้น ตรวจสอบให้แน่ใจว่าคุณใช้ชิ้นงานดังกล่าวกับชิ้นงานที่คุณทราบว่าไม่น่าจะมีการเปลี่ยนแปลงเท่านั้น โดยเฉพาะอย่างยิ่ง URL ประเภทนี้จะทำงานได้ดีที่สุดกับ URL ที่มีข้อมูลการกำหนดเวอร์ชัน ซึ่งเป็น URL ประเภทเดียวกันที่ควรแสดงโดยมีส่วนหัวการตอบกลับ Cache-Control: max-age=31536000 ด้วย