RequireJS乱序执行 - 不尊重`require`的参数

时间:2012-07-31 21:18:53

标签: javascript requirejs js-amd

在我理解为普通方式的情况下使用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及其所有依赖项加载后执行,因为that's what the documentation says

但事实并非如此。在我的本地开发系统中,这个问题并没有表现出来,我想是因为它是某种竞争条件,使其成为双重问题,因为这只是在部署/暂存之后才会出现。

我有一个直截了当的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

随着build.js被称为r.js的参数,沿着以下几行:

({
    baseUrl:    'mycode',
    optimize:   'none',
    out:        'all.min.js',
    stubModules: ['cs', 'coffee-script'],
    paths: {
        ...
        underscore: '../lib/lodash'
    },
    name: 'main',
    shim: {
       ...
    }
})

有谁知道这里发生了什么?我非常喜欢RequireJS的异步特性以及将我的代码拆分成合理模块的能力,但这个问题特别令人沮丧,因为它只能在登台/制作设置中展示。

任何想法和建议都会得到适当的赞赏。

编辑:删除了一些可能多余的论据来缩短问题。

1 个答案:

答案 0 :(得分:2)

我相信我已将此问题排除在外 - main.js应该包含对define的调用,因为posted in an issue on GitHub