RequireJS忽略了一些路径

时间:2013-02-25 11:14:47

标签: javascript requirejs

我关注main.js

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

这个'loader-min.js'文件只是来自loader.js优化 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值。

最奇怪的是它仍然使用backboneunderscore的正确值。大多数情况下,但不是所有时间。有时它会在加载/js/backbone.js

时失败

似乎RequireJS在main.js完全加载并由浏览器解释之前开始工作。这是预期的行为吗?我的应用程序有什么问题?

如何确保只在处理'main.js'后才执行requirejs(...)函数?

1 个答案:

答案 0 :(得分: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
})

这样,在执行任何require或define调用之前,RequireJS始终处于“配置”状态。

修改 我通常做什么:

<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文件保持DRY。

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