所以我有几个 javascript 文件,我想按特定顺序运行,而不是在 html 页面中执行脚本标记,我想使用 requirejs 以便我可以模块化代码。在我开始使用定义 block 进行模块化并开始重构代码之前,我只想设置依赖顺序。所以我有这样的文件
index.html
<script src="scripts/depends/require.js"></script>
<script>
(function(){
require(['scripts/main.js', function(){}]);
}());
</script>
主要.js
require(['scripts/services/fileLoader.js', 'scripts/services/Options.js'], function(){
// do stuff
});
文件加载器.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 所做的。
然而,这就是发生的事情。主调用需要,我可以看到加载了 fileLoader.js 和 options.js。但是在 fileLoader 需要的任何依赖项被调用之前(也不是它自己的回调需要为 main 正确运行而运行),调用 main.js 回调。这是怎么回事?
tl;dr - 在依赖回调之前调用主回调,为什么?
最佳答案
问题是您在应该使用 define
的地方使用 require
并且您没有通过配置选项 enforceDefine: true
对 RequireJS。您应该始终使用 enforceDefine: true
运行 RequireJS,除非您可以举出最重要的理由不这样做。没有它,如果 RequireJS 加载一个没有 define
的模块,它只会耸耸肩继续前进。你得到了你得到的行为。
问题是只有 define
defines 模块,require
不行。所以如果模块文件中没有define
调用,RequireJS 不知道模块实际依赖什么。它将安排加载 require
调用的依赖项中列出的模块,但它们不会被视为将在文件中定义的模块的依赖项。
所以在 main.js
中用 define
替换顶层 require
。在 fileLoader.js
中,以及您要创建的所有其他模块中。
此外,不要将 .js
放在模块名称的末尾。 RequireJS 为你做。如果你真的这样做了,你会得到意想不到的结果。这不是您的问题的原因,但在其他情况下可能是一个因素。
关于javascript - Requirejs:依赖项乱序加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766015/