在使用CoffeeScript以我理解的普通方式构建和运行RequireJS时,我似乎遇到了代码未按预期顺序执行的问题。
<script src="/_s/lib/require-jquery.js"></script>
<script>
require.config({
paths: {
"main": "/_s/all.min", // <--- the 'optimized' result of `$ r.js build.js`
}
});
require(["main"], function () {
// this executes without any regard to whether 'main' is loaded.
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// also:
// require('cs!csmain') throws an exception because "cs!csmain" has not been
// loaded for context: '_'.
});
预期传递给require(["main"], ...
的函数会在main及其所有依赖项加载完成后执行,因为文档如此说明。
然而,事实并非如此。在我的本地开发系统中,这个问题并没有表现出来,我想这可能是某种竞态条件,使得这个问题变得更加棘手,因为这只会在部署/上线之后才会出现。
我有一个简单的main.js
,像这样:
var _paths;
_paths = {
...
underscore: '../lib/lodash'
};
require.config({
baseUrl: '/_s/mycode/', // main.js lives here
paths: _paths,
shim: {
...
'timeago': ['jquery']
},
waitSeconds: 60
});
require(['cs!csmain']); // has all the dependencies
在使用r.js
时,需要将build.js
作为参数传递进去,示例如下:
({
baseUrl: 'mycode',
optimize: 'none',
out: 'all.min.js',
stubModules: ['cs', 'coffee-script'],
paths: {
...
underscore: '../lib/lodash'
},
name: 'main',
shim: {
...
}
})
有人知道这里发生了什么吗?我非常喜欢RequireJS的异步特性,结合将代码分解为合理模块的能力,但这个问题特别令人沮丧,因为它只在暂存/生产环境中表现出来。
欢迎提出任何想法和建议。
编辑: 删除了一些可能多余的参数以缩短问题描述。