2010-09-08 18 views
41

आप अपनी पूरी वेबसाइट पर बड़े जेएस/jQuery कोडबेस कैसे व्यवस्थित करते हैं? आपके कोड के टुकड़े व्यवस्थित करने के तरीके पर बहुत अच्छे संसाधन हैं, लेकिन वास्तव में यह सब कुछ एक साथ खींचने और प्रत्येक टुकड़े को फिट करने के तरीके के बारे में कुछ भी नहीं है: साइड वाइड कोड संगठन, एक ही कोड का उपयोग करके एकाधिक पेज, ढीले युग्मन के साथ DRY रहना, आदिआप अपनी पूरी वेबसाइट पर बड़े जेएस/jQuery कोड बेस कैसे व्यवस्थित करते हैं?

नीचे मैं इसका सामना कैसे करता हूं। मैं कभी भी इस तरह अपना कोड व्यवस्थित नहीं कर रहा हूं, क्योंकि मुझे लगता है कि यह मैला है और रखरखाव/स्केलिंग समस्याओं का कारण बन सकता है, लेकिन मुझे वास्तव में कोई बेहतर जानकारी नहीं है।

मुझे एहसास है कि मेरे पास हर किसी के पास अपनी आवश्यकताओं का सेट है और कोई टर्न-कुंजी समाधान नहीं है, लेकिन मुझे गलत क्या कर रहा है, इस बारे में कुछ राय सुनना अच्छा लगेगा, मैं इसे गलत क्यों कर रहा हूं, और सुझाव अधिक रखरखाव कोड कैसे लिखें।

मैं क्या लगता है कि मैं वास्तव में प्राप्त करने के लिए कोशिश कर रहा हूँ:,

  1. कैसे आप तर्क है कि आप कई स्थानों में उपयोग करने की आवश्यकता के साथ सौदा करते एकाधिक पृष्ठों पर?

  2. आप पेज-विशिष्ट कोड कैसे व्यवस्थित करते हैं? क्या प्रत्येक पृष्ठ को में एक वैश्विक वस्तु का अच्छा विचार है? 1।

  3. आप शुरू से क्या करते हैं सुनिश्चित करें कि आप कर रहे हैं लगातार नहीं फिर से लिखने के अपने संगठन पैटर्न रूप में अपने अनुप्रयोग बड़ा और बड़ा बढ़ता है? मैं शायद इस 4 वें इस बात को लिखने के पुनरावृत्ति पर हूं। 2।

प्रत्येक पृष्ठ को मुख्य application.js फ़ाइल प्राप्त होती है। प्रत्येक अतिरिक्त पृष्ठ में यह application.pagename.js फ़ाइल है। मैं फ़ाइलों को शामिल करने के लिए सर्वर साइड लॉजिक का उपयोग करता हूं (पहली बार देखने के लिए जांच कर रहा है यदि कोई पृष्ठ के लिए भी मौजूद है - कुछ पृष्ठों को जेएस की आवश्यकता नहीं है), और फिर उन्हें क्रम में शामिल करें।

<script src="js/application.js"></script> 
<script src="js/application.index.js"></script> 
<script> 
    MyApp.init(); 
    MyApp.index.init(); 
</script> 

मेरी यूआरएल सम्मेलन है/पेज/उपपृष्ठ/आईडी /:

तो मेरा होम पेज जैसा दिखता है। मेरे पास लगभग 10 पृष्ठ हैं और पूरी तरह से उपपृष्ठ हैं, प्रत्येक उपपृष्ठ को अपना तर्क आवश्यक है। इस पोस्ट में अंतिम उदाहरण देखें।

मेरा अधिकांश कोड पहले से ही jQuery UI विजेट या jQuery प्लगइन में मॉड्यूलर किया गया है, इसलिए मैं कहूंगा कि इन फ़ाइलों में 75% कोड की आवश्यकता है() एक विजेट में और इसे initing।

मैं आवश्यकतानुसार विजेट में खींचने के लिए आवश्यक जेएस का उपयोग करता हूं।

// application.js 
var MyApp = { 
    init: function(){ 
     var self = this; 

     // these widgets are available on every single page 
     // notice the call to jquery.deparam.js - i'll use this later to init subpage logic. 
     require(['js/widget1.js', 'js/widget2.js', 'js/widget3.js', 'js/jquery.deparam.js'], function(){ 

      // deparam the query string. I'll use this later. 
      self.querystring = $.deparam.querystring(); 

      // init widgets once the document is ready 
      $(function(){ 
       $("#widget1").widget1(); 
       $("#widget2").widget2(); 

       // make these bindings available immediately as well. 
       self.rebindable(); 
      }); 
     }); 
    }, 

    // I use jQuery UI Dialog extensively as a window manager, and each dialog is loaded 
    // via an AJAX request. I'll call this method after each AJAX request to 
    // rebind some key widgets. 
    rebindable: function(){ 
     $("#widget3").widget3(); 
    } 
}; 

// application.index.js 
// home page specific stuff. this file is only included on the home page. 
MyApp.index = { 

    // my convention is that init is automatically called after the script 
    // is included in a page, outside of a doc.ready statement. 
    init: function(){ 
     var self = this; 

     require(['js/widget4.js'], function(){ 
      $(function(){ 
       self.widget4($("#foo")); 
      }); 
     }); 
    }, 

    // passing elements to each method allows me to call this init code 
    // outside of the index page. I can require() this file, and only init 
    // widget4, and even use a different element. 
    widget4: function(element){ 
     var config = { 
      something: "custom to the home page" 
     }; 

     element.widget4(config); 
    } 
}; 


// application.foo.js 
// page "foo" stuff 
MyApp.foo = { 

    init: function(){ 
     var self = this; 

     // this page happens to use the same widget3 and configuration present 
     // in MyApp.index. this is where things can get sloppy and unmaintainable 
     // really quickly. 
     require(['js/application.index.js'], function(){ 
      $(function(){ 
       MyApp.index.widget3($("#bar")); 
      }); 
     }); 

     // page "foo" has three subpages (or actions) and require 
     // their own logic. url convention: /foo/subpage1/ 
     // init whichever page we're on... 
     switch(self.querystring.subpage){ 
      case "subpage1": 
       self.subpage1.init(); 
       break; 
      case "subpage2": 
       self.subpage2.init(); 
       break; 
      case "subpage3": 
       self.subpage3.init(); 
       break; 
     } 
    }, 

    subpage1: function(){ 
     init: function(){ 
      var self = this; 

      // once the DOM is ready init dialog. 
      $(function(){ 
       self.dialog($("#openDialog")); 
      }); 
     }, 

     dialog: function(element){ 
      element.bind("click", function(){ 
       $('<div></div>').dialog({ 
        open: function(){ 

         // see what i'm doing here? 
         MyApp.rebindable(); 

         // maybe more bindings specific to this 
         // dialog here 
        } 
       }); 
      }); 
     } 
    }, 

    subpage2: function(){ 
     init: function(){ 
     } 
    }, 

    subpage3: function(){ 
     init: function(){ 
     } 
    } 
}; 
+1

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

+0

(जारी) आपकी विधि एक अच्छी शुरुआत है, लेकिन मैं देख सकता हूं कि यह कहां से असंभव हो सकता है। हो सकता है कि आप पृष्ठों और नियंत्रणों को कॉन्फ़िगर करने के लिए एक विधि तैयार कर सकें ताकि आपको कई स्विच स्टेटमेंट्स का उपयोग न करना पड़े। आप यह देखने के लिए क्लेपूल (http: // http: //www.claypooljs.com/) भी देख सकते हैं कि इससे मदद मिल सकती है या नहीं। – Silkster

+1

@ सिल्कस्टर लिंक टूटा हुआ है: http: //http//www.claypooljs.com/ –

उत्तर

12

मुझे अपने प्रश्नों के समाधान के लिए, कृपया मुझे JavaScriptMVC की सुविधाओं के बारे में एक छोटे से बात की अनुमति देते हैं:

नियंत्रक अपने jQuery विगेट्स में सुधार होगा, सेटअप/टियरडाउन, तानाना की देखभाल।

देखें क्लाइंट साइड टेम्पलेट्स को जोड़ता है जिसे आपके ऐप में बनाया जा सकता है।

मॉडल यदि आपका सर्वर बदलता है तो जेएस परिवर्तन को कम करने और स्थानीयकरण करने के लिए सेवा/डेटा परत को सारणीकृत करता है।

Steal निर्भरता प्रबंधन, संपीड़न और कोड सफाई करता है। यह आपकी सभी स्क्रिप्ट्स को आपके सभी पृष्ठों पर भी ले जाएगा, साझा निर्भरताओं को समझें, और स्क्रिप्ट को इष्टतम पेलोड में जोड़ दें।

FuncUnit आपके ऐप्स को जितना संभव हो सके परीक्षण करना आसान बनाता है।

DocumentJS ... अच्छी तरह से ... दस्तावेज अपने कोड

अब आप अपने विशिष्ट प्रश्न पर:

कई स्थानों में इस्तेमाल किया तर्क के साथ कैसे निपटने के लिए?

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

तुम कैसे संभव के रूप में छोटा होना चाहिए पेज विशिष्ट कोड

पृष्ठ विशिष्ट कोड का आयोजन करते हैं। इसमें आम तौर पर निर्भरता लोडिंग और "मेनकंट्रोलर" शामिल होता है। वह मुख्य नियंत्रक पृष्ठ को उस पृष्ठ की कार्यात्मक/व्यावसायिक आवश्यकताओं का पालन करने के लिए कॉन्फ़िगर करता है। कैसे आप एक ही पैटर्न

खैर लेखन रोक कर, मैं एक रूपरेखा के विकास के लिए स्थिर पैटर्न है कि उपयोग करने का सुझाव

App.Controllers.Main 

: यह आमतौर पर की तरह कुछ के रूप में namespaced है। साथ ही, अपने मॉड्यूल/प्लगइन्स/विजेट को जितना संभव हो सके छोटे (और टेस्टेबल) रखें। इससे इन हिस्सों को बदलने की संभावना कम हो जाएगी।

अंत में ....

के बीच अपने सबसे बड़े संघर्ष तनाव ऐसा लगता है:

  • साझा कार्यक्षमता
  • एकाधिक पृष्ठों
  • समय पर लोड समय

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

RequJS अधिक लचीला है, लेकिन आपको बहुत सारी फाइलें लोड करने जा रही हैं। न केवल यह धीमा होगा, यह आपको बहुत बड़ी जेएस फाइलें बनाने शुरू करने जा रहा है जो बहुत व्यवस्थित नहीं हैं।

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

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

+2

स्पष्टीकरण के लिए: RequJS मई विकास के दौरान अलग-अलग फाइलों को लोड करें, लेकिन इसमें एक ऑप्टिमाइज़ेशन टूल (http://requirejs.org/docs/optimization.html) है जो आपको HTTP मॉड्यूल के एक छोटे सेट में अपने मॉड्यूल को अनुकूलित/समूह करने की अनुमति देता है। ऑप्टिमाइज़ेशन टूल का उपयोग देव में भी किया जा सकता है, इसमें केवल कुछ मॉड्यूल को बाहर करने का एक तरीका है जिसे आप स्वयं डिबग करना चाहते हैं। – jrburke

+0

हाँ, यह मेरी गलती थी। RequJS सभी स्क्रिप्ट को गठबंधन कर सकता है। लेकिन मुझे नहीं लगता कि यह कई परियोजनाओं के बीच चोरी का स्वचालित तोड़ सकता है। –

+0

"वह मुख्य नियंत्रक पृष्ठ को उस पृष्ठ की कार्यात्मक/व्यावसायिक आवश्यकताओं का पालन करने के लिए कॉन्फ़िगर करता है।" तो कंट्रोलर यहां तर्क का मुख्य चालक है, सर्वर सर्वर प्रोग्रामिंग के विपरीत जहां व्यापार तर्क को मॉडल में रखा जाना प्रोत्साहित किया जाता है? –

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