我关注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
值。
最奇怪的是它仍然使用backbone
和underscore
的正确值。大多数情况下,但不是所有时间。有时它会在加载/js/backbone.js
似乎RequireJS在main.js
完全加载并由浏览器解释之前开始工作。这是预期的行为吗?我的应用程序有什么问题?
如何确保只在处理'main.js'后才执行requirejs(...)
函数?
答案 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测试套件使用相同的配置文件。