我正在学习node.js,感兴趣的是以下两种情况之间有什么区别。
I.E.我有一些变量myvar
(如数据库连接或只是常量字符串“test”),需要在许多模块和子模块中传递。
第一种情况。 创建模块,接受该变量作为参数:
submodule.js:
var option
, submodule = {};
submodule.func = function(){
...
var something = option;
...
}
module.exports = function(opts){
option = opts;
return submodule;
}
module1.js:
var option
, submodule
, module1 = {};
module1.func = function(){
...
submodule.func();
...
var something = option;
...
}
module.exports = function(opts){
option = opts;
submodule = require('./submodule')(opts);
return module1;
}
在这种情况下,如果子模块用于具有相同myvar
值的多个模块(即2个模块),则子模块的module.exports
函数将被调用2次。在node.js中,它说“模块在第一次加载后被缓存”。我无法理解这个模块是否已缓存。
另一个案例:
myvar
可以作为参数传递给模块函数。所以代码看起来像:
submodule.js:
function func(option){
...
var something = option;
...
};
exports.func = func;
module1.js:
var submodule = require('./submodule');
function func(option){
...
submodule.func(option);
...
var something = option;
...
};
exports.func = func;
所以问题是: 这两种情况有什么区别或者它们是相同的吗?
答案 0 :(得分:3)
我不确定你在这里问的是什么,但是如果你需要将值传递到模块中,你应该确保导出接受参数的函数。当他们说模块被缓存时,意味着你的模块只被初始化一次。将您的模块视为对象:
var a = 1;
var b = 2;
console.log("init!");
module.exports.test = function(){
console.log("this is a function!");
}
这里,a,b和第一个日志只运行一次。这是请求模块然后缓存的时间。当你做
时 var example = require("module")
如果它从未创建,它将初始化a,b,并执行日志消息。如果它已经创建,它将只为您提供您导出的内容的参考。每次打电话:
example.test()
将输出:this is a function!
但是你不会再获得a,b和第一个日志。
将所有未导出的语句视为该对象的私有静态变量。
这是另一个完全有效的例子:
app.js
var s = require("./sample");
var y = require("./sample");
s.test();
y.test();
s.test();
console.log("finished");
sample.js
var a = 1;
var b = 2;
console.log("init!");
function test() {
console.log("here! " + a);
a++;
}
exports.test = test;
这一切都是:
init!
here! 1
here! 2
here! 3
finished
这有帮助吗?