我意识到我可以通过一个简单的测试项目来回答自己(我可能,如果没有一个人立刻响起),但我无法在SO或谷歌的任何地方找到答案,这似乎很关键:
如果我使用require.js定义AMD模块:
//a.js
define( ['stuff'], function (Stuff) {
return { thing: new Stuff() };
}
然后我在两个不同的其他模块中使用它:
// b.js
define( ['a'], function(a) {
// do something with a's stuff
});
// c.js
define( ['a'], function(a) {
//do something else with a's stuff
}
a
的定义函数是否被调用(因此实例化了一个新的Stuff
)每次我需要它用于另一个模块,或者它只被调用一次,它的输出是否被缓存?
显然这在一些用例中很关键,但是从require.js文档或我见过的其他示例中不清楚。
答案 0 :(得分:7)
我自己测试了这个,看起来构造函数只运行一次。
// stuff.js
define(function() {
return function() {
console.log('making new!');
};
});
// a.js
define( ['stuff'], function (Stuff) {
return { thing: new Stuff };
});
// b.js
define( ['a'], function(a) {
});
// c.js
define( ['a'], function(a) {
});
// app.js
define(['b', 'c'], function() {
console.log('app');
});
// index.html
<html>
<head>
<script src='requirejs/require.js' data-main='app.js'></script>
</head>
</html>
当我打开index.html时,控制台会显示:
making new! stuff.js:3
app app.js:2