← Back to HTML Course | Chapter 8: Modern HTML & Components | Lesson 10 of 10

HTML PWA Basics

सोचिए आपने ऐप स्टोर से एक ऐप खरीदा। यह आपके फोन पर इंस्टॉल होता है, आपकी होम स्क्रीन पर एक खूबसूरत लोगो रखता है, तुरंत लोड होता है, और पूरी तरह ऑफलाइन होने पर भी सही से काम करता है। अब सोचिए आप अपनी स्टैंडर्ड वेबसाइट को वैसा ही ऐप बना रहे हैं। PWA (Progressive Web App) बिल्कुल यही करता है। अपनी HTML साइट में कुछ ज़रूरी कॉन्फ़िगरेशन फाइलें और स्क्रिप्ट्स जोड़कर, आप यूज़र्स को अपनी वेबसाइट को उनके फोन पर इंस्टॉल करने, इसे ऑफलाइन चलाने, और इसे किसी नेटिव ऐप की तरह तुरंत लोड करने की सुविधा देते हैं।
Syntax
markup
<link rel="manifest" href="manifest.json">
<script>
  navigator.serviceWorker.register("sw.js");
</script>

Progressive Web App क्या है?

एक Progressive Web App (PWA) एक स्टैंडर्ड वेबसाइट है जो ऑफलाइन सपोर्ट, होम स्क्रीन इंस्टॉलेशन, और बैकग्राउंड अपडेट्स समेत ऐप जैसा यूज़र अनुभव देने के लिए मॉडर्न वेब APIs का उपयोग करती है।

Note: PWAs को चलने और अपनी सर्विस स्क्रिप्ट्स लोड करने के लिए सुरक्षित HTTPS कनेक्शन चाहिए होते हैं।
Warning: अगर आपकी साइट HTTPS का इस्तेमाल नहीं करती, तो मोबाइल डिवाइसेस PWA फीचर्स को ब्लॉक कर देंगे और इंस्टॉलेशन को रोक देंगे।

उदाहरण: What is a Progressive Web App?

markup
<link rel="manifest" href="manifest.json">

Web App Manifest (manifest.json)

Web App Manifest एक साधारण JSON कॉन्फ़िगरेशन फाइल है जो आपकी ऐप सेटिंग्स परिभाषित करती है, जैसे आपका ऐप नाम, कस्टम splash screen रंग, डिस्प्ले लेआउट्स, और होम स्क्रीन आइकन पाथ्स।

Note: अपनी ऐप खुलने पर ब्राउज़र एड्रेस बार छुपाने के लिए अपनी manifest फाइल में display एट्रिब्यूट को standalone सेट करें।
Warning: सुनिश्चित करें कि आपकी manifest फाइल में कोई syntax एरर न हो, क्योंकि एक भी टाइपो आपके ऐप को इंस्टॉल होने से रोक देगा।

उदाहरण: The Web App Manifest (manifest.json)

markup
<link rel="manifest" href="manifest.json">
<!-- manifest.json: { "name": "My App", "display": "standalone" } -->

ऑफलाइन सपोर्ट के लिए Service Workers

Service Worker एक बैकग्राउंड स्क्रिप्ट है जो नेटवर्क रिक्वेस्ट्स को इंटरसेप्ट करती है, एसेट्स (जैसे styles, scripts, और लोगो) कैश करती है, और यूज़र के ऑफलाइन होने पर उन्हें तुरंत सर्व करती है, जिससे आपका ऐप बिना नेटवर्क कनेक्शन के भी काम करता रहता है।

Note: ऑफलाइन फीचर्स और कैशिंग इनेबल करने के लिए अपनी main HTML फाइल में अपनी service worker स्क्रिप्ट रजिस्टर करें।
Warning: Service Workers एक अलग बैकग्राउंड thread पर काम करते हैं और उन्हें आपके पेज के DOM या एलिमेंट्स तक सीधी पहुंच नहीं होती।

उदाहरण: Service Workers for Offline Support

markup
<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('service-worker.js');
  }
</script>

होम स्क्रीन इंस्टॉलेशन प्रॉम्प्ट्स

जब आपकी वेबसाइट सभी PWA स्टैंडर्ड्स (जिसमें HTTPS, एक वैलिड manifest, और एक एक्टिव service worker शामिल है) पूरे करती है, तो ब्राउज़र विज़िटर्स को उनकी डिवाइस पर आपकी साइट को एक ऐप के रूप में इंस्टॉल करने के लिए अपने-आप प्रॉम्प्ट करेगा।

Note: इंस्टॉलेशन प्रॉम्प्ट को ट्रिगर करना अपने यूज़र्स के लिए सुविधाजनक बनाने के लिए कस्टम इंस्टॉल बटन्स का उपयोग करें।
Warning: जब तक ब्राउज़र पहले नेटिव beforeinstallprompt इवेंट फायर नहीं करता, तब तक आप इंस्टॉलेशन prompt को मैन्युअली ट्रिगर नहीं कर सकते।

उदाहरण: Home Screen Installation Prompts

markup
<button id="installBtn">Install App</button>
<script>
  let deferredPrompt;
  window.addEventListener('beforeinstallprompt', function (e) {
    deferredPrompt = e;
  });
</script>

मोबाइल ऐप Viewports के लिए डिज़ाइनिंग

अपने PWA को एक नेटिव मोबाइल ऐप जैसा दिखाने के लिए, आपको अपने CSS स्टाइल्स को कॉम्पैक्ट मोबाइल स्क्रीन्स में फिट करने और मॉडर्न डिवाइस सेफ एरियाज़ (जैसे notch margins या होम इंडिकेटर्स) को हैंडल करने के लिए एडजस्ट करना होगा।

Note: अपने ऐप कंटेंट को डिवाइस नॉच से कटने से बचाने के लिए relative viewport units और CSS safe area padding का उपयोग करें।
Warning: safe areas हैंडल न करने पर आपकी नेविगेशन बार्स मोबाइल सिस्टम स्टेटस आइकन्स के साथ ओवरलैप हो सकती हैं।

उदाहरण: Designing for Mobile App Viewports

markup
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
</head>

Manifest Properties का संदर्भ

आइकन्स के अलावा, manifest.json फाइल कई अन्य ज़रूरी प्रॉपर्टीज़ सपोर्ट करती है: name पूरा ऐप नाम है, short_name का उपयोग तब होता है जब होम स्क्रीन पर जगह सीमित हो, start_url यह परिभाषित करता है कि लॉन्च होने पर कौन-सा पेज खुलता है, display यह नियंत्रित करता है कि यह पूरी तरह standalone ऐप जैसा दिखे या एक साधारण ब्राउज़र टैब जैसा, और theme_color डिवाइस के status bar को स्टाइल करता है।

Note: किसी इंस्टॉल किए गए PWA को असली नेटिव ऐप जैसा महसूस कराने के लिए display को "standalone" सेट करें, जिससे ब्राउज़र का एड्रेस बार पूरी तरह छुप जाए।
Warning: manifest में गायब या गलत तरीके से फॉर्मेट किया गया start_url इंस्टॉल किए गए ऐप आइकन को सही से लॉन्च होने से रोक सकता है।

उदाहरण: Manifest Properties Reference

markup
<!-- manifest.json:
{
  "name": "My App",
  "short_name": "App",
  "start_url": "/",
  "display": "standalone",
  "theme_color": "#317EFB"
}
-->

ऑफलाइन Fallback पेज बनाना

एक service worker यह पहचान सकता है कि कब कोई नेटवर्क रिक्वेस्ट इसलिए असफल हुई क्योंकि यूज़र के पास इंटरनेट नहीं है, और ब्राउज़र की डिफ़ॉल्ट एरर स्क्रीन के बजाय एक कैश्ड fallback पेज के साथ रिस्पॉन्ड कर सकता है, जिससे यूज़र्स को पता चले कि ऐप अभी भी काम कर रहा है, बस सीमित कंटेंट के साथ, जब तक वे दोबारा कनेक्ट न हों।

Note: अपने ऑफलाइन fallback पेज को service worker के install इवेंट के दौरान कैश करें, ताकि यह पहली बार नेटवर्क फेल होने पर भी उपलब्ध रहे, इसकी गारंटी हो।
Warning: ऑफलाइन पेज को खुद pre-cache करना भूल जाने का मतलब है कि अगर ऑफलाइन पेज लोड करने की कोशिश के दौरान नेटवर्क फेल हो जाए, तो यूज़र्स को ब्राउज़र की डिफॉल्ट एरर दिखेगी।

उदाहरण: Building an Offline Fallback Page

markup
<script>
  self.addEventListener('install', function (event) {
    event.waitUntil(caches.open('v1').then(cache => cache.add('/offline.html')));
  });
</script>
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.