Javascript 为什么RequireJS不能多次加载我需要多次的模块?
当有两个文件导入同一个模块时,它似乎共享相同的资源,如下所示: main.js:Javascript 为什么RequireJS不能多次加载我需要多次的模块?,javascript,requirejs,require,Javascript,Requirejs,Require,当有两个文件导入同一个模块时,它似乎共享相同的资源,如下所示: main.js: require(['cmdA', 'cmdB'], function(cmdA, cmdB){ }) define(function(require, exports){ console.log('require: cmdA'); var body = require('body'); }); define(function(require, exports){ console.log
require(['cmdA', 'cmdB'], function(cmdA, cmdB){
})
define(function(require, exports){
console.log('require: cmdA');
var body = require('body');
});
define(function(require, exports){
console.log('require: cmdB');
var body = require('body');
});
require body
require: cmdA
require: cmdB
cmdA.js:
require(['cmdA', 'cmdB'], function(cmdA, cmdB){
})
define(function(require, exports){
console.log('require: cmdA');
var body = require('body');
});
define(function(require, exports){
console.log('require: cmdB');
var body = require('body');
});
require body
require: cmdA
require: cmdB
cmdB.js:
require(['cmdA', 'cmdB'], function(cmdA, cmdB){
})
define(function(require, exports){
console.log('require: cmdA');
var body = require('body');
});
define(function(require, exports){
console.log('require: cmdB');
var body = require('body');
});
require body
require: cmdA
require: cmdB
结果:
require(['cmdA', 'cmdB'], function(cmdA, cmdB){
})
define(function(require, exports){
console.log('require: cmdA');
var body = require('body');
});
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需要两次,所以控制台输出body两次。为什么?默认情况下,RequireJS将模块视为单例。一旦RequireJS进行了名称解析并发现您需要模块
X
,那么如果您需要它一次、两次、三百万次,您将始终得到相同的模块对象。第一次需要该模块时,会创建该模块,下一次再次需要该模块时,会得到与第一次返回的模块相同的模块。给define
的回调调用一次,而且只调用一次
如果使用,您可以诱使RequireJS为您提供模块的多个副本,但这不是基本用法。但是当我像这样更改cmdA.js和cmdB.js时:`define(function(require,exports){console.log('require:cmdA');var foo=function(){var body=require('body');});定义(函数(require,exports){console.log('require:cmdB');//var body=require('body');});`为什么会出现这样的结果:`require:cmdB require body require:cmdA`在新的
cmdA.js
RequireJS中搜索所有require
调用,这些调用有一个字符串参数,并在开始执行您给define
的回调之前加载这些require
调用所需的模块。有关如何工作的详细信息,请参阅和我写的答案。