所以我有几个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 - 在依赖的回调之前调用主回调,为什么?
答案 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为你做到了。如果你这样做,你会得到意想不到的结果。这不是问题的原因,但在其他情况下可能是一个因素。