cordova2.4.0或2.5.0或2.6.0和requirejs

cordova2.4.0及以上支持AMD加载到JavaScript。 我特别希望使用最新版本的RequireJS,backbone,jquery,jquery mobile的Cordova 2.5.0。

我还没有看到有关如何使用requirejs正确使用Cordova的新版本的任何教程或发布。 当cordova不支持AMD(2.3.0和之前的版本)的时候,我看到很多关于如何将Cordova和requirejsjoin的post。

如果任何人可以张贴或指向我一个简单的例子,这将不胜感激。

编辑:具体来说,我是针对iOS的发展。

编辑:我想更具体,包括我遇到的确切问题。

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的一部分)优化项目时,优化器会抛出一个错误,可以在下面看到。

错误channel.js

我不确定channel.js是什么,为什么它要求它,但我能在github上find它https://github.com/apache/cordova-js/tree/master/lib/common

一旦我创build了它正在寻找的子目录,我把它放在channel.js文件。 我不再犯这个错误,但是现在又是一个不同的错误,见下文。

在这里输入图像说明

我也能在cordova-js github网站上find这个文件。 一旦我将该文件放入子目录中,我不会收到任何错误消息,并且项目成功build立。

现在,当我尝试使用单个优化的js文件运行应用程序时,在javascript控制台中出现此错误,并在设备上出现空白屏幕。

“ReferenceError:无法findvariables:导出”

这是我用来运行优化的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: 答复感谢SA用户asgeo1的帮助,我得到了我的问题解决。 事实certificate,你不能在main.js'cordova'中命名该variables,因为它与名为'cordova'的内部variables冲突。

解决scheme如下。

main.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 }; }); 

这个解决scheme的工作原理是用cordova2.5.0和2.6.0进行testing

我也有同样的问题。 这似乎是他们如何构buildcordova.ios.js文件与Cordova 2.4 / 2.5分发的一个问题

正如您发现的那样,cordova.ios.js文件中的cordova/channelcordova/utils部分的顺序不正确。

这就是为什么RequireJS试图加载单个文件,因为这些模块还没有在cordova.ios.js文件中出现。

不幸的是,当您将channel.js和utils.js文件放入您的项目中时,实际上并没有解决问题的根本原因。

当然,这允许它构build,但ReferenceError: Can't find variable: exports错误,然后发生,因为RequireJS会把utils.js / channel.js的内容高于cordova.ios.js内容的其余部分 – 这是不好,因为它们依赖cordova.ios.js里面的输出内容。

更何况你现在有两个你的内置文件channel.js / utils.js代码的副本…

解决办法是你必须自己修改cordova.ios.js。 将cordova / channel和cordova / utils移到cordova.ios.js的顶部(但在定义了exports / requirejs之后)

你可以得到一个我自己在这里准备的: https : //gist.github.com/asgeo1/5361227

此外,在main.js中的另一个提示并不是将cordova.ios.js称为“cordova”。 这会冲突,因为cordova.ios.js已经在内部使用这个模块名称。

改用“cordova.ios”:

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

要使用延迟加载,一个select是使用requireJS中的domReady插件(参见http://requirejs.org/docs/api.html#pageload )。

一旦requireJS确认DOM已经准备就绪,您就可以使用常规的设备准备监听器等待设备准备就绪。

 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 } 

为我工作!