2012-12-17 12 views
6

मुझे वर्तमान में जावास्क्रिप्ट पर नेमस्पेस के बारे में इस तर्क का सामना करना पड़ रहा है और मुझे समुदाय की राय चाहिए।RequJS के साथ जावास्क्रिप्ट नेमस्पेसिंग, क्यों?

परिदृश्य: इस परियोजना किसी भी तरह RequireJS के लिए समर्पित है के आरोप में वास्तुकार और वास्तव में इसका इस्तेमाल करना चाहता है।

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

ठीक है, कोई भी पृष्ठ एप्लिकेशन उन मामलों पर कोई फंतासी नहीं है। सादा बैकऑफिस वेब ऐप, मल्टी-पेज, एक जटिल जटिल यूआई के साथ जहां प्रत्येक पृष्ठ को सर्वर से अनुरोध किया जाता है और सभी संसाधन (सीएसएस, जावास्क्रिप्ट और ऐसे) पृष्ठ लोड पर लोड किए जाने चाहिए।

मुख्य प्रश्न: हम जिस प्रकार के ऐप के बारे में बात कर रहे हैं, उसे जानना, क्यों पहली जगह RequJS क्यों?

दूसरा प्रश्न: क्यों यह समझाने की कोशिश करें कि जावास्क्रिप्ट में नेमस्पेसिंग के लिए सबसे अच्छा तरीका RequJS का उपयोग कर है? क्या मैं कुछ भूल रहा हूँ?

मेरी राय: मेरे लिए यह बिल्कुल समझ में नहीं आता है। यहां RequJS का उपयोग करने के लिए बोझिल है क्योंकि मांग पर कोई संसाधन लोड नहीं होता है, वे सभी पेज लोड पर लोड होते हैं (सिर्फ इसलिए कि हमें उन सभी को पृष्ठ लोड पर चाहिए)। हमें कम से कम IE8, क्रोम, फ़ायरफ़ॉक्स और ओपेरा का समर्थन करने की आवश्यकता है और इन सभी ब्राउज़रों में संसाधन लोडिंग के साथ हमें पहले से ही बहुत परेशानी हुई है। यह सुनिश्चित करने के लिए पहले से ही बहुत सारी चाल है कि सबकुछ आवश्यकतानुसार अपेक्षित है।

नामस्थान के लिए यह और भी बदतर है। यकीन है कि यह काम करता है लेकिन फिर, मेरे लिए बोझिल लगता है और इस मामले पर वास्तव में बहुत सीमित है।

तो क्या मुझे कुछ याद आ रही है? मुझे यहां तीसरी (या 100 वीं) राय चाहिए।

  • आप इस बारे में क्या सोचते हैं?
  • आप क्या उपयोग करते हैं?
  • क्यों?

अग्रिम धन्यवाद

+0

क्या आप सी # में कथन का उपयोग करते हैं? यह वही चीज़ है। – BentOnCoding

+0

सी # "प्रयोग" कथन जावास्क्रिप्ट के लिए एएमडी उपकरण के समान नहीं हैं ... बिल्कुल। – AlexCode

+0

"उपयोग" आयात नामों में निहित प्रकारों को तत्काल संलग्न संकलन इकाई या नामस्थान निकाय में आयात करता है। "आवश्यक" मौजूदा स्क्रिप्ट/मॉड्यूल में निर्दिष्ट मॉड्यूल आयात करता है। मेरे जैसा बहुत अच्छा लगता है, लेकिन यह मेरी राय है – BentOnCoding

उत्तर

4

एएमडी लोडर (RequireJS एक है) विभिन्न मुद्दों का समाधान:

  • उचित मॉड्यूलर, चिंताओं की जुदाई
  • कोई वैश्विक प्रदूषण
  • कोई नाम नहीं संघर्ष
  • ऑन-डिमांड लोडिंग, या प्री-परिनियोजन अनुकूलन
  • लोडर के आधार पर, प्लगइन्स जैसे स्थानीयकृत संसाधन या लोड समय संकलन

के रूप में उन्नत मुद्दों संबोधित करने के लिए मैं ऐसे लोडर का एक बड़ा प्रशंसक हूँ और उन्हें एकल पृष्ठ क्षुधा सब कुछ के लिए उपयोगी है, लेकिन बहुत छोटे हैं।

+0

उस सूची से मैं केवल पिछले दो को एएमडी लोडर से जोड़ता हूं। – AlexCode

+0

चूंकि मैंने प्रत्येक पृष्ठ के लिए फ़ाइलों को अलग कर दिया है, इसलिए चिंताएं अच्छी तरह से सीमित थीं लेकिन नामस्थान नहीं थे। चूंकि अनुप्रयोग क्लाइंट-साइट पर भारी होने के लिए कहा गया है, इसलिए मैंने वैश्विक कार्यों को पॉलिश करने से बचने के लिए डोमेन फ़ंक्शंस में अपना कोड encapsulating शुरू किया और नाम संघर्ष को भी रोक दिया। मेरे अनुभव से मुझे पता है कि RequJS "बस काम नहीं करता" है। सभी ब्राउज़रों (विशेष रूप से पुराने वाले) में संगतता और स्थिरता सीधे आगे नहीं है, इसलिए एक बाजुका के साथ एक फ्लाई को मारने का प्रयास क्यों करें? – AlexCode

+1

@AlexCode ग्लोबल्स की अनुपस्थिति एएमडी अवधारणा का पूरी तरह से हिस्सा है: http://requirejs.org/docs/whyamd.html – Christophe

2

मेरी व्यक्तिगत राय में जावास्क्रिप्ट मॉड्यूल सिस्टम का उपयोग लगभग कभी बुरा विचार नहीं है। जावास्क्रिप्ट मॉड्यूल के लिए Requjs भी एकमात्र संभावित लोडर नहीं है (लेकिन शायद सबसे लोकप्रिय एक)। कुछ विकल्प एलएबीजेएस या हेडजेएस हैं।

उन लोडर का उपयोग करना अक्सर आसान होता है (शुरुआत में ज्यादा परेशानी नहीं) लेकिन जब परियोजना बड़ी और बड़ी हो रही है तो बहुत मदद कर सकती है। वे वैश्विक अंतरिक्ष में संघर्षों का नामकरण करने से बचते हैं और आपके मॉड्यूल को कम/अनुकूलित करके तैनाती चरण में भी आपकी सहायता कर सकते हैं। सबसे महत्वपूर्ण तथ्य यह है कि वे आपको अधिक मॉड्यूलर जावास्क्रिप्ट कोड लिखने की अनुमति देते हैं।

  • आपके पास कुछ उपयोगिता कार्य हैं? बस एक उपयोगिता मॉड्यूल बनाएँ।
  • आपके पास कुछ फ़ंक्शंस हैं जो आपको सभी पृष्ठों पर चाहिए? उन्हें एक सामान्य मॉड्यूल में डाल दें।
  • कुछ पृष्ठों को बहुत से विशिष्ट जावास्क्रिप्ट कोड की आवश्यकता है? उन पृष्ठों के लिए एक अतिरिक्त मॉड्यूल बनाएं ताकि आपको अन्य कोडों पर यह कोड लोड न करना पड़े।
+0

मैंने आपके उत्तर पर आपके अंक पर टिप्पणी की। असल में मैं आपसे पूरी तरह से सहमत हूं, मुझे कुछ ऐसा करने के लिए ओवरहेड और नियंत्रण की हानि पसंद नहीं है जो वास्तव में काफी सरल और पारदर्शी हो सकती है। – AlexCode

3

कोई फर्क नहीं पड़ता अगर यह एक "एकल पृष्ठ एप्लिकेशन" है या नहीं, RequireJS दो चीजें हैं जो अपने दम पर डेवलपर अनुशासन का एक बहुत बिना आसान नहीं है जब विकासशील क्लाइंट साइड जावास्क्रिप्ट के साथ मदद करता है:

उत्पादन बनाम विकास पर्यावरण

अब आपके जावास्क्रिप्ट अनुप्रयोगों को उन फ़ाइलों में विभाजित करने के लिए सामान्य ज्ञान है जो आपके आवेदन के विभिन्न हिस्सों के समान तर्कसंगत रूप से दिखते हैं। डीबग करना और बनाए रखना आसान है। उत्पादन में हालांकि, कई असंपीड़ित फ़ाइलों को शिपिंग प्रदर्शन के लिए खराब है। तो आप अपनी सभी फाइलों को एक फ़ाइल में जोड़ते हैं, इसे छोटा करते हैं (उदा। Google क्लोजर कंपाइलर का उपयोग करके) और फिर इसे एक सिंगल gzipped फ़ाइल के रूप में शिप करें। कमांड लाइन टूल्स का उपयोग करके ऐसा करने के कई अलग-अलग तरीके हैं (उदाहरण के लिए GruntJS का उपयोग करना) लेकिन आवश्यकता जेएस जैसे स्क्रिप्ट लोडर के बिना आपको किसी भी तरह अपने पेज को दो अलग-अलग उपयोग मामलों के लिए सेट करना होगा (स्क्रिप्ट टैग या एकल उत्पादन के रूप में अपनी सभी देव फ़ाइलों को संदर्भित करें .js) खुद। RequJS में एक नोडजेएस बिल्ड उपकरण है जो यह सब आपके लिए करता है।

Modularization

अब अलग फ़ाइलों में अपने कोड रखने सब अच्छा है। लेकिन जावास्क्रिप्ट की प्रकृति और वैश्विक होने का सब कुछ होने के कारण आप अभी भी अजीब चीज़ों जैसे कि नाम संघर्ष में भाग सकते हैं। यह वह जगह है जहां नेमस्पेसिंग काम में आती है। लेकिन इससे भी बेहतर विकल्प यह है कि सब कुछ अपने स्वयं के कार्य में लपेटें (जो अपना स्वयं का दायरा पेश करता है)। यही कारण है कि अधिकांश जावास्क्रिप्ट कोड एक स्व-निष्पादन अज्ञात फ़ंक्शन में आता है। यदि यह फ़ंक्शन अब एक एपीआई देता है तो यह खुलासा करना चाहता है कि आपके पास वेब मॉड्यूल हैं। आप अपने मॉड्यूल एपीआई को अपने आवेदन से अलग से जांच सकते हैं और इसे अन्य स्थानों में फिर से उपयोग कर सकते हैं।

RequJS दस्तावेज़ों से Why Web Modules अनुभाग में भी पढ़ें।

+0

उत्तरों के कारण मैंने अपने स्वयं के प्रश्न का उत्तर पोस्ट किया जिस तरह से मैं नेमस्पेसिंग को लागू करता हूं और क्यों। आपके पास वास्तव में पर्यावरण निर्भर कॉन्फ़िगरेशन पर वास्तव में एक मजबूत बिंदु है। धन्यवाद! – AlexCode

0

वैश्विक पर्यावरण और नाम संघर्ष को धक्का देने से रोकने के लिए मेरा वर्तमान समाधान $.extend का उपयोग कर है।

RootFolder 
    +-> js 
    global.js 
    ... 
    +-> views 
     index.js 
     page1.js 
     page2.js 
     ... 
index.html 
page1.html 
page2.html 

तो यह आम तौर पर और सभी आवेदन साझा कोड के साथ एक global.js फ़ाइल प्रति पृष्ठ एक और विशिष्ट है:

फाइल सिस्टम पेड़ निम्नलिखित की तरह कुछ लग रहा है।

नामस्थान के लिए मुझे $ पसंद है।इतना विस्तार प्रत्येक फ़ाइल जे एस पर मैं की तरह कुछ है: तो आप फोन करके अपने कोड का उपयोग कर सकते

var app = app || {}; 

/* only one document ready block per view if needed */ 
$(document).ready(function(){ 
    /* initialization code */ 
}); 

/* extend the app namespace with the Page1 code */ 
$.extend(app, { 
    page1: { 
     SayHi: function SayHi(name){ 
      alert('Hi ' + name); 
     } 
    } 
}); 

:

app.page1.SayHi("Alex"); 

इस तकनीक के साथ आप:

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

निष्कर्ष:

वेब वातावरण वास्तव में आसान है, हम इसे जटिल नहीं होना चाहिए।

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

इसलिए यदि मुझे मुख्य सुविधा की आवश्यकता नहीं है तो इसका उपयोग करने पर कोई बात नहीं है।

चीयर्स!

+0

मॉड्यूल में अपनी जावास्क्रिप्ट को परिभाषित करना एक अनुशंसित सर्वोत्तम अभ्यास है।मुझे विश्वास नहीं है कि किसी भी 1 ढांचे में सभी समस्याएं हल होती हैं, लेकिन प्रतिक्रिया एक अच्छा समाधान है जो मॉड्यूल लोडिंग का समर्थन नहीं करने वाले ब्राउज़र के लिए पिछड़ा संगतता प्रदान करता है। आप उस चीज़ का उपयोग करने से बचने के लिए अपने रास्ते से बाहर चले गए जिसे आपने समझने का समय नहीं लिया, और बहुत कम वांछनीय पैटर्न के साथ समाप्त हो गया। यदि आप आवश्यकताओं का उपयोग न करने का आग्रह करते हैं, तो कम से कम आप कर सकते हैं तुरंत फ़ंक्शन अभिव्यक्तियों के बारे में जानें, और वे जावास्क्रिप्ट में नामस्थानों को सुरक्षित रूप से परिभाषित करने में आपकी सहायता कैसे कर सकते हैं। – BentOnCoding

+0

आप लगभग 3y पुरानी पोस्ट पर टिप्पणी कर रहे हैं। वैसे भी, मैं मानता हूं कि यह एक अच्छा दृष्टिकोण नहीं था लेकिन यह निराशा के तहत एक रिलीज था :) मैंने कभी भी इसे लागू नहीं किया और वास्तव में, कुछ महीने बाद हमने सब कुछ एंगुलरजेएस में ले जाया और फिर भी आवश्यकता नहीं है। वैसे भी, सभी निर्णय उपकरण को समझने से नहीं बने थे, लेकिन ठीक विपरीत। – AlexCode

संबंधित मुद्दे