इस दस्तावेज़ में, workbox-window
को अब तक ज़्यादा कवरेज नहीं मिली है. यह window
में चलने वाले मॉड्यूल का एक सेट है. इस मॉड्यूल के लक्ष्य हैं:
- डेवलपर को सेवा वर्कर के लाइफ़साइकल के अहम पलों की पहचान करने में मदद करके, सेवा वर्कर के रजिस्ट्रेशन और अपडेट को आसान बनाना. इससे, उन पलों में जवाब देना आसान हो जाता है.
- डेवलपर को आम तौर पर होने वाली गलतियां करने से रोकने के लिए, जैसे कि सर्विस वर्कर को गलत दायरे में रजिस्टर करना.
window
और सेवा वर्कर के दायरे के बीच मैसेज भेजने की प्रोसेस को आसान बनाने के लिए.
workbox-window
को इंपोर्ट और इस्तेमाल करना
workbox-window
से अक्सर Workbox
क्लास एक्सपोर्ट का इस्तेमाल किया जाता है. इसे या तो नोड में या किसी वेबपेज में सीडीएन से इंपोर्ट किया जा सकता है.
लोकल बंडल बनाना
अगर आपकी टूलचेन में webpack या Rollup जैसा बंडलर शामिल है, तो 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
मान के साथ एक मैसेज भेजती है.