हम के प्रशंसक हैं कस्टम तत्व यहां आसपास। उनका डिजाइन उन्हें बनाता है आलसी लोडिंग के लिए विशेष रूप से उत्तरदायीजो परफॉर्मेंस के लिए वरदान साबित हो सकता है।
से प्रेरित होकर एक सहकर्मी का प्रयोग, मैंने हाल ही में एक साधारण ऑटो-लोडर लिखने के बारे में निर्धारित किया है: जब भी कोई कस्टम तत्व DOM में दिखाई देता है, तो हम संबंधित कार्यान्वयन को लोड करना चाहते हैं यदि यह अभी तक उपलब्ध नहीं है। ब्राउजर तब ऐसे तत्वों को वहां से अपग्रेड करने का ख्याल रखता है।
संभावना है कि आपको वास्तव में इन सबकी आवश्यकता नहीं होगी; आमतौर पर एक आसान तरीका होता है। जानबूझकर उपयोग किए जाने पर, यहां दिखाई गई तकनीकें अभी भी आपके टूलसेट के लिए उपयोगी हो सकती हैं।
स्थिरता के लिए, हम चाहते हैं कि हमारा ऑटो-लोडर भी एक कस्टम तत्व हो - जिसका अर्थ यह भी है कि हम इसे HTML के माध्यम से आसानी से कॉन्फ़िगर कर सकते हैं। लेकिन पहले, आइए उन अनसुलझे कस्टम तत्वों की चरण दर चरण पहचान करें:
class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; this.discover(scope); }
}
customElements.define("ce-autoloader", AutoLoader);
यह मानते हुए कि हमने इस मॉड्यूल को ऊपर-सामने लोड किया है (उपयोग करके async
आदर्श है), हम a को छोड़ सकते हैं <ce-autoloader>
में तत्व <body>
हमारे दस्तावेज़ का। वह तुरंत सभी बाल तत्वों के लिए खोज प्रक्रिया शुरू कर देगा <body>
, जो अब हमारे मूल तत्व का गठन करता है। जोड़कर हम खोज को अपने दस्तावेज़ के सबट्री तक सीमित कर सकते हैं <ce-autoloader>
इसके बजाय संबंधित कंटेनर तत्व के लिए - वास्तव में, हमारे पास अलग-अलग उपप्रकारों के लिए कई उदाहरण भी हो सकते हैं।
बेशक, हमें अभी भी इसे लागू करना है discover
विधि (के भाग के रूप में AutoLoader
ऊपर वर्ग):
discover(scope) { let candidates = [scope, ...scope.querySelectorAll("*")]; for(let el of candidates) { let tag = el.localName; if(tag.includes("-") && !customElements.get(tag)) { this.load(tag); } }
}
यहां हम अपने मूल तत्व को हर एक वंशज के साथ जांचते हैं (*
). यदि यह एक कस्टम तत्व है - जैसा कि हाइफ़नेटेड टैग द्वारा इंगित किया गया है - लेकिन अभी तक अपग्रेड नहीं किया गया है, तो हम संबंधित परिभाषा को लोड करने का प्रयास करेंगे। DOM को इस तरह से पूछना महंगा हो सकता है, इसलिए हमें थोड़ा सावधान रहना चाहिए। हम इस कार्य को स्थगित करके मुख्य सूत्र पर भार कम कर सकते हैं:
connectedCallback() { let scope = this.parentNode; requestIdleCallback(() => { this.discover(scope); });
}
requestIdleCallback
अभी तक सार्वभौमिक रूप से समर्थित नहीं है, लेकिन हम इसका उपयोग कर सकते हैं requestAnimationFrame
कमबैक के रूप में:
let defer = window.requestIdleCallback || requestAnimationFrame; class AutoLoader extends HTMLElement { connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); } // ...
}
अब हम लापता को लागू करने के लिए आगे बढ़ सकते हैं load
गतिशील रूप से इंजेक्ट करने की विधि a <script>
तत्व:
load(tag) { let el = document.createElement("script"); let res = new Promise((resolve, reject) => { el.addEventListener("load", ev => { resolve(null); }); el.addEventListener("error", ev => { reject(new Error("failed to locate custom-element definition")); }); }); el.src = this.elementURL(tag); document.head.appendChild(el); return res;
} elementURL(tag) { return `${this.rootDir}/${tag}.js`;
}
हार्ड-कोडेड कन्वेंशन पर ध्यान दें elementURL
। src
विशेषता का URL मानता है कि एक निर्देशिका है जहाँ सभी कस्टम तत्व परिभाषाएँ रहती हैं (जैसे <my-widget>
→ /components/my-widget.js
). हम अधिक विस्तृत रणनीतियों के साथ आ सकते हैं, लेकिन यह हमारे उद्देश्यों के लिए काफी अच्छा है। जरूरत पड़ने पर इस URL को एक अलग विधि में बदलने से प्रोजेक्ट-विशिष्ट सबक्लासिंग की अनुमति मिलती है:
class FancyLoader extends AutoLoader { elementURL(tag) { // fancy logic }
}
किसी भी तरह से, ध्यान दें कि हम भरोसा कर रहे हैं this.rootDir
. यह वह जगह है जहाँ उपर्युक्त विन्यास आता है। आइए एक संबंधित गेटर जोड़ें:
get rootDir() { let uri = this.getAttribute("root-dir"); if(!uri) { throw new Error("cannot auto-load custom elements: missing `root-dir`"); } if(uri.endsWith("/")) { // remove trailing slash return uri.substring(0, uri.length - 1); } return uri;
}
आप शायद सोच रहे होंगे observedAttributes
अभी, लेकिन यह वास्तव में चीजों को आसान नहीं बनाता है। प्लस अपडेट कर रहा है root-dir
रनटाइम पर कुछ ऐसा लगता है जिसकी हमें कभी आवश्यकता नहीं होगी।
अब हम कर सकते हैं - और चाहिए - हमारे तत्व निर्देशिका को कॉन्फ़िगर करें: <ce-autoloader root-dir="/components">
.
इससे हमारा ऑटो-लोडर अपना काम कर सकता है। सिवाय इसके कि यह केवल एक बार काम करता है, उन तत्वों के लिए जो ऑटो-लोडर प्रारंभ होने पर पहले से मौजूद हैं। हम शायद गतिशील रूप से जोड़े गए तत्वों का भी हिसाब रखना चाहेंगे। वह है वहां MutationObserver
खेलने के लिए आता है:
connectedCallback() { let scope = this.parentNode; defer(() => { this.discover(scope); }); let observer = this._observer = new MutationObserver(mutations => { for(let { addedNodes } of mutations) { for(let node of addedNodes) { defer(() => { this.discover(node); }); } } }); observer.observe(scope, { subtree: true, childList: true });
} disconnectedCallback() { this._observer.disconnect();
}
इस तरह, ब्राउज़र हमें सूचित करता है जब भी DOM में कोई नया तत्व प्रकट होता है - या बल्कि, हमारे संबंधित सबट्री - जिसका उपयोग हम खोज प्रक्रिया को पुनरारंभ करने के लिए करते हैं। (आप तर्क दे सकते हैं कि हम यहां कस्टम तत्वों का पुन: आविष्कार कर रहे हैं, और आप सही होंगे।)
हमारा ऑटो-लोडर अब पूरी तरह कार्यात्मक है। भविष्य के संवर्द्धन संभावित दौड़ स्थितियों पर गौर कर सकते हैं और अनुकूलन की जांच कर सकते हैं। लेकिन संभावना है कि यह ज्यादातर परिदृश्यों के लिए काफी अच्छा है। मुझे टिप्पणियों में बताएं कि क्या आपके पास एक अलग दृष्टिकोण है और हम नोट्स की तुलना कर सकते हैं!
- एसईओ संचालित सामग्री और पीआर वितरण। आज ही प्रवर्धित हो जाओ।
- प्लेटोब्लॉकचैन। Web3 मेटावर्स इंटेलिजेंस। ज्ञान प्रवर्धित। यहां पहुंचें।
- स्रोत: https://css-tricks.com/an-approach-to-lazy-loading-custom-elements/
- 1
- a
- About
- ऊपर
- लेखा
- वास्तव में
- जोड़ा
- इसके अलावा
- सब
- कम करना
- की अनुमति देता है
- पहले ही
- और
- दृष्टिकोण
- बहस
- चारों ओर
- उपलब्ध
- ब्राउज़र
- उम्मीदवारों
- नही सकता
- कौन
- सावधान
- संभावना
- चेक
- बच्चा
- कक्षा
- कैसे
- टिप्पणियाँ
- तुलना
- स्थितियां
- कंटेनर
- सम्मेलन
- इसी
- सका
- पाठ्यक्रम
- रिवाज
- डिज़ाइन
- विभिन्न
- खोज
- दस्तावेज़
- नहीं करता है
- डोम
- बूंद
- गतिशील
- आसान
- आसानी
- विस्तृत
- तत्व
- पर्याप्त
- त्रुटि
- ईथर (ईटीएच)
- EV
- और भी
- प्रत्येक
- सिवाय
- महंगा
- विफल रहे
- प्रशंसकों
- प्रथम
- से
- पूरी तरह से
- कार्यात्मक
- भविष्य
- जा
- अच्छा
- सिर
- यहाँ उत्पन्न करें
- एचटीएमएल
- HTTPS
- आदर्श
- पहचान करना
- तुरंत
- लागू करने के
- कार्यान्वयन
- कार्यान्वयन
- in
- बजाय
- जांच
- IT
- जावास्क्रिप्ट
- काम
- बच्चा
- जानना
- लंबाई
- सीमा
- थोड़ा
- भार
- लोड हो रहा है
- देखिए
- मुख्य
- बनाना
- बनाता है
- साधन
- तरीका
- हो सकता है
- लापता
- मॉड्यूल
- अधिक
- अधिकांश
- चाल
- मोज़िला
- विभिन्न
- आवश्यकता
- जरूरत
- नया
- नोड
- भाग
- प्रदर्शन
- प्लेटो
- प्लेटो डेटा इंटेलिजेंस
- प्लेटोडाटा
- प्ले
- प्लस
- संभावित
- शायद
- प्रक्रिया
- प्रयोजनों
- दौड़
- हाल ही में
- हटाना
- कि
- वापसी
- जड़
- परिदृश्यों
- क्षेत्र
- लगता है
- अलग
- सेट
- चाहिए
- दिखाया
- सरल
- एक
- So
- कुछ
- प्रारंभ
- कदम
- फिर भी
- रणनीतियों
- ऐसा
- समर्थित
- टैग
- लेता है
- तकनीक
- RSI
- लेकिन हाल ही
- चीज़ें
- विचारधारा
- सेवा मेरे
- <strong>उद्देश्य</strong>
- अद्यतन
- उन्नत
- यूआरआइ
- यूआरएल
- us
- उपयोग
- आमतौर पर
- के माध्यम से
- कौन कौन से
- मर्जी
- काम
- कार्य
- लिख रहे हैं
- आपका
- जेफिरनेट