फ़ॉलबैक के जवाबों को मैनेज करना

कुछ मामलों में, हो सकता है कि उपयोगकर्ता के ऑफ़लाइन होने पर, आपको फ़ॉलबैक रिस्पॉन्स कैश मेमोरी में सेव करना पड़े. फ़ॉलबैक लागू करना, कैश मेमोरी के उन व्यवहार का एक विकल्प है जो नेटवर्क को प्राथमिकता देने वाली या दोबारा पुष्टि करने के दौरान पुरानी जानकारी देने वाली रणनीतियां उपलब्ध कराते हैं.

फ़ॉलबैक एक सामान्य और एक ही जगह पर सभी चीज़ों के लिए एक ही जवाब होता है. यह उस प्लेसहोल्डर के मुकाबले एक बेहतर प्लेसहोल्डर होता है जो ब्राउज़र, अनुरोध के पूरा न होने पर, डिफ़ॉल्ट रूप से उपलब्ध कराता है. इसके कुछ उदाहरण यहां दिए गए हैं:

  • "इमेज मौजूद नहीं है" विकल्प का विकल्प प्लेसहोल्डर.
  • "कोई नेटवर्क कनेक्शन उपलब्ध नहीं" मानक का एक HTML विकल्प करें.

सिर्फ़ ऑफ़लाइन पेज

अगर आपको बस एक कस्टम ऑफ़लाइन एचटीएमएल पेज देना है, लेकिन कुछ और नहीं करना है, तो यहां एक बेसलाइन रेसिपी दी गई है, जिसका पालन किया जा सकता है:

import {offlineFallback} from 'workbox-recipes';
import {setDefaultHandler} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';

setDefaultHandler(new NetworkOnly());

offlineFallback();

ऊपर दिया गया कोड setDefaultHandler का इस्तेमाल करके, सभी रास्तों के लिए डिफ़ॉल्ट रूप से सिर्फ़ नेटवर्क रणनीति का इस्तेमाल करता है. इसके बाद, कोई गड़बड़ी होने पर यह offlineFallback रेसिपी को ऑफ़लाइन फ़ॉलबैक दिखाता है. रेसिपी के मुताबिक, आपकी ऑफ़लाइन फ़ॉलबैक एचटीएमएल फ़ाइल का नाम offline.html होगा और इसे आपके वेब सर्वर के रूट से दिखाया जाएगा.

कॉम्प्रिहेंसिव फ़ॉलबैक

जब भी नेटवर्क खराब होता है या कैश मेमोरी में सेव नहीं होता है, तब workbox-strategies की ओर से उपलब्ध कराई गई कैश मेमोरी में सेव होने वाली रणनीतियां, लगातार अस्वीकार कर दी जाएंगी. यह ग्लोबल "कैच" सेट करने के पैटर्न को बढ़ावा देता है किसी एक हैंडलर फ़ंक्शन में किसी भी गड़बड़ी से निपट सकता है. इससे request.destination की अलग-अलग वैल्यू के लिए अलग-अलग फ़ॉलबैक ऑफ़र किए जा सकते हैं.

इस उदाहरण में, workbox-recipes की warmStrategyCache रेसिपी का इस्तेमाल किया गया है. साथ ही, रनटाइम कैश मेमोरी में समय से पहले कैश मेमोरी में सेव किए गए आइटम दिखाने के लिए, कैच हैंडलर सेट किया गया है. हालांकि, पहले से कैश मेमोरी में सेव किए जाने वाले फ़ॉलबैक, आपके ऐप्लिकेशन के लिए बेहतर हो सकते हैं:

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();
  }
});

इसके बाद, Workbox के बिल्ड टूल की मदद से injectManifest का इस्तेमाल करके, फ़ॉलबैक रिस्पॉन्स को पहले से कैश मेमोरी में सेव किया जाता है. साथ ही, 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();
  }
});

दूसरे फ़ॉलबैक सेटअप के इस्तेमाल का एक उदाहरण यह है कि किसी पेज को समय से पहले कैश मेमोरी में सेव किया गया था, लेकिन उस पेज से अनुरोध की गई इमेज (या दूसरी एसेट) नहीं थीं. उपयोगकर्ता के ऑफ़लाइन होने पर भी, पेज को कैश मेमोरी से पढ़ा जा सकता है. हालांकि, नेटवर्क की गड़बड़ी होने पर, फ़ॉलबैक प्लेसहोल्डर या कोई अन्य फ़ंक्शन उपलब्ध कराया जा सकता है.

रनटाइम कैश मेमोरी को गर्म करना

वर्कबॉक्स प्रीकैशिंग और रनटाइम कैश मेमोरी के लिए, अलग-अलग कैश मेमोरी का इस्तेमाल करता है. ऐसी स्थिति में भी हो सकता है कि आप किसी चीज़ को पहले से कैश मेमोरी में सेव करने की ज़रूरत के बिना उसे कैश मेमोरी में सेव करना चाहें. इसकी वजह यह है कि प्री-कैश मेमोरी को अपडेट करने पर, आपको अपडेट किए गए सर्विस वर्कर को डिप्लॉय करना होगा.

ऐसेट की मदद से रनटाइम कैश मेमोरी को समय से पहले प्राइम करने के लिए, workbox-recipes की warmStrategyCache रेसिपी का इस्तेमाल करें. हुड के तहत, यह रणनीति सर्विस वर्कर के install इवेंट में Cache.addAll को कॉल करती है.

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});

नतीजा

पूरे न हो पाने वाले अनुरोधों के लिए, फ़ॉलबैक रिस्पॉन्स को मैनेज करने में थोड़ा मेहनत लगती है. हालांकि, थोड़ी बेहतर प्लानिंग के साथ अपने वेब ऐप्लिकेशन को इस तरह सेट अप किया जा सकता है कि उपयोगकर्ता के ऑफ़लाइन होने पर भी उसे कुछ लेवल का कॉन्टेंट और फ़ंक्शन उपलब्ध कराया जा सके.