那么,即使我们有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设置为该新对象.
也可以看看
另见这个答案:
原文地址:https://www.jb51.cc/nodejs/241278.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。