JQuery / जावास्क्रिप्ट कोड (2013) को व्यवस्थित करने का सबसे अच्छा तरीका [बंद]


104

समस्या

यह उत्तर पहले भी दिया जा चुका है, लेकिन पुराना है और पुराना नहीं है। मेरे पास एक एकल फ़ाइल में कोड की 2000 से अधिक लाइनें हैं, और जैसा कि हम सभी जानते हैं कि यह बुरा अभ्यास है, खासकर जब मैं कोड के माध्यम से देख रहा हूं या नई सुविधाएँ जोड़ रहा हूं। मैं अपने कोड को अभी और भविष्य के लिए बेहतर व्यवस्थित करना चाहता हूं।

मुझे यह उल्लेख करना चाहिए कि मैं बहुत सारे बटन, यूआई तत्वों, ड्रैग, ड्रॉप्स, एक्शन श्रोताओं / हैंडलर्स के साथ एक टूल (एक साधारण वेबसाइट नहीं) बना रहा हूं और वैश्विक दायरे में कार्य करता हूं जहां कई श्रोता एक ही फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण कोड

$('#button1').on('click', function(e){
    // Determined action.
    update_html();
});

... // Around 75 more of this

function update_html(){ .... }

...

अधिक उदाहरण कोड

निष्कर्ष

मुझे वास्तव में सर्वश्रेष्ठ उपयोग के लिए इस कोड को व्यवस्थित करने की आवश्यकता है न कि खुद को दोहराने और नई सुविधाओं को जोड़ने और पुराने को अपडेट करने में सक्षम होने के लिए। मैं खुद इस पर काम करूंगा। कुछ चयनकर्ता कोड दूसरों की 100 पंक्तियाँ हो सकते हैं। 1. मैंने थोड़ा सा देखा है require.jsऔर यह थोड़े दोहराए हुए पाया है, और वास्तव में आवश्यकता से अधिक कोड लिख रहा है। मैं किसी भी संभावित समाधान के लिए खुला हूं जो इस मानदंड को फिट करता है और संसाधन / उदाहरणों के लिए लिंक हमेशा एक प्लस होता है।

धन्यवाद।


यदि आप backbone.js और आवश्यकता जोड़ना चाहते हैं। तो यह बहुत काम आएगा।
jantimon

1
इसे लिखते समय आप अपने आप को किन कार्यों में पाते हैं?
माइक सैमुअल

4
क्या आपने codereview.stackexchange.com का दौरा किया है ?
एंटनी

4
कोणीय जानें! यह भविष्य है।
ओनुर येल्ड्रिम्म

2
आपका कोड किसी बाहरी लिंक पर नहीं होना चाहिए, यह यहां होना चाहिए। इसके अलावा, @codereview कई प्रकार के प्रश्नों के लिए एक बेहतर जगह है।
जॉर्ज स्टॉकर

जवाबों:


98

मैं कुछ सरल चीजों पर जाऊंगा जो आपकी मदद कर सकती हैं या नहीं। कुछ स्पष्ट हो सकते हैं, कुछ अत्यंत रहस्यमय हो सकते हैं।

चरण 1: अपने कोड को कंपार्टमेंटलाइज़ करें

अपने कोड को कई में अलग करना, मॉड्यूलर यूनिट एक बहुत अच्छा पहला कदम है। राउंड अप करें कि "एक साथ" क्या काम करता है और उन्हें अपनी छोटी सी संलग्न इकाई में डाल दिया। अब के लिए प्रारूप के बारे में चिंता मत करो, इसे इनलाइन रखें। संरचना एक बाद का बिंदु है।

तो, मान लीजिए कि आपके पास इस तरह का एक पेज है:

यहां छवि विवरण दर्ज करें

यह समझने के लिए समझ में आता है कि सभी हेडर से संबंधित इवेंट हैंडलर / बाइंडर रखरखाव में आसानी के लिए हैं (और 1000 लाइनों के माध्यम से झारना नहीं है)।

फिर आप अपने जेएस को एक यूनिट में फिर से बनाने के लिए ग्रंट जैसे टूल का उपयोग कर सकते हैं।

चरण 1 ए: निर्भरता प्रबंधन

एएमडीजे या कॉमनजेस जैसे पुस्तकालय का उपयोग करें जिसे एएमडी नामक कुछ को लागू करना है । एसिंक्रोनस मॉड्यूल लोड करने से आपको यह पता लगाने की अनुमति मिलती है कि आपका कोड क्या निर्भर करता है, जो तब आपको लाइब्रेरी-कॉलिंग को कोड में लोड करने की अनुमति देता है। आप बस शाब्दिक रूप से कह सकते हैं "यह jQuery की जरूरत है" और AMD इसे लोड करेगा, और jQuery उपलब्ध होने पर अपने कोड को निष्पादित करेगा ।

इसमें एक छिपा हुआ मणि भी है: लाइब्रेरी लोडिंग दूसरा किया जाएगा जो डोम तैयार है, पहले नहीं। यह अब आपके पेज के लोड-अप को रोक नहीं सकता है!

चरण 2: मॉड्यूलर करें

वायरफ्रेम देखें? मेरी दो विज्ञापन इकाइयाँ हैं। वे सबसे अधिक संभावना घटना श्रोताओं को साझा करेंगे।

इस चरण में आपका काम अपने कोड में पुनरावृत्ति के बिंदुओं की पहचान करना और इन सभी को मॉड्यूल में संश्लेषित करने का प्रयास करना है । मॉड्यूल, अभी, सब कुछ शामिल होगा। हम साथ जाते ही सामान अलग कर देंगे।

इस चरण का पूरा विचार चरण 1 से जाना है और सभी कॉपी-पास्ट को हटाना है, उन्हें उन इकाइयों के साथ बदलना है जो शिथिल युग्मित हैं। इसलिए, होने के बजाय:

ad_unit1.js

 $("#au1").click(function() { ... });

ad_unit2.js

 $("#au2").click(function() { ... });

मेरे पास होगा:

ad_unit.js:

 var AdUnit = function(elem) {
     this.element = elem || new jQuery();
 }
 AdUnit.prototype.bindEvents = function() {
     ... Events go here
 }

page.js:

 var AUs = new AdUnit($("#au1,#au2"));
 AUs.bindEvents();

जो आपको पुनरावृत्ति से छुटकारा पाने के अलावा आपकी घटनाओं और आपके मार्कअप के बीच कंपार्टमेंट करने की अनुमति देता है । यह एक बहुत ही अच्छा कदम है और हम इसे बाद में आगे बढ़ाएंगे।

चरण 3: एक रूपरेखा चुनें!

यदि आप आगे भी पुनरावृत्तियों को संशोधित और कम करना चाहते हैं, तो एमवीसी (मॉडल - व्यू - कंट्रोलर) दृष्टिकोणों को लागू करने वाले भयानक रूपरेखाओं का एक समूह है। मेरा पसंदीदा बैकबोन / स्पाइन है, हालांकि, एंगुलर, वाईआईआई भी है ... सूची जारी होती है।

एक मॉडल आपके डेटा का प्रतिनिधित्व करता है।

एक दृश्य आपके मार्क-अप और उससे जुड़ी सभी घटनाओं का प्रतिनिधित्व करता है

एक नियंत्रक आपके व्यावसायिक तर्क का प्रतिनिधित्व करता है - दूसरे शब्दों में, नियंत्रक पृष्ठ को बताता है कि लोड करने के लिए क्या विचार हैं और कौन से मॉडल का उपयोग करना है।

यह एक महत्वपूर्ण शिक्षण कदम होगा, लेकिन पुरस्कार इसके लायक है: यह स्पेगेटी पर स्वच्छ, मॉड्यूलर कोड का पक्षधर है।

आपके द्वारा किए जा सकने वाले अन्य बहुत सारे काम हैं, वे सिर्फ दिशा-निर्देश और विचार हैं।

कोड-विशिष्ट परिवर्तन

आपके कोड में कुछ विशिष्ट सुधार यहां दिए गए हैं:

 $('.new_layer').click(function(){

    dialog("Create new layer","Enter your layer name","_input", {

            'OK' : function(){

                    var reply = $('.dialog_input').val();

                    if( reply != null && reply != "" ){

                            var name = "ln_"+reply.split(' ').join('_');
                            var parent = "";

                            if(selected_folder != "" ){
                            parent = selected_folder+" .content";
                            }

                            $R.find(".layer").clone()
                            .addClass(name).html(reply)
                            .appendTo("#layer_groups "+parent);

                            $R.find(".layers_group").clone()
                            .addClass(name).appendTo('#canvas '+selected_folder);

            }

        }

    });
 });

यह बेहतर लिखा है:

$("body").on("click",".new_layer", function() {
    dialog("Create new layer", "Enter your layer name", "_input", {
         OK: function() {
             // There must be a way to get the input from here using this, if it is a standard library. If you wrote your own, make the value retrievable using something other than a class selector (horrible performance + scoping +multiple instance issues)

             // This is where the view comes into play. Instead of cloning, bind the rendering into a JS prototype, and instantiate it. It means that you only have to modify stuff in one place, you don't risk cloning events with it, and you can test your Layer stand-alone
             var newLayer = new Layer();
             newLayer
               .setName(name)
               .bindToGroup(parent);
          }
     });
});

आपके कोड में पहले:

window.Layer = function() {
    this.instance = $("<div>");
    // Markup generated here
};
window.Layer.prototype = {
   setName: function(newName) {
   },
   bindToGroup: function(parentNode) {
   }
}

अचानक, आपके पास कॉपी पेस्ट किए बिना अपने कोड में कहीं से भी एक मानक परत बनाने का एक तरीका है। आप इसे पांच अलग-अलग जगहों पर कर रहे हैं। मैंने अभी आपको पांच कॉपी-पेस्ट किए हैं।

एक और:

// कार्यों के लिए नियम आवरण

var PageElements = function(ruleSet) {
ruleSet = ruleSet || [];
this.rules = [];
for (var i = 0; i < ruleSet.length; i++) {
    if (ruleSet[i].target && ruleSet[i].action) {
        this.rules.push(ruleSet[i]);
    }
}
}
PageElements.prototype.run = function(elem) {
for (var i = 0; i < this.rules.length; i++) {
    this.rules[i].action.apply(elem.find(this.rules.target));
}
}

var GlobalRules = new PageElements([
{
    "target": ".draggable",
    "action": function() { this.draggable({
        cancel: "div#scrolling, .content",
        containment: "document"
        });
    }
},
{
    "target" :".resizable",
    "action": function() {
        this.resizable({
            handles: "all",
            zIndex: 0,
            containment: "document"
        });
    }
}

]);

GlobalRules.run($("body"));

// If you need to add elements later on, you can just call GlobalRules.run(yourNewElement);

नियमों को पंजीकृत करने के लिए यह एक बहुत ही शक्तिशाली तरीका है यदि आपके पास ऐसी घटनाएं हैं जो मानक नहीं हैं, या सृजन की घटनाएं नहीं हैं। पब / सब नोटिफिकेशन सिस्टम के साथ जुड़ने पर यह भी गंभीर रूप से किक-गधा है और जब भी आप एलीमेंट बनाते हैं तो आप आग लगने की घटना के लिए बाध्य होते हैं। Fire'n'forget मॉड्यूलर घटना बाध्यकारी!


2
@ जेसिका: क्यों एक ऑनलाइन उपकरण किसी भी अलग होना चाहिए? दृष्टिकोण अभी भी समान है: एक फ्रेमवर्क का उपयोग कर घटकों के बीच ढीली युग्मन को बढ़ावा देना / व्यवस्थित करना, (वे सभी इन दिनों घटना प्रतिनिधिमंडल के साथ आते हैं), अपने कोड को अलग करें। ऐसा क्या है जो वहां आपके टूल पर लागू नहीं होता है? तथ्य यह है कि आपके पास बहुत सारे बटन हैं?
सेबास्टियन रेनॉल्ड

2
@ जेसिका: अपडेट किया गया। मैंने एक अवधारणा के उपयोग से परतों के निर्माण को सरल और सुव्यवस्थित किया है View। इसलिए। यह आपके कोड पर कैसे लागू नहीं होता है?
सेबास्टियन रेनॉल्ड

10
@ जेसिका: अनुकूलन के बिना फ़ाइलों में विभाजन कबाड़ को स्टोर करने के लिए अधिक दराज खरीदने के समान है। एक दिन, आपको बाहर निकालने के लिए मिला है, और इससे पहले कि ड्रॉअर भरने से पहले इसे साफ करना आसान हो। दोनों क्यों नहीं? इस समय, आप की तरह दिखता है एक चाहता हूँ layers.js, sidebar.js, global_events.js, resources.js, files.js, dialog.jsआप बस अपने कोड को विभाजित करने जा रहे हैं। gruntउन्हें एक में पुनर्निर्माण और Google Closure Compilerसंकलन और कम करने के लिए उपयोग करें ।
सेबास्टियन रेनॉल्ड

3
आवश्यकता का उपयोग करते समय। यदि आपको वास्तव में r.js अनुकूलक के रूप में अच्छी तरह से देखना चाहिए, तो यह वास्तव में वही है जो उपयोग करने लायक है। यह गठबंधन और अपने सभी फ़ाइलों को अनुकूलित करेंगे: requirejs.org/docs/optimization.html
विलेम डी 'Haeseleer

2
@ SébastienRenauld आपके उत्तर और टिप्पणियों को अभी भी अन्य उपयोगकर्ताओं द्वारा बहुत सराहा गया है। यदि वह आपको बेहतर महसूस
करा सकता है

13

यहाँ की आवश्यकता का उपयोग करके अपने वर्तमान कोडबेस को कई फ़ाइलों में विभाजित करने का एक सरल तरीका है। मैं आपको दिखाऊंगा कि अपने कोड को दो फाइलों में कैसे विभाजित किया जाए। अधिक फ़ाइलों को जोड़ने के बाद सीधा हो जाएगा।

चरण 1) अपने कोड के शीर्ष पर, एक ऐप ऑब्जेक्ट बनाएं (या जो भी नाम आपको पसंद हो, जैसे MyGame):

var App = {}

चरण 2) अपने सभी शीर्ष-स्तरीय चर और फ़ंक्शन को ऐप ऑब्जेक्ट से संबंधित करें।

के बजाय:

var selected_layer = "";

तुम्हें चाहिए:

App.selected_layer = "";

के बजाय:

function getModified(){
...
}

तुम्हें चाहिए:

App.getModified = function() {

}

ध्यान दें कि इस बिंदु पर आपका कोड तब तक काम नहीं करेगा जब तक आप अगले चरण को पूरा नहीं करते

चरण 3) ऐप के माध्यम से जाने के लिए सभी वैश्विक चर और फ़ंक्शन संदर्भों को कनवर्ट करें।

सामान बदलें जैसे:

selected_layer = "."+classes[1];

सेवा:

App.selected_layer = "."+classes[1];

तथा:

getModified()

सेवा:

App.GetModified()

चरण 4) इस स्तर पर अपने कोड का परीक्षण करें - यह सभी काम करना चाहिए। संभवतः आपको पहली बार में कुछ त्रुटियां मिलेंगी क्योंकि आप कुछ चूक गए हैं, इसलिए आगे बढ़ने से पहले उन्हें ठीक कर लें।

चरण 5) अपेक्षित सेट करें। मुझे लगता है कि आपके पास एक वेब पेज है, जो एक वेब सर्वर से आता है, जिसका कोड इस प्रकार है:

www/page.html

और में jquery

www/js/jquery.js

अगर ये रास्ते बिल्कुल ऐसे नहीं हैं तो नीचे काम नहीं होगा और आपको पथों को संशोधित करना होगा।

अपेक्षित डाउनलोड करें और अपनी www/jsनिर्देशिका में आवश्यकताएं रखें ।

अपने में page.html, सभी स्क्रिप्ट टैग हटाएं और एक स्क्रिप्ट टैग डालें:

<script data-main="js/main" src="js/require.js"></script>

www/js/main.jsसामग्री के साथ बनाएँ :

require.config({
 "shim": {
   'jquery': { exports: '$' }
 }
})

require(['jquery', 'app']);

फिर आपके द्वारा तय किए गए सभी कोड को केवल चरण 1-3 (जिसका केवल वैश्विक चर ऐप होना चाहिए) में डालें:

www/js/app.js

उस फ़ाइल के शीर्ष पर, डालें:

require(['jquery'], function($) {

नीचे रखो:

})

फिर अपने ब्राउज़र में page.html लोड करें। आपका ऐप काम करना चाहिए!

चरण 6) एक और फ़ाइल बनाएँ

यहां वह जगह है जहां आपका काम बंद हो जाता है, आप इसे बार-बार कर सकते हैं।

www/js/app.jsउस संदर्भ $ और ऐप से कुछ कोड निकाल लें ।

जैसे

$('a').click(function() { App.foo() }

अंदर डाल दो www/js/foo.js

उस फ़ाइल के शीर्ष पर, डालें:

require(['jquery', 'app'], function($, App) {

नीचे रखो:

})

फिर www / js / main.js की अंतिम पंक्ति को इसमें बदलें:

require(['jquery', 'app', 'foo']);

बस! हर बार जब आप अपनी फ़ाइल में कोड डालना चाहते हैं, तो ऐसा करें!


इसमें कई समस्याएं हैं - स्पष्ट है कि आप अपनी सभी फाइलों को अंत में टुकड़े कर रहे हैं और प्रीप्रोसेसर का उपयोग न करके प्रति पृष्ठ लोड प्रति स्क्रिप्ट प्रत्येक उपयोगकर्ता के लिए 400 बाइट व्यर्थ डेटा को मजबूर कर रहे हैं r.js। इसके अलावा, आपने वास्तव में ओपी के मुद्दे को संबोधित नहीं किया है - केवल एक सामान्य require.jsतरीका प्रदान किया है ।
सेबास्टियन रेनॉल्ड

7
है ना? मेरा उत्तर इस प्रश्न के लिए विशिष्ट है। और r.js जाहिर तौर पर अगला कदम है लेकिन यहां मुद्दा संगठन है, अनुकूलन नहीं।
लिन हेडली

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

1
@ SébastienRenauld: यह उत्तर केवल आवश्यकता के बारे में नहीं है। यह ज्यादातर उस कोड के लिए एक नाम स्थान होने के बारे में बोलता है जिसे आप बना रहे हैं। मुझे लगता है कि आपको अच्छे हिस्सों की सराहना करनी चाहिए और एक संपादन करना चाहिए जिससे आपको इसके साथ कोई समस्या मिल सके। :)
मिथुनसथेश

10

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

मैं समझता हूं कि जिस अनुभाग पर आप काम करना चाहते हैं उसे खोजने के लिए 2000+ कोड की लाइनों को स्क्रॉल करना कष्टप्रद है। समाधान आपके कोड को अलग-अलग फ़ाइलों में विभाजित करना है, प्रत्येक कार्यक्षमता के लिए। उदाहरण के लिए sidebar.js, canvas.jsआदि। फिर आप उन्हें ग्रंट का उपयोग करके उत्पादन के लिए एक साथ जोड़ सकते हैं, साथ में यूसेमिन के साथ आप कुछ इस तरह से हो सकते हैं:

अपने HTML में:

<!-- build:js scripts/app.js -->
<script src="scripts/sidebar.js"></script>
<script src="scripts/canvas.js"></script>
<!-- endbuild -->

अपने ग्रंटफाइल में:

useminPrepare: {
  html: 'app/index.html',
  options: {
    dest: 'dist'
  }
},
usemin: {
  html: ['dist/{,*/}*.html'],
  css: ['dist/styles/{,*/}*.css'],
  options: {
    dirs: ['dist']
  }
}

यदि आप येओमान का उपयोग करना चाहते हैं तो यह आपको इस सब के लिए एक बॉयलरप्लेट कोड देगा।

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

sidebar.js

var Sidebar = (function(){
// functions and vars here are private
var init = function(){
  $("#sidebar #sortable").sortable({
            forceHelperSize: true,
            forcePlaceholderSize: true,
            revert: true,
            revert: 150,
            placeholder: "highlight panel",
            axis: "y",
            tolerance: "pointer",
            cancel: ".content"
       }).disableSelection();
  } 
  return {
   // here your can put your "public" functions
   init : init
  }
})();

फिर आप इस कोड को इस तरह से लोड कर सकते हैं:

$(document).ready(function(){
   Sidebar.init();
   ...

यह आपके कोड को फिर से लिखने के लिए बहुत अधिक अनुरक्षण कोड रखने की अनुमति देगा।


1
आप उस दूसरे-से-आखिरी स्निपेट पर गंभीरता से पुनर्विचार करना चाह सकते हैं, जो कोड इनलाइन लिखे गए कोड से बेहतर नहीं है: आपके मॉड्यूल की आवश्यकता है #sidebar #sortable। आप कोड को इनलाइन करके और दो IETFs को बचाकर अपनी मेमोरी को भी बचा सकते हैं।
सेबास्टियन रेनॉल्ड

मुद्दा यह है कि आपको जिस भी कोड की आवश्यकता है, आप उसका उपयोग कर सकते हैं। मैं सिर्फ मूल कोड से एक उदाहरण का उपयोग कर रहा हूं
जेसुअस करेरा

मैं यीशु के साथ सहमत हूं यह सिर्फ एक उदाहरण है, ओपी आसानी से एक विकल्प "ऑब्जेक्ट" जोड़ सकता है जो उन्हें हार्ड कोडिंग के बजाय तत्व के चयनकर्ता को निर्दिष्ट करने की अनुमति देगा लेकिन यह सिर्फ एक त्वरित उदाहरण था। मैं यह कहना चाहूंगा कि मुझे मॉड्यूल पैटर्न बहुत पसंद है यह प्राथमिक पैटर्न है जिसका मैं उपयोग करता हूं लेकिन यहां तक ​​कि इसके साथ ही मैं अभी भी अपने कोड को बेहतर ढंग से व्यवस्थित करने की कोशिश कर रहा हूं। मैं C # सामान्य रूप से उपयोग करता हूं इसलिए फ़ंक्शन का नामकरण और निर्माण इतना सामान्य लगता है। मैं "पैटर्न" रखने की कोशिश करता हूं जैसे अंडरस्कोर स्थानीय और निजी हैं, चर सिर्फ "ऑब्जेक्ट" हैं और फिर मैं अपने रिटर्न में फ़ंक्शन का संदर्भ देता हूं जो सार्वजनिक है।
टोनी

मैं अभी भी इस दृष्टिकोण के साथ चुनौतियों का सामना करता हूं और इसे करने का एक बेहतर तरीका चाहता हूं। लेकिन यह वैश्विक अंतरिक्ष में मेरे चर और कार्यों की घोषणा करने की तुलना में बहुत बेहतर काम करता है अन्य जेएस के साथ संघर्ष करने के लिए .... lol
टोनी

6

एक मानक तरीके से जावास्क्रिप्ट कोड को व्यवस्थित करने के लिए जावास्क्रिप्ट MVC फ्रेमवर्क का उपयोग करें।

सर्वोत्तम जावास्क्रिप्ट MVC फ्रेमवर्क उपलब्ध हैं:

एक जावास्क्रिप्ट एमवीसी ढांचे का चयन करने पर विचार करने के लिए कई कारकों की आवश्यकता होती है। निम्नलिखित तुलना लेख पढ़ें जो आपको अपनी परियोजना के लिए महत्वपूर्ण कारकों के आधार पर सर्वोत्तम रूपरेखा का चयन करने में मदद करेंगे: http://sporto.github.io/blog/2013/04/12/comparison-angular-backbone-can-ember/

तुम भी उपयोग कर सकते हैं RequireJS ढांचे के साथ Asynchrounous js फ़ाइल और मॉड्यूल लोड हो रहा है समर्थन करने के लिए।
JS मॉड्यूल लोडिंग शुरू करने के लिए नीचे देखें:
http://www.sitepoint.com/understand-requirejs-for-effective-javascript-module-loading/


4

अपने कोड को वर्गीकृत करें। यह विधि मुझे बहुत मदद कर रही है और किसी भी js ढांचे के साथ काम करती है:

(function(){//HEADER: menu
    //your code for your header
})();
(function(){//HEADER: location bar
    //your code for your location
})();
(function(){//FOOTER
    //your code for your footer
})();
(function(){//PANEL: interactive links. e.g:
    var crr = null;
    $('::section.panel a').addEvent('click', function(E){
        if ( crr) {
            crr.hide();
        }
        crr = this.show();
    });
})();

आपके पसंदीदा संपादक में (सबसे अच्छा कोमोडो एडिट है) आप सभी प्रविष्टियों को ध्वस्त कर सकते हैं और आप केवल शीर्षक देखेंगे:

(function(){//HEADER: menu_____________________________________
(function(){//HEADER: location bar_____________________________
(function(){//FOOTER___________________________________________
(function(){//PANEL: interactive links. e.g:___________________

2
+1 मानक जेएस समाधान के लिए जो पुस्तकालयों पर निर्भर नहीं करता है।
hobberwickey

-1 कई कारणों से। आपका कोड समकक्ष ओपी के ... + एक IETF प्रति "अनुभाग" के समान है। इसके अलावा, आप मॉड्यूल डेवलपर्स को उन की निर्माण / निष्कासन को ओवरराइड करने या व्यवहार का विस्तार करने की अनुमति के बिना अत्यधिक व्यापक चयनकर्ताओं का उपयोग कर रहे हैं। अंत में, IETF मुक्त नहीं हैं।
सेबास्टियन रेनॉल्ड

@hobberwickey: आप के बारे में नहीं जानते, लेकिन मैं इस बात पर भरोसा करना चाहता हूं कि यह समुदाय द्वारा संचालित है और जहां कीड़े जल्दी से पाए जा सकते हैं। खासकर अगर ऐसा करने से मुझे पहिया को फिर से आविष्कार करने की निंदा करता है।
सेबास्टियन रेनॉल्ड

2
यह सब कर रहा है असतत वर्गों में कोड का आयोजन। पिछली बार मैंने जाँच की थी कि ए: अच्छा अभ्यास, और बी: ऐसा कुछ नहीं है जिसके लिए आपको वास्तव में एक समुदाय समर्थित पुस्तकालय की आवश्यकता हो। सभी परियोजनाएं बैकबोन, कोणीय इत्यादि में फिट नहीं होती हैं और कार्यों में इसे लपेटकर कोड को संशोधित करना एक अच्छा सामान्य समाधान है।
hobberwickey

यह कभी भी संभव है कि आप इस दृष्टिकोण का उपयोग करने के लिए किसी भी पसंदीदा पुस्तकालय पर भरोसा करना चाहते हैं। लेकिन उपरोक्त समाधान शुद्ध जावास्क्रिप्ट, कस्टम लाइब्रेरी या किसी प्रसिद्ध js फ्रेमवर्क के साथ काम करता है

3

मै सुझाव दूंगा:

  1. इवेंट मैनेजमेंट के लिए प्रकाशक / ग्राहक पैटर्न।
  2. वस्तु अभिविन्यास
  3. नेमस्पेसिंग

अपने मामले में जेसिका, इंटरफ़ेस को पृष्ठों या स्क्रीन में विभाजित करें। पृष्ठ या स्क्रीन ऑब्जेक्ट हो सकते हैं और कुछ मूल कक्षाओं से बढ़ाए जा सकते हैं। PageManager वर्ग वाले पृष्ठों के बीच इंटरैक्शन प्रबंधित करें।


क्या आप इस पर उदाहरण / संसाधनों के साथ विस्तार कर सकते हैं?
किविलियस

1
"वस्तु अभिविन्यास" से आपका क्या अभिप्राय है? जे एस में लगभग सब कुछ है एक वस्तु। और JS में कोई क्लास नहीं हैं।
बर्गी

2

मेरा सुझाव है कि आप बैकबोन जैसी किसी चीज़ का उपयोग करें। Backbone एक RESTFUL समर्थित जावास्क्रिप्ट लाइब्रेरी है। इक आपके कोड क्लीनर और अधिक पठनीय बनाता है और आवश्यकता पड़ने पर एक साथ उपयोग करने पर शक्तिशाली होता है।

http://backbonejs.org/

http://requirejs.org/

बैकबोन एक वास्तविक पुस्तकालय नहीं है। यह आपके जावास्क्रिप्ट कोड को संरचना देने के लिए है। यह अन्य पुस्तकालयों जैसे jquery, jquery-ui, google-map आदि को शामिल करने में सक्षम है। Backbone मेरी राय में ऑब्जेक्ट ओरिएंटेड और मॉडल व्यू कंट्रोलर संरचनाओं के सबसे नज़दीकी जावास्क्रिप्ट दृष्टिकोण है।

अपने वर्कफ़्लो के बारे में भी .. यदि आप PHP में अपने एप्लिकेशन का निर्माण करते हैं तो लारवेल लाइब्रेरी का उपयोग करें। Restfull सिद्धांत के साथ उपयोग किए जाने पर यह Backbone के साथ त्रुटिपूर्ण काम करेगा। Laravel फ्रेमवर्क के लिंक के नीचे और RESTfull APIs के निर्माण के बारे में एक ट्यूटोरियल:

http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/

http://laravel.com/

नीचे nettuts से एक ट्यूटोरियल है। Nettuts में बहुत सारे उच्च गुणवत्ता वाले ट्यूटोरियल हैं:

http://net.tutsplus.com/tutorials/javascript-ajax/understanding-backbone-js-and-the-server/


0

हो सकता है कि आप के लिए अपने समय के एक पूरे के विकास को लागू करने कार्यप्रवाह Yeoman के रूप में इस तरह के उपकरणों का उपयोग शुरू http://yeoman.io/ । यह आपकी सभी निर्भरता को नियंत्रित करने, निर्माण प्रक्रिया और यदि आप चाहते हैं, तो स्वचालित परीक्षण में मदद करेंगे। इसके बहुत से काम शुरू होने हैं लेकिन एक बार लागू होने के बाद भविष्य में बदलाव बहुत आसान हो जाएगा।

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