我是Nodejs的新手。据我所知module.exports
和exports
都是空对象。 module.exports
可以公开函数,而exports
则不能。一切都可以从module.exports实现。
那么,为什么我们使用exports
即使我们有module.exports
? exports
优于module.exports
的优势是什么?
答案 0 :(得分:8)
您可以使用:
exports.x = 1;
exports.y = 2;
exports.z = 3;
作为一种较短的写作方式:
module.exports.x = 1;
module.exports.y = 2;
module.exports.z = 3;
唯一的好处是减少打字。
但你必须写:
module.exports = {
x: 1,
y: 2,
z: 3
};
因为这不起作用:
exports = {
x: 1,
y: 2,
z: 3
};
因为它不会更改实际导出的module.exports
和 module.exports
。
您的模块包含在一个隐式闭包中,该闭包会将一些变量作为参数传递。其中一个变量称为exports
,它是一个空对象,另一个称为module
,包含 exports
作为其属性之一:
module.exports === exports
当你写:
exports.x = 10;
然后你改变了所提供对象的属性(该对象仍然是同一个对象,但是它已被改变)并且一切都很好。值x
可用作 exports.x
和module.exports.x
。
但如果你写:
exports = {x: 10};
然后您将{strong>新对象分配给exports
,而module.exports
仍然指向原始(空)对象。这样您就可以正确设置exports.x
,但也没有设置 module.exports.x
,因为现在:
module.exports !== exports
如果你想制作新对象而不是使用exports
中的空对象,那么你必须将其分配给module.exports
:
module.exports = {x: 10};
现在module.exports
和exports
也有所不同:
module.exports !== exports
但实际导出的是module.exports
所以一切都很好。
将新对象分配给module.exports
后,您也可以将其分配给exports
:
module.exports = {x: 10};
exports = module.exports;
或反过来做:
exports = {x: 10};
module.exports = exports;
所以您仍然可以使用分配新属性的快捷方式:
exports.y = 20;
但我在实践中没有看到这一点。
导出某些功能(公共)但不导出其他功能(私有)。 假设你有这些功能:
function private1() {
// ...
}
function private2() {
// ...
}
function public1() {
// ...
}
function public2() {
// ...
}
您可以选择导出两个公共函数:
module.exports.public1 = public1;
module.exports.public2 = public2;
或:
exports.public1 = public1;
exports.public2 = public2;
或:
module.exports = {
public1: public1,
public2: public2
};
或:
module.exports = {
public1,
public2
};
exports = {
public1: public1,
public2: public2
};
或:
exports = {
public1,
public2
};
换句话说,exports
仅用于便利,因此您不必每次都写module.exports
,但不起作用< / strong>用于导出与最初提供的对象不同的对象的情况。在这种情况下,您需要将module.exports
设置为该新对象。
另见答案:
答案 1 :(得分:2)
module是一个带有exports属性的普通JavaScript对象。 exports是一个普通的JavaScript变量,恰好设置为module.exports。在文件的末尾,node.js基本上会返回&#39; module.exports到require函数。在Node中查看JS文件的简单方法是:
// your code
var module = { exports: {} };
var exports = module.exports;
return module.exports;
如果在exports上设置了一个属性,比如exports.a = 9;,那么也会设置module.exports.a,因为对象在JavaScript中作为引用传递,这意味着如果你将多个变量设置为相同对象,它们都是同一个对象;那么exports和module.exports是同一个对象。 但是如果将导出设置为new,则不会再将其设置为module.exports,因此exports和module.exports不再是同一个对象。
答案 2 :(得分:0)
便利。键入exports.myFunc = function(){};
的时间比module.exports.myFunc = function(){};
答案 3 :(得分:0)
使用module.exports
,您可以导出要导入其他节点模块的整个模块,其中所有功能都可以从导出的模块访问。
使用indepdendent exports
,您只能导出您希望其他模块可访问的方法。这就像将某些功能设为public
&amp; private
。