Requirejs:依赖项无序加载

时间:2015-09-24 16:03:54

标签: javascript html5 requirejs

所以我有几个javascript文件,我想按特定的顺序运行,而不是在html页面中做脚本标签,我想使用requirejs,以便我可以模块化代码。在我开始使用define blocks进行模块化并开始重构代码之前,我只想设置依赖顺序。所以我有这样的文件

的index.html

<script src="scripts/depends/require.js"></script>
<script>
    (function(){
        require(['scripts/main.js', function(){}]);
    }());
</script>

main.js

require(['scripts/services/fileLoader.js', 'scripts/services/Options.js'], function(){
    // do stuff
});

fileLoader.js

require([
    'scripts/services/alert.js',
    'scripts/services/game.js',
    'scripts/services/parser.js',
    'scripts/services/options.js'
], function() {
    // do stuff
});

现在很明显我想要的东西。我希望main调用fileLoader.js,然后我希望fileLoader.js在调用它的回调之前调用它的每个依赖项。然后当fileLoader.js完成其回调时,我希望main能够在最后一次最终调用其回调之前完成其依赖关系,这就是我认为requirejs所做的。

然而,这是发生的事情。主调用require,我可以看到加载了fileLoader.js和options.js。但是在调用fileLoader所需的任何依赖项之前(也不需要为main运行正确运行它自己的回调),调用main.js回调。发生了什么事?

tl; dr - 在依赖的回调之前调用主回调,为什么?

1 个答案:

答案 0 :(得分:3)

问题是您正在使用require,您应该使用define ,但尚未将配置选项enforceDefine: true传递给RequireJS。您应该始终使用enforceDefine: true运行RequireJS,除非您能引用最重要的理由。没有它,如果RequireJS加载一个没有define的模块,它就会耸耸肩继续前进。而你得到了你正在获得的行为。

问题是只有define 定义了模块,require不会这样做。因此,如果模块文件中没有define调用,则RequireJS不知道模块实际依赖的内容。 计划加载require调用的依赖项中列出的模块,但它们不会被视为将在文件中定义的模块的依赖项。

因此,在main.js中,使用require替换顶级define。在fileLoader.js以及您要创建的所有其他模块中。

另外,不要将.js放在模块名称的末尾。 RequireJS为你做到了。如果你这样做,你会得到意想不到的结果。这不是问题的原因,但在其他情况下可能是一个因素。