RequireJS订单插件和Dojo 1.7.1

时间:2012-01-11 09:20:26

标签: javascript dojo requirejs js-amd

我正在使用AMD和RequireJS将项目从Dojo 1.6.1升级到带有新AMD加载器的Dojo 1.7.1。我必须处理旧的JavaScript文件,而不是作为AMD模块编写,并且必须以正确的顺序加载它们。

在我使用RequireJS订单插件之前,它似乎不适用于Dojo AMD Loader。我在loader文档或Dojo Build System文档中找不到任何相关内容。

对此有何想法?如果没有订单插件,我应该如何与Dojo 1.7一起处理纯JavaScript文件?我是否需要单独处理它们,或者在加载器或构建系统中是否有这方面的功能?

3 个答案:

答案 0 :(得分:4)

我自己刚刚了解这一点,但我找到的文档提到了Generic Script Injection

按照文档中的说明加载通用脚本,同时指定{async:0}作为require()的配置选项。根据我的理解,这会按照您在第二个参数(包含脚本文件名/路径的数组)中指定的顺序加载脚本。

我的例子:

require({async:0},['test1.js','test2.js','test3.js'],function(){
    //do stuff with reference to loaded scripts

});

我的本​​地测试显示我是否将配置更改为{async:1}脚本的加载顺序与我指定的顺序不同。到目前为止,我还没有在dojo加载器代码中跟踪它,但它似乎有意义,并且工作,并且不是黑客。

答案 1 :(得分:3)

我想为上述评论中提到的这种依赖模块提出另一种方法。问题是define不接受async参数。在require函数中使用简单的define会引入竞争条件,因为尚未执行所需模块的代码。

示例(错误):
oldCode.js

window.foo = function(){};

legacyWrapper.js

define(["require"],function(require){
    require({async:0},["./oldCode"]);
})

code.js

define(["./legacyWrapper"],function(){
    window.foo(); //throws exception, foo has not been loaded yet.
})

jsFiddle demo

但是,有一个解决此问题的方法。您需要返回一个Deferred,一旦加载所有模块,它就会得到解决。以下示例按顺序加载a,b,c,d。

define(["require","dojo/Deferred"],function(require,Deferred){
    var def = new Deferred();
    require({async:0},
            ["./moduleA",
             "./moduleB",
             "./moduleC",
             "./moduleD"],
             function(){
        def.resolve();
    });
    return def;
})

要访问moduleA中定义的属性,您现在可以使用

require(["legacyDeps"],function(legacyDeps){
    legacyDeps.then(function(){
        //It's save to assume that all legacy modules have been loaded here.
    });
});

答案 2 :(得分:2)

我认为插件通常不兼容AMD加载器。它不是最优的,但你可以使用dojo / text!有一个评估。这将在构建时内联内容。