9

Cordova 2.4.0 及更高版本支持 AMD 加载到 javascript。我特别希望将 Cordova 2.5.0 与最新版本的 RequireJS、骨干网、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();
});

应用程序.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 上找到它 https://github.com/apache/cordova-js/tree/master/lib/common

创建它要查找的子目录后,我将 channel.js 文件放入其中。我不再收到该错误,但现在出现了不同的错误,如下所示。

在此处输入图像描述

我还能够在 cordova-js github 站点上找到该文件。将该文件放入子目录后,我不会收到任何错误消息并且项目成功构建。

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

“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: 回答 感谢 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();
});

应用程序.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 进行了测试

4

2 回答 2

5

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

如您所见,cordova.ios.js 文件中的cordova/channelandcordova/utils部分的顺序不正确。

这就是为什么 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',
        ...
于 2013-04-11T06:39:40.330 回答
1

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

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

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
}

为我工作!

于 2013-03-26T17:15:47.573 回答