那么,即使我们有module.exports,为什么我们使用出口呢?出口比module.exports有什么优势?
解决方法
您可以使用:
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,z: 3 };
因为它不会改变module.exports和它实际导出的module.exports.
说明
您的模块包含在一个隐式闭包中,该闭包将一些变量作为参数传递.其中一个变量称为导出,它是一个空对象,另一个称为模块,它包含导出作为其属性之一:
module.exports === exports
当你写:
exports.x = 10;
然后你改变提供的对象的属性(对象仍然是同一个对象,但它是变异的),一切都很好.值x可用作exports.x和module.exports.x.
但如果你写:
exports = {x: 10};
然后你将一个新对象分配给导出,而module.exports仍然指向原始(空)对象.这样你就可以正确设置exports.x,但你也没有设置module.exports.x,因为现在:
module.exports !== exports
如果要创建一个新对象而不是使用导出中的空对象,则必须将其分配给module.exports:
module.exports = {x: 10};
现在module.exports和exports也是不同的:
module.exports !== exports
但它的module.exports实际上已经导出,所以一切都很好.
在为module.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 };
换句话说,导出只是为了方便,因此您不必每次都编写module.exports,但是当您想要导出与最初提供的对象不同的对象时,它不起作用.在这种情况下,您需要将module.exports设置为该新对象.
也可以看看
另见这个答案: