Cordova 2.4.0 及更高版本支持 AMD 加载到 javascript。我特别希望将 Cordova 2.5.0 与最新版本的 RequireJS、backbone、jquery、jquery mobile 一起使用。
我还没有看到任何关于如何通过 requirejs 正确使用新版本的 Cordova 的教程或帖子。当 Cordova 不支持 AMD(2.3.0 及更早版本)时,我确实看到了大量关于如何合并 Cordova 和 requirejs 的帖子。
如果有人可以发布或指出一个简单的例子,我将不胜感激。
编辑: 具体来说,我的目标是 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 是什么,为什么要它,但我可以在 github 上找到它 https://github.com/apache/cordova-js/tree/master/lib/common
创建它要查找的子目录后,我将 channel.js 文件放入其中。我不再收到该错误,但现在出现了一个不同的错误,如下所示。
我还能够在 cordova-js github 站点上找到该文件。将该文件放入子目录后,我没有收到任何错误消息,项目构建成功。
现在,当我尝试使用单个优化的 js 文件运行应用程序时,我在 javascript 控制台中收到此错误,并且设备上只有空白屏幕。
“ReferenceError:找不到变量:exports”
这是我用来运行优化的 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"
})
编辑 2013 年 4 月 11 日: 回答 感谢 SA 用户 asgeo1 的帮助,我的问题得到了解决。事实证明,您无法在 main.js 中将变量命名为“cordova”,因为它与名为“cordova”的内部变量冲突。
解决方案如下。
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
};
});
此解决方案适用于 Cordova 2.5.0 和 2.6.0 并经过测试
最佳答案
我也遇到过同样的问题。他们如何构建与 Cordova 2.4/2.5 一起分发的 cordova.ios.js 文件似乎是一个问题
如您所见,cordova/channel
和 cordova/utils
部分在 cordova.ios.js 文件中的顺序不正确。
这就是 RequireJS 尝试加载单个文件的原因,因为这些模块还没有出现在 cordova.ios.js 文件中。
不幸的是,当您将 channel.js 和 utils.js 文件放入您的项目时,您实际上并没有解决问题的根本原因。
当然,这允许它构建,但是 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',
...
关于ios - Cordova 2.4.0 或 2.5.0 或 2.6.0 和 requirejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15440529/