मुझे लगता है कि 2013 में जेक आर्चीबाल्ड ने हमें कुछ अंतर्दृष्टि प्रदान की, जो इस विषय में और भी सकारात्मकता ला सकती है:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
पवित्र ग्रिल में स्क्रिप्टिंग का एक सेट होता है जिसे रेंडरिंग को ब्लॉक किए बिना तुरंत डाउनलोड किया जाता है और जितनी जल्दी हो सके उतने समय में निष्पादित किया जाता है। दुर्भाग्य से HTML आपसे नफरत करता है और आपको ऐसा नहीं करने देगा।
(...)
जवाब वास्तव में एचटीएमएल 5 कल्पना में है, हालांकि यह स्क्रिप्ट-लोडिंग अनुभाग के नीचे छिपा हुआ है। " Async IDL विशेषता नियंत्रित करती है कि क्या तत्व एसिंक्रोनस रूप से निष्पादित करेगा या नहीं। यदि तत्व का" बल-async "ध्वज सेट है, तो, प्राप्त होने पर, async IDL विशेषता को सही लौटना चाहिए, और सेटिंग पर," बल-async " ध्वज को पहले परेशान होना चाहिए ... "।
(...)
लिपियों को गतिशील रूप से बनाया गया है और दस्तावेज़ में जोड़ा गया है डिफ़ॉल्ट रूप से async हैं , वे रेंडरिंग को ब्लॉक नहीं करते हैं और जैसे ही वे डाउनलोड करते हैं निष्पादित करते हैं, जिसका अर्थ है कि वे गलत क्रम में बाहर आ सकते हैं। हालाँकि, हम उन्हें स्पष्ट रूप से async के रूप में चिह्नित कर सकते हैं:
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
यह हमारी स्क्रिप्ट को व्यवहार का एक मिश्रण देता है जिसे सादे HTML के साथ प्राप्त नहीं किया जा सकता है। स्पष्ट रूप से async नहीं होने के कारण, स्क्रिप्ट्स को निष्पादन कतार में जोड़ा जाता है, वही कतार जो वे हमारे पहले सादे-HTML उदाहरण में जोड़ते हैं। हालाँकि, गतिशील रूप से निर्मित होने के कारण, उन्हें दस्तावेज़ पार्सिंग के बाहर निष्पादित किया जाता है, इसलिए डाउनलोड करते समय रेंडरिंग को ब्लॉक नहीं किया जाता है (सिंक XHR के साथ नहीं- async स्क्रिप्ट लोड करने को भ्रमित करें, जो कभी अच्छी बात नहीं है)।
उपरोक्त स्क्रिप्ट को पृष्ठों के सिर में इनलाइन शामिल किया जाना चाहिए, प्रगतिशील रेंडरिंग को बाधित किए बिना स्क्रिप्ट डाउनलोड को जल्द से जल्द डाउनलोड करना चाहिए, और आपके द्वारा निर्दिष्ट आदेश में जितनी जल्दी हो सके निष्पादित करें। "1.js" "1.js" से पहले डाउनलोड करने के लिए स्वतंत्र है, लेकिन इसे तब तक निष्पादित नहीं किया जाएगा जब तक कि "1.js" को सफलतापूर्वक डाउनलोड या निष्पादित नहीं किया जाता है, या ऐसा करने में विफल रहता है। हुर्रे! async- डाउनलोड लेकिन आदेश-निष्पादन !
फिर भी, यह स्क्रिप्ट लोड करने का सबसे तेज़ तरीका नहीं हो सकता है:
(...) ब्राउज़र के ऊपर के उदाहरण के साथ स्क्रिप्ट को पार्स और निष्पादित करना है ताकि यह पता लगाया जा सके कि कौन सी स्क्रिप्ट डाउनलोड करनी है। यह आपकी स्क्रिप्ट को प्रीलोड स्कैनर से छुपाता है। ब्राउज़र्स इन स्कैनर का उपयोग उन पृष्ठों पर संसाधनों की खोज करने के लिए करते हैं, जिनकी आप अगली यात्रा करने की संभावना रखते हैं, या पृष्ठ संसाधनों की खोज करते हैं, जबकि पार्सर किसी अन्य संसाधन द्वारा अवरुद्ध होता है।
हम इसे दस्तावेज़ के प्रमुख में डालकर खोजनीयता को वापस जोड़ सकते हैं:
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
यह बताता है कि ब्राउज़र को पेज को 1.js और 2.js. की जरूरत है लिंक [rel = subresource] लिंक [rel = prefetch] के समान है, लेकिन विभिन्न शब्दार्थों के साथ। दुर्भाग्य से यह वर्तमान में केवल क्रोम में समर्थित है, और आपको दो बार लोड करने के लिए स्क्रिप्ट को घोषित करना होगा, एक बार लिंक तत्वों के माध्यम से, और फिर से आपकी स्क्रिप्ट में।
सुधार: मैंने कहा कि मूल रूप से ये प्रीलोड स्कैनर द्वारा उठाए गए थे, वे नहीं हैं, वे नियमित पार्सर द्वारा उठाए गए हैं। हालाँकि, प्रीलोड स्कैनर इन्हें उठा सकता है, यह अभी तक नहीं है, जबकि निष्पादन योग्य कोड द्वारा शामिल लिपियों को कभी भी प्रीलोड नहीं किया जा सकता है। योव वीस का धन्यवाद जिन्होंने मुझे टिप्पणियों में सही किया।
async
नया (ईश) है, लेकिनdefer
IE4 के बाद से IE का हिस्सा है।defer
हाल ही में अन्य ब्राउज़रों में जोड़ा गया था, लेकिन उन ब्राउज़र के पुराने संस्करण बहुत कम घूमते हैं।