为什么RequireJS不会多次加载我需要多次的模块?

时间:2014-03-14 16:38:48

标签: javascript requirejs require

当有两个文件导入相同的模块时,它似乎共享相同的资源,如下所示:

main.js:

require(['cmdA', 'cmdB'], function(cmdA, cmdB){

})

cmdA.js:

define(function(require, exports){
    console.log('require: cmdA');
    var body = require('body');
});

cmdB.js:

define(function(require, exports){
    console.log('require: cmdB');
    var body = require('body');
});

结果:

require body 
require: cmdA 
require: cmdB 

为什么不呢:

require body
require: cmdA
require body
require: cmdB

我认为 body.js 需要两次,因此控制台会输出两次身体。为什么呢?

1 个答案:

答案 0 :(得分:8)

默认情况下,RequireJS将模块视为单例。一旦RequireJS执行了名称解析并发现您需要模块X,那么如果您需要一次,两次,三百万次,您将始终获得相同的模块对象。第一次需要该模块时,会创建该模块,然后在下次再次需要该模块时,您将获得与第一次返回的模块相同的模块。您提供给define的回调只调用一次。

如果您使用requirejs.undef,您可以欺骗RequireJS为您提供模块的多个副本,但这不是基本用法。