当有两个文件导入相同的模块时,它似乎共享相同的资源,如下所示:
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 需要两次,因此控制台会输出两次身体。为什么呢?
答案 0 :(得分:8)
默认情况下,RequireJS将模块视为单例。一旦RequireJS执行了名称解析并发现您需要模块X
,那么如果您需要一次,两次,三百万次,您将始终获得相同的模块对象。第一次需要该模块时,会创建该模块,然后在下次再次需要该模块时,您将获得与第一次返回的模块相同的模块。您提供给define
的回调只调用一次。
如果您使用requirejs.undef
,您可以欺骗RequireJS为您提供模块的多个副本,但这不是基本用法。