module.exports是否等于导出
我是nodejs的新手,试着知道如何从其他文件中包含函数。
我发现qazxsw poi和qazxsw poi可以解决我的问题,但我不知道两者之间有什么不同。
我做了一些研究,发现了module.exports
ref:exports
exports = module.exports
但我仍然不确定,所以我做了实验:
index.js
Understanding module.exports and exports in Node.js
lib1.js
var exports = module.exports = {};
lib2.js
const lib1 = require('./lib1.js');
const lib2 = require('./lib2.js');
const lib3 = require('./lib3.js');
const lib4 = require('./lib4.js');
const func = () => {
return 'attr2';
};
var lib = {};
var lib = {
attr1: 'attr1',
attr2_1: func,
attr2_2: func(),
attr3: () => {
return 'attr3 (closure)';
}
};
// using object variable on local file
console.log(lib.attr1);
console.log(lib.attr2_1());
console.log(lib.attr2_2);
console.log(lib.attr3());
console.log('# Case1 ----');
console.log(lib1.attr1);
console.log(lib1.attr2_1());
console.log(lib1.attr2_2);
console.log(lib1.attr3());
console.log('# Case2 ----');
console.log(lib1.attr1);
console.log(lib1.attr2_1());
console.log(lib1.attr2_2);
console.log(lib1.attr3());
console.log('# Case3 ----');
console.log(lib3.attr1);
console.log(lib3.attr2_1());
console.log(lib3.attr2_2);
console.log(lib3.attr3());
console.log('# Case4 ----');
console.log(lib4.attr1);
console.log(lib4.attr2_1());
console.log(lib4.attr2_2);
console.log(lib4.attr3());
lib3.js
const func = () => {
return 'attr2';
}
// Case1 : This work
module.exports.attr1 = 'attr1';
module.exports.attr2_1 = func;
module.exports.attr2_2 = func();
module.exports.attr3 = () => {
return 'attr3 (closure)';
};
lib4.js
const func = () => {
return 'attr2';
}
// Case2 : This work
module.exports = {
attr1: 'attr1',
attr2_1: func,
attr2_2: func(),
attr3: () => {
return 'attr3 (closure)';
}
};
case4将返回错误:(来自vscode调试)
const func = () => {
return 'attr2';
}
// Case3 : This work
exports.attr1 = 'attr1';
exports.attr2_1 = func;
exports.attr2_2 = func();
exports.attr3 = () => {
return 'attr3 (closure)';
};
case1,2,3 =>工作正常。
但为什么case4是错误的? const func = () => {
return 'attr2';
}
// Case4 : Not work!
exports = {
attr1: 'attr1',
attr2_1: func,
attr2_2: func(),
attr3: () => {
return 'attr3 (closure)';
}
};
不是真的吗?
你在这做什么
...
# Case4 ----
undefined
C:\Users\Scott\Documents\module_export\index.js:49
console.log(lib4.attr2_1());
^
TypeError: lib4.attr2_1 is not a function
at Object.<anonymous> (C:\Users\Scott\Documents\module_export\index.js:49:18)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:282:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
将名为var exports = module.exports = {};
的变量重新分配给一个全新的对象。名为var exports = module.exports = {};
exports = {
attr1: 'attr1',
attr2_1: func,
attr2_2: func(),
attr3: () => {
return 'attr3 (closure)';
}
};
的变量不再指向与exports
相同的对象; exports
保持不变,作为空物。因此,当其他模块尝试从module.exports
导入时,它们只会得到一个空对象。
您必须改变module.exports
变量,就像您在案例3中所做的那样,或者您必须在lib4
上重新分配exports
属性,就像您在案例2中所做的那样(或者在案例1中改变现有的exports
对象)。
这与进口/出口没有任何关系:在这里可以看到相同的行为:
module