RequireJS无序执行 - 不遵守`require`参数

3
在使用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的异步特性,结合将代码分解为合理模块的能力,但这个问题特别令人沮丧,因为它只在暂存/生产环境中表现出来。

欢迎提出任何想法和建议。

编辑: 删除了一些可能多余的参数以缩短问题描述。


Brian,你把这段代码发布在某个网站上了吗?这样我们就可以尝试调试看看出了什么问题。因为从你的配置来看,我没有发现任何错误,也许需要进行调试... - Marcelo De Zen
@devundef:感谢您的评论。我也认为代码看起来还不错。:) 经过几个小时的调试,我只是把问题缩小到了上面。我可以尝试在jsFiddle中重现这个问题,但需要先休息一下,以免自己变得疯狂。 :) - Brian M. Hunt
有时候代码会让我们发疯,对吧? :) 那好,如果您能在 jsFiddle 中重现错误就更好了。 - Marcelo De Zen
@devundef:根据我下面的回答,我已经解决了这个问题。祈祷一切顺利。 - Brian M. Hunt
1个回答

2

哇,我总是在我的主模块中使用require,这个问题从来没有发生过。但是使用define()而不是require()更有意义。请让我知道是否解决了。 - Marcelo De Zen
@devundef:我总是在我的主模块中使用require - 我认为这是正确的做法(而且我模糊地记得在某些情况下,在main.js中使用define会有问题)。我期待着找出我所做的是否真的是“正确”的解决方案。 - Brian M. Hunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接