3

我有以下内容main.js

requirejs.config({
    paths: {
        'backbone': 'backbone-min',
        'underscore': 'underscore-min',
        'loader': 'loader-min'
    }
})

这个'loader-min.js'文件只是一个优化的js loader.js

define(['backbone', 'underscore'], function () {
})

我的 HTML 页面包含以下内容:

<script data-main="/js/main" src="/js/require.js"></script>
<script type="text/javascript">
   requirejs(['loader'], function(loader) {
      ....
   })
</script>

顺便说一句,正如我从 Firebug 控制台看到的,浏览器仅加载以下网址:

GET /js/require.js
GET /js/main.js
GET /js/loader.js !!! Notice it's loader.js, not loader-min.js
GET /js/backbone-min.js
GET /js/underscore-min.js

因此,对于模块loader它尝试加载文件的问题loader.js,而不是在main.js. 未缩小/优化文件,忽略requirejs.config值。

backbone最奇怪的是它仍然为and使用正确的值underscore。大多数情况下,但并非所有时间。有时加载失败/js/backbone.js

似乎 RequireJS 在main.js浏览器完全加载和解释之前就开始工作了。这是预期的行为吗?还是我的应用有问题?

如何确保requirejs(...)仅在处理“main.js”后才执行该函数?

4

1 回答 1

5

您的 main.js 文件是异步加载的。但是,此脚本标记(如下)是按顺序解析的。因此无法预测执行顺序(尽管下面的脚本很可能会在异步调用返回之前执行)。

<script type="text/javascript">
   // require() and not requirejs()
   require(['loader'], function(loader) { 
      ....
   })
</script>

在 main.js 文件的末尾添加 require 调用,如下所示:

require.config({
// configuration.
});

require(['loader'], function(loader) { 
// callback
})

这样 RequireJS 在执行任何 require 或 define 调用之前总是被“配置”。

编辑: 我通常做什么:

<script src="/js/require.js"></script> <!-- No data-main attribute -->
<script src="/js/config.js"></script> <!-- Explicitly load configuration -->

<script type="text/javascript">
    require.config({
        baseURL: "path/to/base"
    });
    require(["module"], function(module){
        // code
    });
</script>

通过这种方式,我可以明确控制加载的内容。它还使我的 config.js 文件保持干燥。

我通常在我的引导 HTML 中设置 baseURL,因为这样我可以为我的 Jasmine 测试套件使用相同的配置文件。

于 2013-02-25T11:24:11.610 回答