वर्कबॉक्स-विंडो का इस्तेमाल करना

workbox-window एक ऐसे वर्कबॉक्स मॉड्यूल का है जिसे अब तक इस दस्तावेज़ में ज़्यादा कवरेज नहीं दिया गया है. यह ऐसे मॉड्यूल का सेट है जिसे window में चलाना है. इस मॉड्यूल के लक्ष्य हैं:

  • सर्विस वर्कर के रजिस्ट्रेशन और अपडेट को आसान बनाने के लिए, सर्विस वर्कर के लाइफ़साइकल के अहम पलों को पहचानने में डेवलपर की मदद करना, ताकि ऐसे समय में जवाब देना आसान हो जाए.
  • डेवलपर को सामान्य गलतियां करने से रोकने के लिए, जैसे कि किसी सर्विस वर्कर को गलत दायरे में रजिस्टर करना.
  • window और सर्विस वर्कर स्कोप के बीच मैसेज सेवा को आसान बनाने के लिए.

workbox-window को इंपोर्ट और इस्तेमाल करना

आप workbox-window से ज़्यादातर जिस एक्सपोर्ट का इस्तेमाल करेंगे वह Workbox क्लास है, जिसे या तो नोड में या किसी वेबपेज में सीडीएन से इंपोर्ट किया जा सकता है.

लोकल बंडल बनाया जा रहा है

अगर आपके टूलचेन में वेबपैक या रोलअप जैसा कोई बंडलर शामिल है, तो workbox-window को स्थानीय तौर पर बंडल किया जा सकता है.

पहले, अपने ऐप्लिकेशन की प्रोडक्शन डिपेंडेंसी के तौर पर workbox-window को इंस्टॉल करें:

npm install workbox-window --save

इसके बाद, अपने ऐप्लिकेशन की JavaScript में, workbox-window की मदद से Workbox क्लास को import किया जा सकता है:

<script type="module">
import {Workbox} from 'workbox-window';

if ('serviceWorker' in navigator) {
  const wb = new Workbox('/sw.js');

  wb.register();
}
</script>

workbox-window बहुत छोटा है, लेकिन आप डाइनैमिक import का इस्तेमाल करके, इसे अपनी वेबसाइट के मुख्य ऐप्लिकेशन लॉजिक से अलग कर सकते हैं. इससे आपके पेज के मुख्य बंडल का साइज़ कम हो सकता है:

<script type="module">
if ('serviceWorker' in navigator) {
  const {Workbox} = await import('workbox-window');

  const wb = new Workbox('/sw.js');
  wb.register();
}
</script>

सीडीएन का इस्तेमाल करना

हालांकि, यह तरीका इस्तेमाल करने का सुझाव नहीं दिया जाता है, लेकिन workbox-window को इस्तेमाल करने का एक आसान तरीका, इसे सीडीएन से इंपोर्ट करना है:

<script type="module">
  import {Workbox} from 'https://storage.googleapis.com/workbox-cdn/releases/6.2.0/workbox-window.prod.mjs';

  if ('serviceWorker' in navigator) {
    const wb = new Workbox('/sw.js');

    wb.register();
  }
</script>

यह ध्यान रखें कि ऊपर दिए गए उदाहरण में मौजूद <script> एलिमेंट, type="module" एट्रिब्यूट का इस्तेमाल करता है. अगर आपको ब्राउज़र में बिल्ड चरण के बिना स्टैटिक import स्टेटमेंट का इस्तेमाल करना है, तो ऐसा करना ज़रूरी है. सर्विस वर्कर के साथ काम करने वाले सभी मुख्य ब्राउज़र, JavaScript मॉड्यूल का भी इस्तेमाल करते हैं. इसलिए, इस कोड को किसी भी ब्राउज़र पर दिखाया जा सकता है, क्योंकि पुराने ब्राउज़र "module" के type एट्रिब्यूट वैल्यू वाले <script> एलिमेंट को अनदेखा कर देंगे.

सर्विस वर्कर का रजिस्ट्रेशन करना

किसी सर्विस वर्कर को workbox-window के साथ रजिस्टर करने के लिए, Workbox क्लास के register तरीके का इस्तेमाल किया जाता है, जैसे:

import {Workbox} from 'workbox-window';

const wb = new Workbox('/sw.js');
wb.register();

ऐसा लग सकता है कि यह navigator.serviceWorker.register का इस्तेमाल करके खुद ही किसी सर्विस वर्कर को रजिस्टर करने जैसा ही है. हालांकि, Workbox.register के लिए सर्विस वर्कर को रजिस्टर करने से पहले, window load इवेंट होने तक इंतज़ार करना होगा. यह उन स्थितियों में वांछित होता है जहां प्री-कैशिंग शामिल होती है, इसलिए बैंडविथ के उस विवाद से बचा जा सकता है जिससे पेज के स्टार्ट होने में देरी हो सकती है.

window और सर्विस वर्कर स्कोप के बीच बातचीत करना

सर्विस वर्कर के पास, window से अलग अपना दायरा होता है और उनके पास window में उपलब्ध एपीआई के सिर्फ़ कुछ सबसेट का ऐक्सेस होता है. हालांकि, window और सर्विस वर्कर के बीच बातचीत की जा सकती है. workbox-window, workbox-window मॉड्यूल की messageSW तरीके की मदद से दोनों स्कोप के बीच आसान कम्यूनिकेशन की अनुमति देता है.

मैसेज के लिए वर्कबॉक्स एक खास फ़ॉर्मैट का इस्तेमाल करता है. यह एक ऐसा ऑब्जेक्ट है जिसमें नीचे दी गई प्रॉपर्टी होती हैं:

  • type, मैसेज की पहचान करने के लिए ज़रूरी यूनीक स्ट्रिंग है. फ़ॉर्मैट, अंग्रेज़ी के बड़े अक्षरों में होना चाहिए. साथ ही, इसमें शब्दों को अलग-अलग करने वाले अंडरस्कोर भी होने चाहिए (उदाहरण के लिए, CACHE_URLS).
  • meta एक वैकल्पिक स्ट्रिंग है, जो मैसेज भेजने वाले Workbox पैकेज का नाम दिखाता है. आम तौर पर, इसे मिटा दिया जाता है.
  • payload एक वैकल्पिक पैरामीटर है. यह वह डेटा दिखाता है जिसे आपको भेजना है. यह किसी भी तरह का डेटा हो सकता है.

नीचे आपके सर्विस वर्कर में मौजूद कोड से शुरू करते हुए, messageSW के काम करने के तरीके का एक उदाहरण दिया गया है:

// sw.js
const SW_VERSION = '1.0.0';

self.addEventListener('message', (event) => {
  if (event.data.type === 'GET_VERSION') {
    event.ports[0].postMessage(SW_VERSION);
  }
});

और फिर आपके वेबपेज में यह कोड दिखेगा:

const wb = new Workbox('/sw.js');
wb.register();

const swVersion = await wb.messageSW({type: 'GET_VERSION'});
console.log('Service Worker version:', swVersion);

ऐसे कई मामले हैं जिनमें सर्विस वर्कर और window के बीच बातचीत करना फ़ायदेमंद हो सकता है, जैसे कि सर्विस वर्कर अपडेट उपलब्ध होने पर उपयोगकर्ता को सूचना देना. यह रेसिपी self.skipWaiting के लिए messageSkipWaiting नाम के एक खास हेल्पर तरीके पर निर्भर करती है, जो SKIP_WAITING के type वैल्यू के साथ एक मैसेज भेजता है.