RequireJS有缺陷吗?

时间:2011-05-14 06:42:10

标签: javascript requirejs

调查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之前下载并评估了jquery.alpha,那么这肯定会导致问题吗?忘记任何客户端代码使用,例如上面的函数体,如果像大多数插件一样,它们附加到jQuery.fn然后在评估阶段,则jQuery将在此场景中未定义。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:18)

RequireJS不是为加载普通javascript而设计的,而是加载已定义的模块。模块格式类似于:

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

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

如果您尝试加载纯文件,这将无法正常工作。在这种情况下,有order插件强制加载订单。

答案 1 :(得分:1)

应该注意的是,该示例使用自定义版本的“requirejs和jquery”打包在一起,我相信这意味着jquery将始终可用。

如果您遇到问题,可以随时将插件包装在模块定义中,并确保它们依赖于jquery本身,再次确保订单正确:

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


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


/* SPECIAL WRAPPING CODE END */
});

答案 2 :(得分: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>

诚实:
looking at various asynchronous resource-loaders而且我很难找到能满足我所需要的一切。我也发现每个文档缺少文档。