RequireJS忽略了一些路径

Igo*_*nov 3 javascript requirejs

我有以下内容main.js:

requirejs.config({
    paths: {
        'backbone': 'backbone-min',
        'underscore': 'underscore-min',
        'loader': 'loader-min'
    }
})
Run Code Online (Sandbox Code Playgroud)

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

define(['backbone', 'underscore'], function () {
})
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一下,正如我在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
Run Code Online (Sandbox Code Playgroud)

因此,模块loader尝试加载文件loader.js而不是路径配置的问题main.js.未缩小/优化文件,忽略requirejs.config值.

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

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

我怎样才能确保requirejs(...)只在处理'main.js'之后才执行该功能?

Adi*_*har 5

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

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

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

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

require(['loader'], function(loader) { 
// callback
})
Run Code Online (Sandbox Code Playgroud)

这样,在执行任何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>
Run Code Online (Sandbox Code Playgroud)

这样我就可以明确控制加载的位置.它还保持我的config.js文件DRY.

我通常在我的bootstrap HTML中设置baseURL,因为这样我可以使用相同的配置文件来安装我的Jasmine测试套件.