2013-03-15 10 views
9

कॉर्डोवा 2.4.0 और ऊपर जावास्क्रिप्ट में लोड करने के लिए एएमडी का समर्थन करता है। मैं विशेष रूप से RequjS, रीढ़ की हड्डी, jquery, jquery मोबाइल के नवीनतम संस्करण के साथ कॉर्डोवा 2.5.0 का उपयोग करने के लिए देख रहा हूँ।कॉर्डोवा 2.4.0 या 2.5.0 या 2.6.0 और requjs

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

यदि कोई मुझे इस के एक साधारण उदाहरण पर पोस्ट या पॉइंट कर सकता है, तो इसकी सराहना की जाएगी।

संपादित करें: विशेष रूप से मैं आईओएस के लिए विकास को लक्षित कर रहा हूं।

संपादित करें: मैं और अधिक विशिष्ट होना चाहता हूं और उस सटीक समस्या को शामिल करना चाहता हूं जिसमें मैं भाग रहा हूं।

main.js

require.config({ 
    paths: { 
     cordova: 'libs/cordova/cordova.ios',//cordova-2.5.0',//2.5.0*/ 
     jquery: 'libs/jquery/jquery.min',//1.9.1 
     text: 'libs/require/text', 
     domReady: 'libs/require/domReady', 
     underscore: 'libs/underscore/underscore-min', 
     backbone: 'libs/backbone/backbone-min', 
     'jquery.mobile-config': 'libs/jquery-mobile/jqm-config', 
     'jquery.mobile': 'libs/jquery-mobile/jquery.mobile.min' 
    }, 
    shim: { 
     backbone: { 
      deps: ['jquery', 'underscore'], 
      exports: 'Backbone' 
     }, 
     underscore: { 
      exports: '_' 
     }, 
     'jquery.mobile': { 
      deps: ['jquery', 'jquery.mobile-config'] 
     } 
    } 
}); 


require(['app'], function(App){ 
    App.initialize(); 
}); 

app.js

define([ 
    'cordova', 
    'jquery', 
    'underscore', 
    'backbone', 
    'router' 
], function(cordova, $, _, Backbone, Router){ 
    var initialize = function(){ 
     Router.initialize(); 
    } 
    return { 
     initialize: initialize 
    }; 
}); 

स्पष्ट है कि, सब कुछ ठीक काम करता है इससे पहले कि मैं require.js परियोजना को अनुकूलित करें। जब मैं r.js (require.js का हिस्सा) के साथ प्रोजेक्ट को अनुकूलित करने का प्रयास करता हूं, तो ऑप्टिमाइज़र एक त्रुटि फेंकता है जिसे नीचे देखा जा सकता है।

Error channel.js

मुझे यकीन है कि क्या channel.js है, और क्यों यह इसके लिए पूछ रहा है नहीं हूँ, लेकिन मैं यहाँ https://github.com/apache/cordova-js/tree/master/lib/common

एक बार मैं उप-डायरेक्टरी बनाएँ यह है GitHub पर यह पता लगाने के लिए सक्षम था खोज रहे हैं, मैं इसमें channel.js फ़ाइल डालता हूं। मुझे अब यह त्रुटि नहीं मिलती है, लेकिन अब नीचे एक अलग देखा गया है।

enter image description here

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

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

"ReferenceError: निर्यात: चर नहीं खोजा जा सका"

यहाँ मेरी build.js फ़ाइल है मैं अनुकूलन

({ 
    baseUrl: "../js", 
    mainConfigFile: "../js/main.js", 
    name: "../js/main", 
    out: "../js/big.js", 
    preserveLicenseComments: false, 
    paths: { 
     requireLib: "../js/libs/require/require" 
    }, 
    include: "requireLib" 
}) 

संपादित 4/11/13 को चलाने के लिए उपयोग कर रहा हूँ: उत्तर एसए उपयोगकर्ता asgeo1 की मदद के लिए धन्यवाद, मुझे मेरी समस्या हल हो गई। यह पता चला है कि आप main.js 'cordova' में चर का नाम नहीं दे सकते क्योंकि यह 'कॉर्डोवा' नामक एक आंतरिक चर के साथ संघर्ष करता है।

समाधान नीचे है।

मुख्य।js

require.config({ 
    paths: { 
     'cordova.ios': 'libs/cordova/cordova.ios',//cordova-2.5.0' THIS IS CHANGED 
     jquery: 'libs/jquery/jquery.min',//1.9.1 
     text: 'libs/require/text', 
     domReady: 'libs/require/domReady', 
     underscore: 'libs/underscore/underscore-min', 
     backbone: 'libs/backbone/backbone-min', 
     'jquery.mobile-config': 'libs/jquery-mobile/jqm-config', 
     'jquery.mobile': 'libs/jquery-mobile/jquery.mobile.min' 
    }, 
    shim: { 
     backbone: { 
      deps: ['jquery', 'underscore'], 
      exports: 'Backbone' 
     }, 
     underscore: { 
      exports: '_' 
     }, 
     'jquery.mobile': { 
      deps: ['jquery', 'jquery.mobile-config'] 
     } 
    } 
}); 


require(['app'], function(App){ 
    App.initialize(); 
}); 

app.js

define([ 
    'cordova.ios',//THIS IS CHANGED 
    'jquery', 
    'underscore', 
    'backbone', 
    'router' 
], function(cordova, $, _, Backbone, Router){ 
    var initialize = function(){ 
     Router.initialize(); 
    } 
    return { 
     initialize: initialize 
    }; 
}); 

यह समाधान काम करता है और, एक ही विकल्प है Cordova 2.5.0 और 2.6.0

+0

मैं एक बार requirejs साथ कॉर्डोबा 2.2.0 का उपयोग किया है। पता नहीं है कि यह अभी भी नए संस्करणों पर लागू होता है, लेकिन यह आपकी मदद कर सकता है: http://stackoverflow.com/a/13955963/1916258 – asgoth

+0

जैसा कि मैंने अपने ओपी में उल्लेख किया है, कॉर्डोवा 2.4.0 और अब इसकी क्षमता है requjs के साथ आलसी लोड करने के लिए। यह विशेष रूप से मैं क्या करना चाहता हूं। कहा जा रहा है, मैंने आपकी विधि की कोशिश की और यह काम नहीं किया। जब मैं r.js. के साथ कोड अनुकूलित करता हूं तो मुझे मुख्य रूप से समस्याएं आ रही हैं यह दो त्रुटियों को फेंक देता है जो कि 2 .js फाइलें हैं जो कॉर्डोवा पर निर्भर हैं। मैंने उन 2 फाइलों को जिथब पर पाया, और जब मैं उन्हें संरचना में रखता हूं तो यह अनुकूलित होता है, लेकिन कोड त्रुटियों को फेंकता है और ऐप डिवाइस/सिम पर नहीं चलता है। कोड को अनुकूलित करने से पहले मुझे किसी भी त्रुटि का अनुभव नहीं होता है। – njtman

+0

Woha jtman, मैं तुम मुझे खोज के घंटे बचा लिया लगता है। एक ही मुद्दा मिला :-) – codevour

उत्तर

5

मुझे भी यही समस्या है। यह कैसे वे cordova.ios.js फ़ाइल का निर्माण कर रहे एक मुद्दा आप को पता चला है कि वे Cordova 2,4/2,5

साथ वितरित प्रतीत होता है, cordova/channel और cordova/utils वर्गों cordova.ios भीतर सही क्रम में नहीं हैं .js फ़ाइल।

यही कारण है कि RequJS व्यक्तिगत फ़ाइलों को लोड करने का प्रयास क्यों करता है क्योंकि उन मॉड्यूल अभी तक cordova.ios.js फ़ाइल में नहीं हुए हैं।

दुर्भाग्य से जब आप अपनी परियोजना में channel.js और utils.js फ़ाइलों को डालते हैं, तो आप वास्तव में इस मुद्दे के मूल कारण को हल नहीं कर रहे थे।

निश्चित रूप से, इसे बनाने की अनुमति है, लेकिन ReferenceError: Can't find variable: exports त्रुटि तब होती है क्योंकि RequJS utils.js/channel.js की सामग्री को cordova.ios.js सामग्री के बाकी हिस्सों से ऊपर रखेगी - जो कि अच्छा नहीं है क्योंकि वे cordova.ios.js के अंदर स्थापित निर्यात सामग्री पर निर्भर करता है।

नहीं आप अब भी अपने बनाया फ़ाइल में channel.js/utils.js कोड की दो प्रतियां उल्लेख करने के लिए ...

समाधान आप अपने आप को cordova.ios.js संशोधित करना होगा है। (लेकिन निर्यात के बाद/requirejs सामान परिभाषित किया गया है) कॉर्डोबा/चैनल और cordova.ios.js के शीर्ष करने के कॉर्डोबा/utils ले जाएँ

आप एक है कि मैं यहाँ अपने आप के लिए तैयार प्राप्त कर सकते हैं: https://gist.github.com/asgeo1/5361227

इसके अलावा , एक और युक्ति - अपने main.js में, cordova.ios.js को 'कॉर्डोवा' के रूप में संदर्भित न करें। यह संघर्ष करेगा, क्योंकि cordova.ios.js पहले से ही इस मॉड्यूल नाम का आंतरिक रूप से उपयोग करता है।

प्रयोग करें 'cordova.ios' के बजाय:

require.config({ 
    paths: { 
     'cordova.ios': 'libs/cordova/cordova.ios', 
     ... 
+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मैं इसे अगले कुछ घंटों में कोशिश करूंगा। – njtman

+0

बहुत बहुत धन्यवाद, मुझे अब सबकुछ मिल रहा है। मैंने कॉर्डोवा 2.5.0 और नवीनतम 2.6.0 में फिक्स का परीक्षण किया। मुझे बस इतना करना था कि आपने अपने उत्तर के अंत में क्या सुझाव दिया था। मैंने main.js और app.js में 'cordova.ios' में 'कॉर्डोवा' बदल दिया, और सबकुछ बढ़िया काम करता था। क्योंकि अब मुझे कोई समस्या नहीं थी, इसलिए मैंने आपके द्वारा सुझाए गए कॉर्डोवा फ़ाइल की सामग्री को पुन: व्यवस्थित करने का प्रयास नहीं किया था। फिर से, बहुत बहुत धन्यवाद। – njtman

+3

कोई चिंता नहीं, भागों के आदेश से बाहर होने के साथ इस मुद्दे को केवल 2.4 और 2.5 में था। शुक्र है कि यह 2.6 में तय किया गया है;) – asgeo1

1

साथ परीक्षण किया गया था आलसी लोड हो रहा है उपयोग करने के लिए requireJS से domReady प्लगइन का उपयोग करें (सीएफ http://requirejs.org/docs/api.html#pageload)।

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

require(['require/domReady','cordova/cordova-ios-2.5.0'], function (domReady) { 
    domReady(function() { 
    console.log("The DOM is ready - waiting for the device"); 
    document.addEventListener("deviceready", startWhenReady, false); 
    } 
}); 

function startWhenReady() 
{ 
    console.log("dom and device ready : we can start..."); 
    // your app 
} 

मेरे लिए काम किया!

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मैं कल यह कोशिश करूंगा। हालांकि त्वरित प्रश्न। क्या आप अपनी विधि का उपयोग कर अपने प्रोजेक्ट को अनुकूलित (और छोटा कर सकते हैं)? मैं केवल जेएस फाइलों की सभी आवश्यकताओं को अनुकूलित करने के दौरान और बाद में मुद्दों का सामना कर रहा था। कोड को अनुकूलित करने से पहले, सबकुछ ठीक काम करता था। (हालांकि जिस तरह से मैंने कोशिश की वह आपके रास्ते से थोड़ा अलग था।) आपकी प्रतिक्रिया के लिए फिर से धन्यवाद। – njtman

+0

आपका स्वागत है। जब (w/YUICompressor) संस्करणों jQuery-require.js और कॉर्डोबा-2.5.0.js न्यूनतम किया गया का उपयोग कर मैं किसी भी समस्या का सामना नहीं किया। – Delta

+0

मुझे लगता है कि आपने मेरी टिप्पणी को गलत समझा। मुझे पुस्तकालयों के पूर्व-निर्मित minified संस्करणों का उपयोग कर कोई समस्या नहीं है। मैं संबधी मुद्दे हैं जब मैं (गठबंधन और बदसूरत करना) मेरी पूरी परियोजना का उपयोग कर r.js जो js की आवश्यकता का एक हिस्सा है अनुकूलन। ऑप्टिमाइज़ेशन चलाने से पहले, सब कुछ ठीक काम करता है। ऑप्टिमाइज़ेशन चलाने के बाद जब मुझे समस्याएं आती हैं। – njtman