0

查看 RequireJS 但与 Head.JS 不同的是,它以未确定的顺序下载但以确定的顺序进行评估,RequireJS 似乎不同

通常 RequireJS 以未确定的顺序加载和评估脚本。

然后它显示了如何为订单添加前缀!到脚本名称以进行显式排序等。

然后在示例中:

require(["jquery", "jquery.alpha", "jquery.beta"], function($) {
    //the jquery.alpha.js and jquery.beta.js plugins have been loaded.
    $(function() {
        $('body').alpha().beta();
    });
});

因此,如果 jquery.alpha 在 jquery 之前被下载和评估,那么这肯定会导致问题吗?忘记任何客户端代码使用,例如上面的函数体,如果像大多数插件一样它们附加到 jQuery.fn,那么在评估阶段,jQuery 将在这种情况下未定义。

我在这里想念什么?

4

3 回答 3

18

RequireJS 的设计目的不是加载普通的 javascript,而是加载已定义的模块。模块格式如下所示:

define(['a', 'b'], function(a, b) {
    return { zzz: 123 };
});

需要注意的重要一点是,所有模块代码都在匿名函数中。因此,如果文件以任意顺序运行,也没关系,因为它所做的只是注册模块。然后模块代码以依赖顺序运行,返回值成为模块对象,它作为参数传递给使用模块的代码。

如果您尝试加载纯文件,这将无法正常工作。在这种情况下,有一个order插件可以强制加载顺序。

于 2011-06-25T23:54:39.587 回答
1

需要注意的是,该示例使用了定制版本的“requirejs 和 jquery”打包在一起,我相信这意味着 jquery 将始终首先可用。

如果你有问题,你总是可以将你的插件包装在一个模块定义中,并确保它们本身依赖于 jquery,再次确保顺序是正确的:

/* SPECIAL WRAPPING CODE START */
define(['jquery'], function(jQuery) {


// .... plugin code ....


/* SPECIAL WRAPPING CODE END */
});
于 2011-09-23T12:45:51.107 回答
0

你是对的,没有任何东西可以帮助顺序发生异常。好消息是 RequireJS 有一个 Order 插件可以帮助解决这个问题。

我目前正在评估RequireJS ...

这是我的一个文件的一个例子:
“订单!” 命令将按顺序为您加载文件。您可以(然后)使用回调加载其他(支持)文件。

<script src="Loaders/RequireJS/requireJS.js" type="text/javascript"></script>
<script src="Loaders/RequireJS/order.js" type="text/javascript"></script>
<script type="text/javascript">

    require(["Loaders/RequireJS/order!././Includes/JavaScript/jQuery/Core/jquery-1.3.2.js",
        "Loaders/RequireJS/order!././Includes/JavaScript/jQuery/Core/jquery.tools.min.js",
        "Loaders/RequireJS/order!././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.tmpl.js"], function() {

        require(["././Includes/JavaScript/jQuery/jGeneral.js",
            "././Includes/JavaScript/jQuery/autocomplete.js",
            "././Includes/JavaScript/jQuery/jquery.ErrorWindow.js",
            "././Includes/JavaScript/jQuery/jquery.ValidationBubble.js",
            "././Includes/JavaScript/jQuery/jquery.Tootltip.js",
            "././Includes/JavaScript/jQuery/jquery.Extensions.js",
            "././Includes/JavaScript/jQuery/jquery.Toaster.js"], null);

        require(["././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.dimensions.js",
            "././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jQuery.Color.Animations.js",
            "././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.corners.min.js",
            "././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.tipsy.js",
            "././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.numberformatter-1.1.0.js",
            "././Includes/JavaScript/jQuery/ThirdPartyPlugIns/jquery.tipsy.js"], null);
    });
</script>

老实说:
我正在研究各种异步资源加载器,但我很难找到一个能满足我所有需要的。我还发现每个缺少的文档。

于 2011-05-19T20:25:38.427 回答