Jquery कोड हेडर या पाद लेख में जाना चाहिए?


190

Jquery कोड (या अलग Jquery फ़ाइल) डालने के लिए सबसे अच्छी जगह कहाँ है? अगर मैं इसे पाद लेख में रखूंगा तो क्या पृष्ठ तेजी से लोड होंगे?


जवाबों:


189

सभी लिपियों को अंतिम लोड किया जाना चाहिए

हर मामले के बारे में, पृष्ठ के अंत में अपने सभी स्क्रिप्ट संदर्भों को रखना सबसे अच्छा है, ठीक पहले </body>

यदि आप टेम्प्लेटिंग समस्याओं और व्हाट्सएप के कारण ऐसा करने में असमर्थ हैं, तो अपने स्क्रिप्ट टैग को इस deferविशेषता से सजाएं कि ब्राउज़र को HTML डाउनलोड होने के बाद आपकी स्क्रिप्ट डाउनलोड करना पता हो:

<script src="my.js" type="text/javascript" defer="defer"></script>

किनारे के मामले

कुछ बढ़त मामलों, कर रहे हैं फिर भी, जहां पेज अस्थिर या पृष्ठ लोड के दौरान अन्य कलाकृतियों आम तौर पर सिर्फ अपनी jQuery स्क्रिप्ट संदर्भ रखकर हल किया जा सकता है जो अनुभव कर सकते हैं <head>टैग के बिनाdefer विशेषता। इन मामलों में jQuery UI और अन्य addons जैसे jCarousel या Treeview शामिल हैं जो DOM को उनकी कार्यक्षमता के हिस्से के रूप में संशोधित करते हैं।


आगे की बातें

कुछ पुस्तकालय हैं जिन्हें डोम या सीएसएस से पहले लोड किया जाना चाहिए, जैसे कि पॉलीफिल्स। मॉडर्निज़्र एक ऐसी लाइब्रेरी है जिसे हेड टैग में रखा जाना चाहिए


5
खैर, इस पर विचार करें: themeforest.net/item/portfolious-professional-business-template/… । यह एक साइट विषय है जिसे मैंने हाल ही में खरीदा है जो अपने होमपेज पर jCarousel के साथ jQuery का उपयोग करता है। जब मैंने स्क्रिप्ट ब्लॉक को फ़ाइल के सिर से अंत तक स्थानांतरित किया, तो मैंने देखा कि हिंडोला में उपयोग की जाने वाली छवियां पृष्ठ लोड के दौरान एक ही बार में दिखाई देंगी, जबकि जब स्क्रिप्ट फाइलें सिर में थीं, तो पृष्ठ अधिक सुचारू रूप से लोड होगा।
चाड लेवी

5
सामग्री की प्रारंभिक स्थिति सेट करने के लिए CSS का उपयोग करें। सीएसएस को सिर में जाना चाहिए। किसी और चीज को बनाने के लिए किसी चीज को तोड़ना समाधान नहीं है। यदि किसी आगंतुक को किसी भी सामग्री के प्रस्तुत होने से पहले लोड करने के लिए jQuery और सभी संबद्ध प्लगइन्स का इंतजार करना पड़ता है, तो वह सामग्री को देखने के लिए लंबे समय तक नहीं रह सकता है।
डंकन

9
ChadLevy सही है: कुछ शर्तें हैं जिनके तहत jQuery प्लग इन को संदर्भित करने पर बेहतर काम होता है <head>। यदि आपका मार्कअप आपके लिए सामग्री को छांटने वाले jQuery प्लगइन पर निर्भर है, तो इसका कोई मतलब नहीं है कि प्लगइन संदर्भ को पेज के नीचे रख दिया जाए, क्योंकि आप प्लग-इन लोड होने तक अपने वेब पेज में फंकी मार्कअप प्राप्त करने जा रहे हैं। नियमों का पालन तब तक किया जाता है जब तक वे काम नहीं करते हैं, जिस बिंदु पर नियमों को तोड़ा जाना चाहिए।
रॉबर्ट हार्वे

2
@ डंकन: आदर्श रूप से यह ऐसा मामला होगा जहां आप सभी निर्भरता को नियंत्रित कर सकते हैं। JQuery के बारे में बात (अधिक विशेष रूप से jQuery यूआई और अन्य addons जैसी चीजें) डिजाइन के अनुसार आप उनकी कार्यक्षमता पर पूरा नियंत्रण नहीं कर सकते हैं, इसलिए एक डोम तत्व के लिए दृश्यता विशेषताओं की तरह कुछ जोड़ना ताकि यह और अधिक सुंदर ढंग से लोड हो सके तो संभव नहीं है एक एडऑन जो उस तत्व का उपयोग करता है वह विशेषता को ध्यान में नहीं रखेगा। कभी-कभी एक साधारण सम्मेलन को टालना बेहतर होता है, जिस तरह से आप चाहते हैं उस तरह से काम करने के लिए एक निर्भरता प्राप्त करने की कोशिश करें।
चाड लेवी

2
@ सीन: यदि आपके jQuery प्लगइन्स को DOM में हेरफेर करने की अनुमति नहीं है, तो क्या बात है?
रॉबर्ट हार्वे

229

तल पर लिपियों रखो

स्क्रिप्ट के कारण समस्या यह है कि वे समानांतर डाउनलोड ब्लॉक करते हैं। HTTP / 1.1 विनिर्देश बताता है कि ब्राउज़र होस्टनाम प्रति समानांतर में दो से अधिक घटकों को डाउनलोड नहीं करते हैं। यदि आप कई होस्टनाम से अपनी छवियों की सेवा करते हैं, तो आप समानांतर में होने के लिए दो से अधिक डाउनलोड प्राप्त कर सकते हैं। हालांकि एक स्क्रिप्ट डाउनलोड हो रही है, हालाँकि, ब्राउज़र अलग होस्टनाम पर भी कोई अन्य डाउनलोड शुरू नहीं करेगा। कुछ स्थितियों में स्क्रिप्ट को नीचे ले जाना आसान नहीं है। यदि, उदाहरण के लिए, स्क्रिप्ट पृष्ठ की सामग्री का हिस्सा सम्मिलित करने के लिए document.write का उपयोग करती है, तो इसे पृष्ठ में कम नहीं ले जाया जा सकता है। वहाँ भी मुद्दों scoping हो सकता है। कई मामलों में, इन स्थितियों को हल करने के तरीके हैं।

एक वैकल्पिक सुझाव जो अक्सर आता है वह है आस्थगित लिपियों का उपयोग करना। DEFER विशेषता इंगित करती है कि स्क्रिप्ट में document.write नहीं है, और ब्राउज़रों के लिए एक संकेत है कि वे प्रतिपादन जारी रख सकते हैं। दुर्भाग्य से, फ़ायरफ़ॉक्स DEFER विशेषता का समर्थन नहीं करता है। इंटरनेट एक्सप्लोरर में, स्क्रिप्ट को स्थगित किया जा सकता है, लेकिन जितना वांछित नहीं है। यदि किसी स्क्रिप्ट को टाल दिया जा सकता है, तो उसे पृष्ठ के निचले भाग में भी ले जाया जा सकता है। इससे आपके वेब पेज तेजी से लोड होंगे।

संपादित करें: फ़ायरफ़ॉक्स संस्करण 3.6 के बाद से DEFER विशेषता का समर्थन करता है।

सूत्रों का कहना है:


4
मैंने कुछ आधुनिक सलाह देखी हैं जो बताती हैं कि लिपियों को सबसे ऊपर रखा जाना चाहिए। नीचे की लिपियों को रखने से पृष्ठ के शरीर में छवियों और अन्य सामग्री को समानांतर में लोड करने की अनुमति मिलती है, लेकिन प्रभावी रूप से बाद में पृष्ठ में लिपियों को लोड करने का कारण बनता है - ब्राउज़र के बारे में जानने से पहले पूरे HTML शरीर को डाउनलोड करने की आवश्यकता होती है स्क्रिप्ट URL लोड करने के लिए। अधिकांश लोग याहू गाइड का संदर्भ देते हैं, जो अब सटीक नहीं है - फ़ायरफ़ॉक्स वास्तव में स्क्रिप्ट पर आस्थगित विशेषताओं का सम्मान करता है। यदि आप इसे मापते हैं तो शीर्ष पर Deferral तेजी से पेज लोड होने वाला है।
शैडोचैस्टर

क्या मैं इस विधि के साथ पृष्ठ लोड गति पर कुछ आँकड़े देख सकता हूँ?
गेब्रियल अलैक सेप

1
फ़ायरफ़ॉक्स संस्करण 3.6 के बाद से DEFER atttibute का समर्थन करता है। स्रोत: w3schools.com/tags/att_script_defer.asp
निकिता

1
अपडेट: २०१६ की शुरुआत में, सभी आधुनिक ब्राउज़रों ने होस्टनाम प्रति कनेक्शन की संख्या कम से कम ६. बढ़ाई है
रात उल्लू

32

केवल सिर में ही jQuery लोड करें, बेशक CDN के माध्यम से।

क्यों? कुछ परिदृश्यों में आप एम्बेडेड jQuery निर्भर कोड के साथ एक आंशिक टेम्पलेट (जैसे ajax लॉगिन फॉर्म स्निपेट) शामिल कर सकते हैं; यदि jQuery पृष्ठ तल पर लोड किया जाता है, तो आपको "$ परिभाषित नहीं किया गया" त्रुटि मिलती है, अच्छा है।

इस तरीके को हल करने के तरीके हैं (जैसे किसी JS को एम्बेड नहीं करना और लोड-एट-बॉटम js बंडल को जोड़ना), लेकिन क्यों lazily लोड किए गए js की स्वतंत्रता खो देते हैं, जो कहीं भी कृपया jQuery निर्भर कोड रखने में सक्षम हैं ? जावास्क्रिप्ट इंजन परवाह नहीं करता है जहां कोड डोम में रहता है जब तक निर्भरता (जैसे कि jQuery लोड किया जा रहा है) संतुष्ट हैं।

आपकी सामान्य / साझा की गई js फ़ाइलों के लिए, हां, उन्हें पहले रखें </body>, लेकिन अपवादों के लिए, जहां यह वास्तव में सिर्फ एक jQuery आश्रित स्निपेट या फ़ाइल संदर्भ को HTML में उस बिंदु पर छड़ी करने के लिए समझ में आता है।

सिर में कोई लोडिंग हिट जेकरी नहीं है; किस ब्राउज़र पर पहले से ही कैश में jQuery CDN फ़ाइल नहीं है?

ज्यादा कुछ नहीं के बारे में, सिर में jQuery छड़ी और अपने जे एस स्वतंत्रता शासन करते हैं।


1
कई, कई ब्राउज़र नहीं; लगभग 2% उच्चतम आंकड़ा मैंने पढ़ा है, जब आप संस्करण को ध्यान में रखते हैं और तथ्य कैशिंग सटीक संसाधन नामों पर आधारित है, इसलिए jquery1.4.2 jquery1.7, या 1.9.1 या ।। के समान नहीं है। ।
टोनी लेह

उनमें से 2%, कहते हैं, पहली बार पृष्ठ लोड होने से पहले आधा निकल जाएगा। इस तरह से आप 1%आगंतुकों को खो रहे हैं , लेकिन संभावित रूप से अपने आप को विकास के समय और परेशानी से बचा रहे हैं। देखें कि क्या यह आपके व्यवसाय मॉडल के साथ समझ में आता है ...
oss

13

निंबुज इसमें शामिल मुद्दे की बहुत अच्छी व्याख्या प्रदान करता है, लेकिन मुझे लगता है कि अंतिम उत्तर आपके पृष्ठ पर निर्भर करता है: उपयोगकर्ता के लिए अधिक महत्वपूर्ण क्या है - स्क्रिप्ट या चित्र?

कुछ पृष्ठ ऐसे हैं जो छवियों के बिना कोई मतलब नहीं रखते हैं, लेकिन केवल मामूली, गैर-आवश्यक स्क्रिप्टिंग है। उस स्थिति में यह स्क्रिप्ट को नीचे रखने के लिए समझ में आता है, इसलिए उपयोगकर्ता जल्द ही छवियों को देख सकता है और पृष्ठ की समझ बनाना शुरू कर सकता है। अन्य पेज काम करने के लिए स्क्रिप्टिंग पर भरोसा करते हैं। उस मामले में छवियों के साथ काम न करने वाले पृष्ठ की तुलना में छवियों के बिना एक कार्यशील पृष्ठ होना बेहतर है, इसलिए यह शीर्ष पर स्क्रिप्ट लगाने के लिए समझ में आता है।

एक और बात पर विचार करना है कि स्क्रिप्ट आमतौर पर छवियों से छोटी होती हैं। बेशक, यह एक सामान्यीकरण है और आपको यह देखना होगा कि क्या यह आपके पेज पर लागू होता है। यदि ऐसा होता है, तो मेरे लिए, उन्हें पहले नियम के रूप में अंगूठे के रूप में डालने का तर्क है (अर्थात जब तक कि अन्यथा करने का एक अच्छा कारण नहीं है), क्योंकि वे छवियों को विलंबित नहीं करेंगे, क्योंकि चित्र स्क्रिप्ट में देरी करेंगे। अंत में, शीर्ष पर स्क्रिप्ट रखना बहुत आसान है, क्योंकि आपको इस बारे में चिंता करने की ज़रूरत नहीं है कि क्या उन्हें अभी तक लोड किया गया है जब आपको उनका उपयोग करने की आवश्यकता होती है।

सारांश में, मैं डिफ़ॉल्ट रूप से स्क्रिप्ट को शीर्ष पर रखता हूं और केवल यह विचार करता हूं कि क्या यह पृष्ठ पूरा होने के बाद उन्हें नीचे की ओर ले जाना उचित है। यह एक अनुकूलन है - और मैं इसे समय से पहले नहीं करना चाहता।


जब तक आप समयपूर्व अनुकूलन तर्क को बाहर नहीं निकालते, तब तक आप मेरे पास थे। यह सिर्फ एक और नियम है जिसका लोग पूरी तरह से इसके निहितार्थ को समझे बिना हठपूर्वक अनुसरण करते हैं।
रॉबर्ट हार्वे

6
ओह ठीक है, उन सब को जीत नहीं सकते! मुझे विश्वास है कि मैं इसके निहितार्थ को समझता हूं। :)
ईएमपी

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

4
यह देखते हुए कि सर्वसम्मति से स्क्रिप्ट को नीचे रखना है, क्या यह बेहतर नहीं होगा कि डिफ़ॉल्ट रूप से, और यदि आप समस्याओं का अनुभव करते हैं तो केवल उन्हें ऊपर ले जाएं? चीजों को पीछे की तरफ करने में अजीब लगता है। कभी-कभी इष्टतम काम करना बेहतर होता है यदि खर्च किए गए प्रयास में कोई अंतर नहीं है :)
डंकन

@ डंकन, हाँ यही मेरा दृष्टिकोण था। मैंने प्लगइन्स को सबसे नीचे रखा, और जब मुझे समस्याएँ आईं, तो मैंने उन्हें सबसे ऊपर रखा, और समस्याओं को ठीक किया।
रॉबर्ट हार्वे

6

अधिकांश jquery कोड तैयार दस्तावेज़ पर निष्पादित होता है, जो वैसे भी पृष्ठ के अंत तक नहीं होता है। इसके अलावा, पेज रेंडर को जावास्क्रिप्ट पार्सिंग / निष्पादन में देरी हो सकती है, इसलिए पेज के निचले भाग में सभी जावास्क्रिप्ट को डालना सबसे अच्छा अभ्यास है।


5

मानक अभ्यास आपकी सभी लिपियों को पृष्ठ के निचले भाग में रखना है, लेकिन मैं ASP.NET MVC का उपयोग कई jQuery प्लगइन्स के साथ करता हूं, और मुझे लगता है कि यह सब बेहतर काम करता है यदि मैं अपनी jQuery स्क्रिप्ट्स <head>को मास्टर के अनुभाग में रखता हूं। पृष्ठ।

मेरे मामले में, ऐसी कलाकृतियाँ हैं जो पृष्ठ लोड होने पर होती हैं, यदि स्क्रिप्ट पृष्ठ के निचले भाग में हों। मैं jQuery के वृक्ष दृश्य प्लगइन का उपयोग कर रहा हूं, और यदि स्क्रिप्ट शुरुआत में लोड नहीं हुई हैं, तो पेड़ प्लगइन द्वारा उस पर लगाए गए आवश्यक सीएसएस वर्गों के बिना प्रस्तुत करेगा। तो जब आप पहले पृष्ठ लोड करते हैं, तो ट्री व्यू के समुचित प्रतिपादन के बाद आपको यह अजीब दिखने वाला गड़बड़ मिलता है। बहुत बुरी लग रही है। <head>मास्टर पेज के सेक्शन में jQuery प्लगइन्स लगाने से यह समस्या समाप्त हो जाती है।


इंट्रानेट इंटरनेट जैसी ही स्थितियों के अधीन नहीं हैं, इसलिए लोड विलंब संभवतया कम बोधगम्य है। हालांकि नियमों का पालन करना अभी भी उचित है।
डंकन

नहीं, CSS आइडेंटिफ़ायर / स्टाइल को मार्कअप में रखना (बजाय इसके डोम पर तैयार होने के लिए jQuery की प्रतीक्षा करना) समस्या को हल करता है।
दान बीम

1
@ डैन बीम: ट्रीव्यू एक डेटाबेस टेबल से आबाद है, और ट्रीव्यू की शैलियाँ ट्रीव्यू प्लगइन द्वारा टेबल की सामग्री के आधार पर सेट की जाती हैं, इसलिए नहीं, यह काम नहीं करेगा।
रॉबर्ट हार्वे

1
मैं ऐसा क्यों करूंगा, जब मैं पृष्ठ के शीर्ष पर केवल अनमॉडिफाइड ट्रीव्यू प्लगइन स्क्रिप्ट रख सकता हूं, और यह ठीक काम करेगा? इसका कोई मतलब नहीं है, दान।
रॉबर्ट हार्वे

1
चीयर्स रॉबर्ट, मैं भी ASP.NETMVC का उपयोग आंशिक रूप में रूपों के साथ कर रहा हूं। यह आंशिक के भीतर जावास्क्रिप्ट रखने के लिए समझ में आता है क्योंकि नए क्षेत्रों को हर बार आंशिक रूप से निष्पादित (सत्यापन के लिए कहें) को उनकी कार्यक्षमता को फिर से सौंपा जाता है। मैंने केवल उपयोग करने का प्रयास करते समय इसके साथ समस्याओं का सामना किया है @Html.Action, जो गतिशील रूप से आउटपुट के लिए लिखता है, क्योंकि मेरा आंशिक $ is undefinedअर्थ देता है कि मुझे आंशिक लोड करने के लिए। लोड ('@ Url.Action') का उपयोग करना होगा। लेकिन यह अतिरिक्त अनुरोध के कारण एक दूषण देता है। आपके इनपुट के आधार पर, मैं सिर्फ अपने मास्टर पेज में RenderBody () से ऊपर के jquery को स्थानांतरित करूंगा
Malkin

4

यद्यपि लगभग सभी वेब साइटें अभी भी हेडर पर Jquery और अन्य जावास्क्रिप्ट को रखती हैं: D, यहां तक ​​कि stackoverflow.com की जाँच करें।

मैं आपको शरीर के अंतिम टैग से पहले डालने का सुझाव भी देता हूं। आप दोनों स्थानों पर रखने के बाद लोडिंग समय की जांच कर सकते हैं। स्क्रिप्ट टैग आपके वेबपृष्ठ को आगे लोड करने के लिए रोक देगा।

और जावास्क्रिप्ट को पाद पर रखने के बाद, आप अपने वेबपेज के असामान्य रूप को तब तक प्राप्त कर सकते हैं जब तक कि यह जावास्क्रिप्ट लोड न हो जाए, इसलिए अपने हेडर सेक्शन पर सीएसएस लगाएं।


2
लेकिन, आप स्क्रिप्ट पर defer का उपयोग करके एक ही चीज हासिल कर सकते हैं। w3schools.com/tags/att_script_defer.asp
जैक टक

2

इससे पहले </body>कि याहू डेवलपर नेटवर्क के बेस्ट प्रैक्टिसेज फॉर स्पीड अप योर वेब साइट इस लिंक के अनुसार सबसे अच्छी जगह है , यह समझ में आता है।

सबसे अच्छी बात यह है कि अपने आप से परीक्षण करें।


0

मेरे लिए jQuery थोड़ा खास है। शायद आदर्श के लिए एक अपवाद। ऐसी कई अन्य स्क्रिप्ट हैं जो इस पर निर्भर करती हैं, इसलिए यह काफी महत्वपूर्ण है कि यह जल्दी लोड हो जाती है इसलिए बाद में आने वाली अन्य स्क्रिप्ट भी उद्देश्य के अनुसार काम करेंगी। जैसा कि किसी और ने बताया कि यह पृष्ठ भी सिर अनुभाग में jQuery लोड करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.