कोडलैब (कोड बनाना सीखना): कॉन्टेंट लोड होने की स्पीड बढ़ाने के लिए, अहम एसेट को पहले से लोड करना

इस कोडलैब में, कुछ रिसॉर्स को प्रीलोड और प्रीफ़ेच करके, इस वेब पेज की परफ़ॉर्मेंस को बेहतर बनाया गया है:

ऐप्लिकेशन का स्क्रीनशॉट

मापें

ऑप्टिमाइज़ेशन जोड़ने से पहले, वेबसाइट की परफ़ॉर्मेंस का आकलन करें.

  • साइट की झलक देखने के लिए, ऐप्लिकेशन देखें दबाएं. इसके बाद, फ़ुलस्क्रीन फ़ुलस्क्रीन दबाएं.

Glitch के लाइव वर्शन पर, Lighthouse परफ़ॉर्मेंस ऑडिट (Lighthouse > विकल्प > परफ़ॉर्मेंस) चलाएं. इसके बारे में ज़्यादा जानने के लिए, Lighthouse की मदद से परफ़ॉर्मेंस बेहतर बनाने के अवसर ढूंढना लेख पढ़ें.

Lighthouse, देर से फ़ेच किए गए किसी संसाधन के लिए, ऑडिट के फ़ेल होने की यह जानकारी दिखाता है:

Lighthouse: Preload key requests audit
  • DevTools खोलने के लिए, `Control+Shift+J` (या Mac पर `Command+Option+J`) दबाएं.
  • नेटवर्क टैब पर क्लिक करें.
नेटवर्क पैनल में देर से पता चला रिसॉर्स

main.css फ़ाइल को एचटीएमएल दस्तावेज़ में मौजूद लिंक एलिमेंट (<link>) से फ़ेच नहीं किया जाता है. हालांकि, एक अलग JavaScript फ़ाइल, fetch-css.js, window.onLoad इवेंट के बाद लिंक एलिमेंट को DOM से अटैच करती है. इसका मतलब है कि ब्राउज़र, JS फ़ाइल को पार्स और एक्ज़ीक्यूट करने के बाद ही फ़ाइल को फ़ेच करता है. इसी तरह, main.css में तय किया गया वेब फ़ॉन्ट (K2D.woff2) सिर्फ़ तब फ़ेच किया जाता है, जब सीएसएस फ़ाइल डाउनलोड हो जाती है.

अहम अनुरोध चेन से पता चलता है कि ब्राउज़र, किन संसाधनों को प्राथमिकता देता है और उन्हें किस क्रम में फ़ेच करता है. इस वेब पेज के लिए, फ़िलहाल यह ऐसा दिखता है:

├─┬ / (initial HTML file)
  └── fetch-css.js
    └── main.css
      └── K2D.woff2

सीएसएस फ़ाइल, अनुरोध चेन के तीसरे लेवल पर है. इसलिए, Lighthouse ने इसे देर से पता चला संसाधन के तौर पर पहचाना है.

ज़रूरी संसाधनों को प्रीलोड करना

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

इस ऐप्लिकेशन के लिए प्रीलोड टैग जोड़ें:

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
</head>

as एट्रिब्यूट का इस्तेमाल यह पता लगाने के लिए किया जाता है कि किस तरह के संसाधन को फ़ेच किया जा रहा है. साथ ही, as="style" का इस्तेमाल स्टाइलशीट फ़ाइलों को प्रीलोड करने के लिए किया जाता है.

ऐप्लिकेशन को फिर से लोड करें और DevTools में नेटवर्क पैनल देखें.

पहले से लोड किए गए संसाधन के साथ नेटवर्क पैनल

ध्यान दें कि ब्राउज़र, सीएसएस फ़ाइल को JavaScript से पहले फ़ेच करता है. JavaScript, सीएसएस फ़ाइल को फ़ेच करने के लिए ज़िम्मेदार होती है. प्रीलोड करने की सुविधा की मदद से, ब्राउज़र को यह पता होता है कि संसाधन को पहले से फ़ेच करना है. ऐसा इसलिए, क्योंकि ब्राउज़र को लगता है कि यह वेब पेज के लिए ज़रूरी है.

अगर प्रीलोडिंग का इस्तेमाल सही तरीके से नहीं किया जाता है, तो इससे परफ़ॉर्मेंस पर असर पड़ सकता है. ऐसा इसलिए होता है, क्योंकि यह उन संसाधनों के लिए गैर-ज़रूरी अनुरोध करता है जिनका इस्तेमाल नहीं किया जाता है. इस ऐप्लिकेशन में, details.css एक और सीएसएस फ़ाइल है. यह प्रोजेक्ट के रूट में मौजूद है, लेकिन इसका इस्तेमाल किसी दूसरे /details route के लिए किया जाता है. प्रीलोड का गलत तरीके से इस्तेमाल करने का उदाहरण दिखाने के लिए, इस संसाधन के लिए भी प्रीलोड हिंट जोड़ें.

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

ऐप्लिकेशन को फिर से लोड करें और नेटवर्क पैनल देखें. details.css को वापस पाने का अनुरोध किया गया है, जबकि वेब पेज इसका इस्तेमाल नहीं कर रहा है.

ज़रूरत से ज़्यादा प्रीलोडिंग वाला नेटवर्क पैनल

जब कोई प्रीलोड किया गया संसाधन, पेज के लोड होने के कुछ सेकंड के अंदर इस्तेमाल नहीं किया जाता है, तो Chrome, Console पैनल में एक चेतावनी दिखाता है.

कंसोल में प्रीलोडिंग से जुड़ी चेतावनी

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

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

as एट्रिब्यूट के लिए इस्तेमाल की जाने वाली सही वैल्यू के साथ फ़ेच किए जा सकने वाले सभी तरह के संसाधनों की सूची के लिए, MDN का प्रीलोडिंग से जुड़ा लेख पढ़ें.

आने वाले समय में इस्तेमाल होने वाले संसाधनों को पहले से फ़ेच करना

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

इस वेबसाइट में, इमेज पर क्लिक करने से आपको किसी दूसरे details/ रास्ते पर ले जाया जाता है.

रास्ते की जानकारी

एक अलग सीएसएस फ़ाइल, details.css में इस सामान्य पेज के लिए ज़रूरी सभी स्टाइल शामिल हैं. इस संसाधन को प्रीफ़ेच करने के लिए, index.html में लिंक एलिमेंट जोड़ें.

<head>
  <!-- ... -->
  <link rel="prefetch" href="details.css">
</head>

यह समझने के लिए कि इससे फ़ाइल का अनुरोध कैसे ट्रिगर होता है, DevTools में नेटवर्क पैनल खोलें और कैश मेमोरी बंद करें विकल्प से सही का निशान हटाएं.

Chrome DevTools में कैश मेमोरी बंद करना

ऐप्लिकेशन को फिर से लोड करें. देखें कि अन्य सभी फ़ाइलें फ़ेच होने के बाद, details.css के लिए बहुत कम प्राथमिकता वाला अनुरोध किया गया है.

प्रीफ़ेच किए गए संसाधन के साथ नेटवर्क पैनल

DevTools खुला होने पर, वेबसाइट पर मौजूद इमेज पर क्लिक करें. इससे आप details पेज पर पहुंच जाएंगे. details.html में लिंक एलिमेंट का इस्तेमाल करके details.css को फ़ेच किया जाता है. इसलिए, उम्मीद के मुताबिक संसाधन के लिए अनुरोध किया जाता है.

जानकारी वाले पेज के नेटवर्क अनुरोध

इसकी जानकारी देखने के लिए, DevTools में details.css नेटवर्क अनुरोध पर क्लिक करें. आपको दिखेगा कि फ़ाइल को ब्राउज़र की डिस्क कैश मेमोरी से वापस लाया गया है.

डिस्क की कैश मेमोरी से फ़ेच किए गए अनुरोध की जानकारी

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

webpack की मदद से पहले से लोड करना और प्रीफ़ेच करना

कोड को अलग-अलग करके JavaScript पेलोड कम करें पोस्ट में, डाइनैमिक इंपोर्ट का इस्तेमाल करके बंडल को कई हिस्सों में बांटने के बारे में बताया गया है. इसे एक ऐसे सामान्य ऐप्लिकेशन की मदद से दिखाया गया है जो फ़ॉर्म सबमिट किए जाने पर, Lodash से किसी मॉड्यूल को डाइनैमिक तरीके से इंपोर्ट करता है.

मैजिक सॉर्टर ऐप्लिकेशन, जो कोड स्प्लिटिंग के बारे में बताता है

इस ऐप्लिकेशन के लिए Glitch को यहां ऐक्सेस किया जा सकता है.

यहां दिया गया कोड ब्लॉक, src/index.js, में मौजूद है. यह बटन पर क्लिक करने पर, डाइनैमिक तरीके से इंपोर्ट करने के लिए ज़िम्मेदार है.

form.addEventListener("submit", e => {
  e.preventDefault()
  import('lodash.sortby')
    .then(module => module.default)
    .then(sortInput())
    .catch(err => { alert(err) });
});

बंडल को अलग-अलग हिस्सों में बांटने से, पेज लोड होने में लगने वाला समय कम हो जाता है. ऐसा इसलिए होता है, क्योंकि बंडल का शुरुआती साइज़ कम हो जाता है. webpack का 4.6.0 वर्शन, डाइनैमिक तरीके से इंपोर्ट किए गए चंक को प्रीलोड या प्रीफ़ेच करने की सुविधा देता है. इस ऐप्लिकेशन को उदाहरण के तौर पर इस्तेमाल करके, ब्राउज़र के आइडल टाइम पर lodash तरीके को प्रीफ़ेच किया जा सकता है. जब कोई उपयोगकर्ता बटन दबाता है, तो संसाधन को फ़ेच करने में कोई देरी नहीं होती.

किसी खास हिस्से को पहले से फ़ेच करने के लिए, डाइनैमिक इंपोर्ट में webpackPrefetch comment पैरामीटर का इस्तेमाल करें. यहां बताया गया है कि यह सुविधा इस ऐप्लिकेशन में कैसी दिखेगी.

form.addEventListener("submit", e => {
  e.preventDefault()
  import(/* webpackPrefetch: true */ 'lodash.sortby')
    .then(module => module.default)
    .then(sortInput())
    .catch(err => { alert(err) });
});

ऐप्लिकेशन फिर से लोड होने के बाद, webpack दस्तावेज़ के हेड में संसाधन के लिए प्रीफ़ेच टैग डालता है. इसे DevTools के Elements पैनल में देखा जा सकता है.

प्रीफ़ेच टैग वाला एलिमेंट पैनल

नेटवर्क पैनल में अनुरोधों को देखने से यह भी पता चलता है कि इस चंक को कम प्राथमिकता के साथ फ़ेच किया जाता है. ऐसा तब होता है, जब सभी अन्य संसाधनों का अनुरोध किया जा चुका हो.

प्रीफ़ेच किए गए अनुरोध के साथ नेटवर्क पैनल

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

import(/* webpackPreload: true */ 'module')

नतीजा

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

खास जानकारी पाने के लिए:

  • ऐसे संसाधनों के लिए preload का इस्तेमाल करें जो देर से मिलते हैं, लेकिन मौजूदा पेज के लिए ज़रूरी हैं.
  • उन संसाधनों के लिए prefetch का इस्तेमाल करें जिनकी ज़रूरत आने वाले समय में नेविगेशन रूट या उपयोगकर्ता की कार्रवाई के लिए होती है.

फ़िलहाल, सभी ब्राउज़र में प्रीलोड और प्रीफ़ेच, दोनों सुविधाएं काम नहीं करती हैं. इसका मतलब है कि आपके ऐप्लिकेशन के सभी उपयोगकर्ताओं को परफ़ॉर्मेंस में सुधार नहीं दिख सकता.

अगर आपको इस बारे में ज़्यादा जानकारी चाहिए कि प्रीलोडिंग और प्रीफ़ेचिंग से आपके वेब पेज पर क्या असर पड़ सकता है, तो ये लेख पढ़ें: