2012-12-18 9 views
7

मैं एक मौजूदा requireJS परियोजना जो पहले से ही knockoutJS का उपयोग करता है में breezeJS को एकीकृत कर रहा हूँ। मैं कुछ समस्याओं में भाग गया।BreezeJS और RequireJS काम नहीं कर के रूप में की उम्मीद

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

दूसरा मुद्दा यह है कि breezeJS नॉकआउट लोड करने में असमर्थ है। मेरी main.js में मैं एक पथ को परिभाषित किया है नॉकआउट होने के लिए:

knockout: '../libs/knockout/knockout-2.2.0',

(मैं यह कर, क्योंकि मुझे यकीन है कि के लिए जानते हुए भी कि मैं एक वैश्विक ko तक पहुँचने नहीं कर रहा हूँ की तरह)

हालांकि जब मैं मेरी परियोजना में जोड़ा हवा, हवा मेरी नॉकआउट पुस्तकालय लोड करने में सक्षम नहीं था। हवा कोड में देखकर मैं देख सकता हूं कि इसे नॉकआउट लाइब्रेरी को ko के रूप में लोड करने के लिए हार्डकोड किया गया है।

मेरे सभी कोड को बदलने की इच्छा नहीं है, मैंने पाया कि मैं अपनी एएमडी लोड नॉकआउट लाइब्रेरी को वैश्विक विंडो ऑब्जेक्ट में window['ko'] के रूप में जोड़ सकता हूं। लेकिन यह काफी बोझ की तरह लगता है। इसके अलावा निराले ढंग से क्यू इस तरह से जोड़ने और हटाने के <script> टैग काम नहीं किया, के रूप में मुझे लगता है कि क्यू भी आवेदन के जीवन चक्र के शुरू में आवश्यक है, पहले भी मैं वैश्विक अपवित्र करने के लिए मिल - मैं घोंसला किया main.js में मेरी require() कॉल लेकिन यह है कि निर्माण प्रक्रिया से मेरी अधिकांश आवेदन फ़ाइलों को छुपाया, इसलिए मैंने उस दृष्टिकोण को त्याग दिया।

कैसे मैं अपने प्रोजेक्ट में क्यू और नॉकआउट और हवा शामिल कर सकते हैं और अभी भी पल मैं एक अलग <script> टैग के रूप में क्यू शामिल हैं और वैश्विक अपवित्र खेलने के लिए हवा और नॉकआउट प्राप्त करने के लिए करने के लिए हो रहा है पर, एक ही पंक्ति <script> टैग का उपयोग अच्छी तरह से।

मैं अपने प्रोजेक्ट और उनमें से कोई में काफी कुछ अन्य पुस्तकालयों का उपयोग कर रहा में एकीकृत करने के लिए इस मुश्किल हो गया है।

किसी भी मदद की बहुत सराहना कर रहा है

चीयर्स

Gav

संपादित करें: यहां मेरी पूर्ण आवश्यकता कॉन्फ़िगरेशन है:

require.config({ 
    /** 
    * shims are for 3rd party libraries that have not been written in AMD format. 
    * shims define AMD modules definitions that get created at runtime. 
    */ 
    shim: { 
     'jqueryUI': { deps: ['jquery'] }, 
     'jqueryAnimateEnhanced': { deps: ['jqueryUI'] }, 
     'jqueryScrollTo': { deps: ['jquery'] }, 
     'touchPunch': { deps: ['jquery'] }, 
     //'Q': { exports: 'Q' }, 
     //'breeze': { deps: ['Q', 'knockout'], exports: 'breeze' }, 
     'path': { exports: 'Path' }, 
     //'signalR': { deps: ['jquery'] }, 
    }, 

    paths: { 
     //jquery 
     jquery: '../libs/jquery/jquery-1.7.2.min', 
     'jquery.adapter': '../libs/jquery/jquery.adapter', 

     //jquery plugins 
     horizontalNav: '../libs/jquery/plugins/horizontalNav/jquery.horizontalNav', 
     jqueryUI: '../libs/jquery/plugins/jquery-ui/jquery-ui-1.9.2.custom', 
     jqueryAnimateEnhanced: '../libs/jquery/plugins/animate-enhanced/jquery.animate-enhanced', 
     touchPunch: '../libs/jquery/plugins/touch-punch/jquery.ui.touch-punch.min', 
     //jqueryScrollTo: '../libs/jquery/plugins/jquery-scrollTo/jquery.scrollTo.min', 
     //reveal: '../libs/jquery/plugins/reveal/jquery.reveal', 
     //opentip: '../libs/jquery/plugins/opentip/opentip-jquery', 

     //RequireJS 
     domReady: '../libs/require/plugins/domReady', 
     text: '../libs/require/plugins/text', 
     async: '../libs/require/plugins/async', 
     depend: '../libs/require/plugins/depend', 
     json: '../libs/require/plugins/json', 
     noext: '../libs/require/plugins/noext', 

     //coffee-script 
     'coffee-script': '../libs/coffee/coffee-script', 
     cs: '../libs/require/plugins/cs', 

     //Path 
     path: '../libs/path/path.min', 

     //Knockout 
     knockout: '../libs/knockout/knockout-2.2.0', 
     knockoutTemplateSource: '../libs/knockout/ko.templateSource', 
     knockoutValidation: '../libs/knockout/ko.validation', 

     //breeze 
     Q: '../libs/breeze/q', 
     breeze: '../libs/breeze/breeze.debug', 

     //Signals (Observer pattern) 
     signals: '../libs/signals/signals', 

     //SignalR - Push notifications 
     signalR: '../libs/signalR/jquery.signalR-0.5.2.min', 

     //utils 
     logger: 'common/logging/logger', 
     tinycolor: '../libs/tinycolor/tinycolor', 
     composing: 'common/composition/composing', 

     //app specific 
     BaseWidgetViewModel: 'app/view/core/BaseWidgetViewModel', 

    } 
}); 
+0

उत्तर आ रहा है। मेरे पास सबसे अधिक है। एक टुकड़ा गुम है बने रहें। – Ward

उत्तर

0

आपकी आवश्यकता कॉन्फ़िगरेशन की तरह लगता है सही नहीं है। क्या आप अपनी आवश्यकता कॉन्फ़िगरेशन कोड पोस्ट कर सकते हैं? मैं उत्सुक हूँ:

keep my code down to a single script tag 

क्यों कि?

संपादित करें: अब मुझे यह मिल गया है। अभी भी लगता है कि आवश्यकता विन्यास गलत है।

+0

मैंने अपनी आवश्यकता कॉन्फ़िगरेशन जोड़ा है - बाकी सब कुछ मेरे लिए ठीक काम करता है लेकिन शायद मैंने कुछ अजीब किया है? बीटीडब्लू: मैं अपने कोड को एक टैग '

3

अपने प्रश्न के समाधान में (छुट्टी) देरी के लिए क्षमा करें।

मैं समझता हूँ और RequireJS के लिए एक को छोड़कर हर स्क्रिप्ट टैग को नष्ट करने के अपने लक्ष्य की सराहना करते हैं। यह लक्ष्य आसानी से मेरे अनुभव में प्राप्त नहीं किया जाता है।

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

हमें इसे ठीक करना होगा। जब हम करते हैं तो मैं यहां एक टिप्पणी जोड़ूंगा।

इस बीच आपको 'क्यू' और 'केओ' के लिए एक स्क्रिप्ट टैग का उपयोग करना होगा और आपको उन टैग को RequJs के लिए स्क्रिप्ट टैग के ऊपर रखना होगा। कृपया अपनी एप्लिकेशन स्क्रिप्ट के लिए आवश्यकताएं उपयोग करना जारी रखें।

दुर्भाग्य से, आपको अन्य समस्याएं हैं जो दोहरी-आवश्यकता-कार्य समस्या से संबंधित नहीं हैं।

सबसे पहले, मुझे लगता है कि आपको हमेशा केओ को वैश्विक नामस्थान से बाहर रखने में परेशानी होगी ... और इसका ब्रीज़ से कोई लेना देना नहीं है।

केओ के एएमडी कार्यान्वयन में (कम से कम जब मैंने पिछली बार देखा), केओ या तो वैश्विक नामस्थान या आवश्यक कंटेनर में है; दोनों कभी नहीं दुर्भाग्यवश, कई उपयोगी प्लग-इन (बाध्यकारी हैंडलर, डीबग.हेल्पर) मानते हैं कि यह वैश्विक नामस्थान में है; यदि आप की आवश्यकता के साथ केओ लोड करते हैं तो आप उनका उपयोग नहीं कर पाएंगे।

आप आवश्यकता से पहले स्क्रिप्ट टैग में नॉकआउट लोड कर सकते हैं और फिर केओ को विन्यास के दौरान कंटेनर की आवश्यकता में डाल सकते हैं। आपका विन्यास इस प्रकार दिखाई देंगे:

 
define('knockout', [], function() { return window.ko; }); 

jQuery डेवलपर्स महसूस किया कि यह एक समस्या होगी। बहुत सारे अच्छे प्लगइन्स मानते हैं कि jQuery वैश्विक नामस्थान में है। शुद्धवादियों की बजाय, jQuery रखरखाव (मेरे दृश्य में सही ढंग से) दोनों में को वैश्विक नामस्थान में कंटेनर और की आवश्यकता है।

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

तीसरा, मुझे लगता है कि आपके कॉन्फ़िगरेशन में एक बग है। मेरे बचने वाले कारणों के लिए, आपने अपने आवश्यक ब्रह्मांड में नॉकआउट मॉड्यूल को "knockout" के रूप में संदर्भित करने का निर्णय लिया है।

ठीक है ... लेकिन आपको उम्मीद नहीं करनी चाहिए कि जब हम इसे एप्लिकेशन की आवश्यकता कंटेनर का उपयोग करने के लिए ठीक करते हैं तो आपको उस मॉड्यूल नाम की अपेक्षा करने की उम्मीद नहीं करनी चाहिए। ब्रीज़ अपने मानक नाम "को" के तहत नॉकआउटजे की तलाश करेगा। ब्रीज़ इसे आपके पसंदीदा नाम, "नॉकआउट" के तहत नहीं मिलेगा।

यह एक बड़ा सौदा नहीं है। यदि आप "नॉकआउट" नाम से शादी कर रहे हैं, तो आप दोनों नामों के तहत एक ही उदाहरण उपलब्ध करा सकते हैं। मैं बहुत यकीन है कि जब आपके विन्यास कोड को जोड़ा गया निम्नलिखित शिम लाइन काम करेंगे हूँ:

 
define('ko', ['knockout'], function (ko) { return ko; }); 

फिर ... यह प्रभावी हम अपने ब्रीज को ठीक बग की आवश्यकता होती है के बाद ही किया जाएगा।

जॉन पापा को कई समान मुद्दों को संबोधित करना पड़ा in Code Camper; आप देख सकते हैं कि उसने वहां क्या किया, खासकर main.js पर।

+2

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

+0

मैंने RequJS google समूह पर एएमडी और ग्लोबल्स के बारे में एक प्रश्न पूछा था और मुझे जो जवाब मिला, वह मेरी सोच के अनुरूप है पुस्तकालयों को मैन्युअल रूप से लपेटना है https://groups.google.com/forum/#!topic/ requirejs/8SsxJUcQD3g मुझे इस तरह से आवश्यक जेएस का उपयोग कर तीसरे पक्ष की libaries के साथ किसी भी अन्य समस्या का अनुभव नहीं किया है। – Gav

+0

मैंने नॉकआउट, require.config.shim के लिए कुछ शिम्स की कोशिश की और मैन्युअल रूप से एक 'ko.shim.js' में घुमाया जैसा आपने सुझाव दिया था, लेकिन न तो काम किया, इसलिए मैं इसे वैश्विक में जोड़ने के लिए वापस लौट आया, हवा से पहले मुझे नहीं मेरी (बड़ी) परियोजना में एक गैर वैश्विक नॉकआउट का उपयोग कर समस्या। मैं क्यू फिक्स के लिए तत्पर हूं लेकिन समय-समय पर मैं अपने एचटीएमएल रैपर में दो स्क्रिप्ट टैग रखने के साथ रह सकता हूं। यह एक शर्म की बात है कि मुझे ब्रीज़ का उपयोग करने के लिए दो कार्य आसपासों को लागू करना है, लेकिन यह मेरे प्रोजेक्ट में इतना जोड़ देगा कि मैं इन समझौता करने के लिए तैयार हूं। – Gav

2

यह ब्रीज़ बनाम 1.2.4 के रूप में तय किया जाना चाहिए। अब हम "आवश्यकता" के आंतरिक कार्यान्वयन का उपयोग नहीं करते हैं।

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