javascript - Requirejs:依赖项乱序加载

标签 javascript html requirejs

所以我有几个 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/

相关文章:

javascript - 在 requirejs 中返回 Backbone 集合的标准方法

javascript - 具有 GUI 构建工具的 HTML5、Javascript、CSS、Jquery 支持的最佳 IDE

javascript - 向图像平移添加缓动

html - 向右浮动 div 元素

ruby-on-rails-3 - Rails 3.2 + Require.js?

javascript - 具有依赖关系的 jQuery 插件

javascript - JS;简单数组中的最大路径和练习;无效结果

javascript - 从 testcomplete 连接到本地数据库

javascript - 如何优化 "Parse HTML"事件?

html - 如何使用 sprint bootstrap 从我的 Controller 到我的 HTML 进行通信?