ในบางสถานการณ์ คุณอาจต้องการแคชการตอบกลับสำรองในกรณีที่ผู้ใช้ออฟไลน์ การใช้ข้อมูลสำรองเป็นทางเลือกหนึ่งแทนพฤติกรรมการแคชที่กลยุทธ์อย่างเช่น ให้ความสำคัญกับเครือข่ายเป็นอันดับแรกหรือไม่มีอัปเดตในขณะที่ตรวจสอบความถูกต้องอีกครั้ง
วิดีโอสำรองเป็นคำตอบทั่วไปที่ตอบโจทย์ได้ทุกข้อ เนื่องจากเป็นตัวยึดตำแหน่งที่ดีกว่าที่เบราว์เซอร์จะมีให้โดยค่าเริ่มต้นเมื่อคำขอล้มเหลว ตัวอย่างเช่น
- ทางเลือกหนึ่งสำหรับ "รูปภาพหายไป" ตัวยึดตําแหน่ง
- HTML ทางเลือกมาตรฐาน "ไม่มีการเชื่อมต่อเครือข่ายที่ใช้ได้"
หน้าออฟไลน์เท่านั้น
ถ้าคุณแค่ใส่หน้า HTML ออฟไลน์ที่กำหนดเอง แต่ไม่ต้องใส่เพิ่ม นี่คือสูตรพื้นฐานที่คุณสามารถทำตามได้
import {offlineFallback} from 'workbox-recipes';
import {setDefaultHandler} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';
setDefaultHandler(new NetworkOnly());
offlineFallback();
โค้ดด้านบนใช้ setDefaultHandler
เพื่อใช้กลยุทธ์เฉพาะเครือข่ายเป็นค่าเริ่มต้นสำหรับเส้นทางทั้งหมด จากนั้นจะเรียกใช้สูตร offlineFallback
เพื่อแสดงทางเลือกสำรองแบบออฟไลน์ในกรณีที่เกิดข้อผิดพลาด โดยสูตรนี้จะถือว่าไฟล์ HTML สำรองแบบออฟไลน์จะตั้งชื่อเป็น offline.html
และจะแสดงจากรูทของเว็บเซิร์ฟเวอร์
วิดีโอสำรองที่ครอบคลุม
เมื่อใดก็ตามที่เครือข่ายล้มเหลวหรือไม่พบแคช กลยุทธ์การแคชที่ workbox-strategies
นำเสนอจะปฏิเสธอย่างสม่ำเสมอ ซึ่งเป็นการส่งเสริมรูปแบบการ "ดึงดูดความสนใจ" จากทั่วโลก ตัวแฮนเดิลเพื่อจัดการกับความล้มเหลวใดก็ตามในฟังก์ชันของตัวแฮนเดิลเดียว ซึ่งช่วยให้เสนอตัวเลือกสำรองสำหรับค่า request.destination
ที่ต่างกันได้
ตัวอย่างต่อไปนี้ใช้สูตร warmStrategyCache
จาก workbox-recipes
และตั้งค่าตัวแฮนเดิลการจับเพื่อแสดงรายการที่แคชไว้ล่วงหน้าในแคชรันไทม์ อย่างไรก็ตาม วิดีโอสำรองของการแคชล่วงหน้าอาจเหมาะกับแอปพลิเคชันของคุณมากกว่า
import {warmStrategyCache} from 'workbox-recipes';
import {setDefaultHandler, setCatchHandler} from 'workbox-routing';
import {CacheFirst, StaleWhileRevalidate} from 'workbox-strategies';
// Fallback assets to cache
const FALLBACK_HTML_URL = '/offline.html';
const FALLBACK_IMAGE_URL = '/images/image-not-found.jpg';
const FALLBACK_STRATEGY = new CacheFirst();
// Warm the runtime cache with a list of asset URLs
warmStrategyCache({
urls: [FALLBACK_HTML_URL, FALLBACK_IMAGE_URL],
strategy: FALLBACK_STRATEGY,
});
// Use a stale-while-revalidate strategy to handle requests by default.
setDefaultHandler(new StaleWhileRevalidate());
// This "catch" handler is triggered when any of the other routes fail to
// generate a response.
setCatchHandler(async ({request}) => {
// The warmStrategyCache recipe is used to add the fallback assets ahead of
// time to the runtime cache, and are served in the event of an error below.
// Use `event`, `request`, and `url` to figure out how to respond, or
// use request.destination to match requests for specific resource types.
switch (request.destination) {
case 'document':
return FALLBACK_STRATEGY.handle({event, request: FALLBACK_HTML_URL});
case 'image':
return FALLBACK_STRATEGY.handle({event, request: FALLBACK_IMAGE_URL});
default:
// If we don't have a fallback, return an error response.
return Response.error();
}
});
ในขั้นตอนถัดไปนี้ ระบบจะแคชการตอบกลับสำรองล่วงหน้าโดยใช้ injectManifest
กับเครื่องมือสร้างของ Workbox และทำหน้าที่เป็นวิดีโอสำรองในกรณีที่เกิดข้อผิดพลาดเมื่อใช้เมธอด matchPrecache
import {matchPrecache, precacheAndRoute} from 'workbox-precaching';
import {setDefaultHandler, setCatchHandler} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
// Optional: use the injectManifest mode of one of the Workbox
// build tools to precache a list of URLs, including fallbacks.
precacheAndRoute(self.__WB_MANIFEST);
// Use a stale-while-revalidate strategy to handle requests by default.
setDefaultHandler(new StaleWhileRevalidate());
// This "catch" handler is triggered when any of the other routes fail to
// generate a response.
setCatchHandler(async ({request}) => {
// Fallback assets are precached when the service worker is installed, and are
// served in the event of an error below. Use `event`, `request`, and `url` to
// figure out how to respond, or use request.destination to match requests for
// specific resource types.
switch (request.destination) {
case 'document':
// FALLBACK_HTML_URL must be defined as a precached URL for this to work:
return matchPrecache(FALLBACK_HTML_URL);
case 'image':
// FALLBACK_IMAGE_URL must be defined as a precached URL for this to work:
return matchPrecache(FALLBACK_IMAGE_URL);
default:
// If we don't have a fallback, return an error response.
return Response.error();
}
});
ตัวอย่างกรณีการใช้งานสำหรับการตั้งค่าสำรองที่ 2 คือหากมีการแคชหน้าเว็บไว้ล่วงหน้า แต่รูปภาพ (หรือเนื้อหาอื่นๆ) ที่หน้าเว็บขอไม่ได้มีการแคชไว้ ผู้ใช้จะยังอ่านหน้าเว็บได้จากแคชเมื่อผู้ใช้ออฟไลน์ แต่จะระบุตัวยึดตำแหน่งสำรองหรือฟังก์ชันการทำงานสำรองได้หากเกิดข้อผิดพลาดเกี่ยวกับเครือข่าย
การทำให้แคชรันไทม์อุ่นขึ้น
Workbox จะเก็บแคชแยกต่างหากสำหรับการแคชล่วงหน้าและแคชรันไทม์ และอาจมีสถานการณ์ที่คุณต้องการแคชข้อมูลบางอย่างล่วงหน้าโดยไม่ต้องอาศัยการแคชล่วงหน้า เนื่องจากการอัปเดตไฟล์ Manifest ของแคชล่วงหน้าจะทำให้คุณต้องทำให้ Service Worker ที่อัปเดตใช้งานได้
วิธีเตรียมแคชรันไทม์ล่วงหน้าด้วยเนื้อหาต่างๆ คุณสามารถทำได้โดยใช้สูตร warmStrategyCache
จาก workbox-recipes
เบื้องหลังการทำงาน กลยุทธ์นี้เรียกใช้ Cache.addAll
ในเหตุการณ์ install
ของโปรแกรมทำงานของบริการ
import {warmStrategyCache} from 'workbox-recipes';
import {CacheFirst} from 'workbox-strategies';
// This can be any strategy, CacheFirst used as an example.
const strategy = new CacheFirst();
const urls = [
'/offline.html',
];
warmStrategyCache({urls, strategy});
บทสรุป
การจัดการการตอบกลับสำรองสำหรับคำขอที่ล้มเหลวอาจต้องใช้งานสักหน่อย แต่เมื่อมีการวางแผนล่วงหน้าเล็กน้อย คุณสามารถตั้งค่าให้เว็บแอปมอบเนื้อหาและฟังก์ชันการทำงานในระดับหนึ่งเมื่อผู้ใช้ออฟไลน์ได้