在这个简单的requirejs例子中,为什么不首先执行“c”?

时间:2013-06-03 18:31:40

标签: javascript dependency-injection requirejs

在这个小样本应用中,为什么index-b.jsindex-c.js之前执行?

由于index-cindex-a的依赖关系,而index-a是要在index-b之前加载的设置,因此在我看来index-c应首先执行

/* index.js */
define([ "./index-a", "./index-b" ], function(){    
    console.log("index executing");    
});

/* index-a.js */
define([ "./index-c" ], function(){    
    console.log("index-a executing");    
});

/* index-b.js */
define(function(){    
    console.log("index-b executing");    
});

/* index-c.js */
define(function(){    
    console.log("index-c executing");    
});

运行示例:http://fitzgeraldmedia.net/requirejs/index.html(检查控制台)

2 个答案:

答案 0 :(得分:3)

index.js中define()调用中模块的顺序并不意味着任何同步依赖,因此index-a在index-b之前并不真正“设置为加载”。 index.js中的define()调用只是声明回调函数中的代码依赖于index-a和index-b。如果index-b依赖于index-a,那么index-b应该将index-a列为其define()调用中的依赖项。

所以你的index.js文件看起来像这样:

define([ "./index-b" ], function(){

    console.log("index.js executing");
});

并且你的index-b.js文件看起来像这样:

define([ "./index-a" ], function(){

    console.log("index-b.js executing");

});

答案 1 :(得分:0)

尝试在配置的shim属性中包含依赖项

 'indexC': {
      deps: ['index-a']
  },

这可确保在加载index-a

之前加载index-c
    requirejs.config({

        baseUrl: "lib/",

        paths: {
            'jquery' : "vendor/jquery-2.0.2.min",
                'indexA' : 'app/ndex-a',
                'indexB' : 'app/ndex-b',
                'indexC' : 'app/ndex-c',
                'index'  : 'app/ndex',
        }

  });

因为index-a取决于index-c

替换

define([ "app/index-c" ], function(){

require([ "app/index-c" ], function(){