我在node.js&中非常重要。堆栈溢出也。我正在阅读关于节点模块的内容,并且无法理解一些事情,比如我已经创建了一个节点模块,
math.js
var a = 10;
module.exports = {
add: function (num) {
a += num;
return a;
}
}
然后我将这个math.js导出为以下两个文件
a.js
var math = require("./math.js");
var q = math.add(10);
console.log(q);
和 的 b.js
var math = require("./math.js");
var q = math.add(10);
console.log(q);
两者都为我提供了20& 20
但是当我加入这个a.js&另一个main.js文件中的b.js
main.js
var a= require("./a.js");
var b= require("./b.js");
它为我提供了20& 30。那么为什么它不提供20& 20?,它用于保存模块数据的内存?有人可以解释一下吗?
答案 0 :(得分:0)
NodeJS中的模块处于“单例”模式。每个模块只创建一次,当您第二次调用require
时,您只需获取上一个对象。
您的示例有一点解释:
<强> a.js 强>
// Math is created
var math = require("./math.js");
// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);
<强> b.js 强>
// Math is created
var math = require("./math.js");
// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);
现在很棘手:
<强> main.js 强>
请允许我“重写”main.js的代码,我只需用自己的代码替换每个require
// ********************************************
// require('./a.js);
// Math is created, so the internal variable a is 10
var math = require("./math.js");
// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);
// ********************************************
// require('./b.js);
// Math is not re-created here. NodeJS will re-use the previous result of require("./math.js");. So the internal variable a is still 20 here
var math = require("./math.js");
// 10 is added to the interval variable a of math.js. so q is 30
var q = math.add(10);
console.log(q);
你想要更棘手吗?就这样做:
require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');
此代码仅打印20次,仅打印一次。因为模块a
将仅在第一次调用时创建。每次返回undefined
(因为module.exports=...
中没有a.js
),但只有第一次才能执行其代码。