2011-12-22 11 views
14

मैं अपना पहला (गैर-स्पेगेटी) बड़ा जावास्क्रिप्ट एप्लिकेशन बना रहा हूं। जबकि RequireJS की शुरूआत और जावास्क्रिप्ट के लिए अन्य निर्भरता प्रबंधन ढांचे को फ़ाइलों को विभाजित करना आसान बनाता है, मैं अस्पष्ट हूं कि उत्पादन के लिए बड़े कोड बेस को कैसे दबाया जाए। मैं क्या चाहता हूं कि Ready.js और UglifyJS जैसे कुछ का उपयोग करके उत्पादन के लिए अपने जावाकैंक को एकत्रित और छोटा करने का तरीका है। या कुछ अन्य दृष्टिकोण, अगर यह समझ में आता है।विकास और उत्पादन में जावास्क्रिप्ट अनुप्रयोगों को कैसे व्यवस्थित करें

उत्पादन में बड़े जावास्क्रिप्ट ऐप्स के साथ डेवलपर कैसे विकास और उत्पादन में अपनी संरचना को संभालते हैं?

उदाहरण के लिए, मैं विकास में RequJS का उपयोग कर सकता हूं और फिर कुल/न्यूनतम करने के लिए तैयार/उलझन का उपयोग कर सकता हूं। लेकिन फिर मेरे कोड में बिखरे हुए require()'s बिखरे हुए होंगे। मुझे यकीन है कि एक बेहतर दृष्टिकोण है।

मैं इन फ़ाइलों के भीतर jQuery सहित भी उलझन में हूं। क्या मुझे अपनी अलग-अलग $(document).ready(function(){...}) के भीतर प्रत्येक अलग-अलग jQuery फ़ाइल (उदाहरण के लिए बैकबोन दृश्य जो jQuery का उपयोग करते हैं) को लपेटना चाहिए? यह बहुत ही सूखा लगता है।

+2

+1 पहली बार गैर-स्पेगेटी जावास्क्रिप्ट करने के लिए प्रवेश करने के लिए +1। बहुत से देवताओं के लिए बहुत लंबे समय तक इनकार करने के लिए रहते हैं :) –

उत्तर

2

आप RequireJS optimizer का उपयोग कर सकते हैं। आवश्यकता संकुचित अनुप्रयोग में भी व्यर्थ नहीं है, क्योंकि आपको हमेशा मॉड्यूल का संदर्भ प्राप्त करना होगा। अनुकूलक डॉक्स का यह भी कहना है कि यह एक मॉड्यूल है कि एक चर के साथ की तरह

var mods = someCondition ? ['a', 'b'], ['c', 'd']; 
require(mods); 

मुझे लगता है कि RequireJS इंतजार करना चाहिए जब तक DOM तैयार होने और सभी मॉड्यूल लोड हो जाने पर लोड किया गया है शामिल नहीं किया जाएगा, ताकि आप हर फाइल को लपेटने की जरूरत नहीं है।

उसने कहा, मेरा पसंदीदा पैकेज प्रबंधक अभी भी StealJS है। यह एक उत्पादन निर्माण में अनावश्यक कॉल निकाल सकता है और एक मॉड्यूल हमेशा एक बंद होने में समाहित होता है जो jQuery ऑब्जेक्ट पास हो जाता है और डोम तैयार होने तक प्रतीक्षा करता है और सभी स्क्रिप्ट लोड हो जाती हैं। दुर्भाग्यवश यह कॉमनजेएस मॉड्यूल विनिर्देशों के साथ अभी तक संगत नहीं है।

+0

यह शानदार है। StealJS अच्छा लग रहा है, लेकिन मुझे आवश्यकता है कि Requजेएस क्या कर सकते हैं। अगर आपको साझा करना बुरा लगेगा, तो मुझे आपकी पूरी बिल्ड प्रक्रिया के बारे में और जानना अच्छा लगेगा। आपके तैनाती चरण में आप अपना अनुकूलक कहां चलाते हैं? क्या आप इसके साथ परीक्षण कर रहे हैं? क्या आप अनुकूलित जेएस का परीक्षण करते हैं? मैं इसे किसी अन्य प्रश्न में पूछ सकता हूं, लेकिन मेरे पास बंद होने वाले प्रश्नों के "सर्वोत्तम प्रथाओं" प्रकारों का बुरा इतिहास है। –

+0

भले ही यह अपने आप पर बहुत अच्छा चलता है, स्टीलजेएस जावास्क्रिप्ट एमवीसी फ्रेमवर्क (http://javascriptmvc.com/) का हिस्सा है, जो मैं अपने अनुप्रयोगों की संरचना, निर्माण और परीक्षण के लिए उपयोग करता हूं और इन सभी चीजों का ख्याल रखता हूं अपने आप से बहुत कुछ (और जावास्क्रिप्ट के लिए एकमात्र पूरी तरह से निहित समाधान है)। – Daff

1

मुझे मिला है YUI Builder मेरे लिए अच्छा काम करता है। मुझे यकीन नहीं है कि यदि आप यूयूआई 3 का उपयोग नहीं कर रहे हैं तो यह कितना उपयोगी है, लेकिन एक अच्छा मौका है कि आप इसे अपनी आवश्यकताओं के अनुरूप कर सकते हैं।

दूसरी ओर, क्या आपने RequireJS Optimizer पर एक नज़र डाली है?

document.ready हैंडलिंग के संबंध में; मुझे लगता है कि मॉड्यूल में कोड को शुरू करने या कॉल करने तक कुछ भी करने का अच्छा अभ्यास नहीं है। तो मेरे पास पृष्ठ के निचले हिस्से में <script> टैग में एक ही $(document).ready() होगा, जो उस पृष्ठ पर आवश्यक मॉड्यूल "एक साथ" गोंद करता है।

0

विरोधी स्पेगेटी रास्ता

प्रभावी रूप से विकसित करने के लिए और आसानी से बनाए रखने के लिए JavaScript आवेदन, के रूप में तदर्थ स्क्रिप्ट या subpar अपारदर्शी स्वचालन के एक नंबर के लिए विरोध किया, तो आप native Qooxdoo application उपयोग कर सकते हैं। यह बहुत अधिक लेखन के बिना Qooxdoo कवर करने के लिए असंभव है, लेकिन मूल एप्लिकेशन के मामले में (सी या जावा के साथ अवधि को भ्रमित नहीं है, Qooxdoo जावास्क्रिप्ट शुद्ध है) के रूप में वर्णित है:

अनुप्रयोगों के लिए कस्टम HTML का उपयोग कर/Qooxdoo की विजेट परत के बजाय सीएसएस-आधारित जीयूआई।

इस प्रकार ऐसा एप्लिकेशन किसी भी Qooxdoo UI परतों का उपयोग नहीं करता है, लेकिन केवल कोड संरचना सुविधाएं और निर्माण उपकरण। कक्षाओं में आयोजित क्यूओक्सडू में कोड, जावा में प्रति फ़ाइल एक। मैं इस तरह दिख सकता हूं:

/** 
* @use(website.library.MosaicFlow) 
*/ 
qx.Class.define('website.controller.Gallery', { 

    extend : website.controller.Abstract, 

    members : { 

    _baseUrl : 'https://picasaweb.google.com/data/feed/api', 


    _render : function(photos) 
    { 
     q('.preloader').remove(); 

     q.template.get('gallery-template', {'photos': photos}).appendTo('#gallery-container'); 
     var gallery = window.jQuery('#gallery-container .gallery').mosaicflow({ 
     'minItemWidth' : 256, 
     'itemSelector' : '.photo', 
     'autoCalculation' : false 
     }); 
     gallery.trigger('resize'); 
    }, 

    _convert : function(item, index) 
    { 
     try 
     { 
     return { 
      'url'  : item.content.src, 
      'summary' : item.summary.$t, 
      'thumb' : item.media$group.media$thumbnail[0] 
     }; 
     } 
     catch(ex) 
     { 
     this.debug('failed to convert', index, item); 
     return null; 
     } 
    }, 

    _onLoadSuccess : function(event) 
    { 
     var request = event.getTarget(); 
     var response = request.getResponse(); 
     if(!qx.lang.Type.isObject(response) || !('feed' in response)) 
     { 
     request.debug('Malformed response received'); 
     } 
     else 
     { 
     this._render(response.feed.entry.map(this._convert, this).filter(function(item) 
     { 
      return !!item; 
     })); 
     } 
    }, 

    _onLoadFail : function() 
    { 
     this.debug('Picasa search failed'); 
    }, 

    main : function() 
    { 
     var query = /^\/gallery\/(\w+)$/.exec(window.location.pathname); 
     var request = new qx.io.request.Jsonp(qx.lang.String.format('%1/all', [this._baseUrl])); 
     request.setRequestData({ 
     'q'   : query[1], 
     'thumbsize' : 300, 
     'max-results' : 20, 
     'alt'   : 'json' 
     }); 
     request.setTimeout(16000); 
     request.setCache(false); 
     request.addListener('fail', this._onLoadFail, this); 
     request.addListener('success', this._onLoadSuccess, this); 
     request.send(); 
    } 

    } 

}); 

क्यूओक्सडू ऑब्जेक्ट मॉडल दोनों दुनिया का लाभ उठाता है। जावा में परिपक्व प्लेटफार्मों के गुण हैं, साथ ही यह आधुनिक और गतिशील है, कक्षाएं, विरासत, इंटरफेस, मिक्सिन्स, घटनाएं, गुण, डेटा-बाध्यकारी और बहुत कुछ प्रदान करता है। चूंकि प्रत्येक वर्ग का एक परिभाषित नाम होता है और नामस्थान पेड़ में स्थित होता है, इसलिए क्यूओक्सडू जनरेटर इसका लाभ उठा सकता है। यह आपके वर्गों को पार करता है और उनके वाक्यविन्यास पेड़ बनाता है। फिर यह निर्भरताओं को हल करता है। अर्थात। जब आप किसी अन्य वर्ग को संदर्भित करते हैं, जैसे website.controller.Abstract। यह निर्भरता ग्राफ की ओर जाता है, जिसका उपयोग उचित क्रम में लिपियों को लोड करने के लिए किया जाता है। ध्यान दें, यह सब एक डेवलपर के लिए स्वचालित और पारदर्शी है, और फाइलें लोड की गई हैं। कॉमनजेएस के मामले में कोई प्रस्ताव नहीं है, एएमडी के साथ कोड को लपेटने के लिए कोई बदसूरत बॉयलरप्लेट नहीं है।

जैसा कि आप ऊपर उदाहरण में देख सकते हैं बाहरी गैर-क्यूओक्सडू पुस्तकालयों से निपटना संभव है। बिल्डिंग प्रक्रिया में शामिल करने के लिए आपको लाइब्रेरी के लिए डमी रैपर लिखने की आवश्यकता हो सकती है।

विकास और उत्पादन वातावरण

आप (निर्माण की आवश्यकता केवल नए निर्भरता कोड में शुरू की है) तथाकथित स्रोत लक्ष्य के साथ अपने एप्लिकेशन बनाने का विकास। आपकी एप्लिकेशन फ़ाइलों को निर्भरता क्रम में लोड किया जाता है, एक-एक करके। फ्रेमवर्क फ़ाइलों को एक-एक करके लोड किया जा सकता है, या जो बेहतर विकल्प है, कई बड़े हिस्सों में बनाया गया है। उत्पादन वातावरण में आपका आवेदन कोड बिल्ड लक्ष्य के साथ बनाया गया है। आपके पास एकल आउटपुट फ़ाइल बनाने का विकल्प है, या आंशिक बिल्ड है, जहां बड़ी फ़ाइलों में कोड छिड़काया जाता है (आप उनके आकार को नियंत्रित कर सकते हैं)। आंशिक निर्माण इस (अनुकूलित/Gzipped) की तरह लग रहे हो सकता है:

├── [127/64kB] website.f6ffa57fc541.js 
├── [100/33kB] website.f86294b58d1a.js 
└── [361/110kB] website.js 

ध्यान दें कि भागों पृष्ठों है कि उन्हें आवश्यकता होती है पर मांग पर लोड किए गए हैं।

http://example.com/ 
└── website.js 
http://example.com/article 
└── website.js 
http://example.com/form 
└── website.js 
    └── website.f86294b58d1a.js 
http://example.com/gallery 
└── website.js 
    └── website.f6ffa57fc541.js 
http://example.com/geo 
└── website.js 

क्योंकि Qooxdoo पूर्ण विकसित वेबसाइट अभी तक बनाता है, लेकिन केवल देशी आवेदन प्रकार का एक मंच प्रदान कर रहा है लक्षित नहीं करता है, तो आप, बूटस्ट्रैपिंग, यूआरएल मार्ग की तरह आवेदन और कुछ मूल बातें करने के लिए प्रवेश, कोड की जरूरत आदि। मैंने इसे qooxdoo-website-skeleton के साथ संबोधित करने का प्रयास किया, जो ऊपर दिए गए उदाहरण हैं। आप इसका इस्तेमाल करने के लिए स्वतंत्र हैं, या अपना खुद का लिखें।

अंत में ध्यान दें कि औसत जावास्क्रिप्ट लाइब्रेरी के साथ शुरू करना उतना आसान नहीं हो सकता है, लेकिन जटिलता अंतिम लाभ के आनुपातिक है।

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

  • कोई संबंधित समस्या नहीं^_^