微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 为什么我们在nodejs中使用导出?

我是Nodejs的新手.据我所知,module.exports和exports都是空对象. module.exports可以公开函数,而导出不能这样.一切都可以从module.exports实现.

那么,即使我们有module.exports,为什么我们使用出口呢?出口比module.exports有什么优势?

解决方法

TL; DR

您可以使用:

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设置为该新对象.

也可以看看

另见这个答案:

> What is the difference between module.export and export

原文地址:https://www.jb51.cc/nodejs/241278.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐