Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么RequireJS不能多次加载我需要多次的模块?_Javascript_Requirejs_Require - Fatal编程技术网

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

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

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

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: 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
调用所需的模块。有关如何工作的详细信息,请参阅和我写的答案。