为什么我们在nodejs中使用导出?

时间:2016-12-22 10:06:30

标签: node.js

我是Nodejs的新手。据我所知module.exportsexports都是空对象。 module.exports可以公开函数,而exports则不能。一切都可以从module.exports实现。

那么,为什么我们使用exports即使我们有module.exportsexports优于module.exports的优势是什么?

4 个答案:

答案 0 :(得分:8)

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,
    y: 2,
    z: 3
};

因为它不会更改实际导出的module.exports module.exports

说明

您的模块包含在一个隐式闭包中,该闭包会将一些变量作为参数传递。其中一个变量称为exports,它是一个空对象,另一个称为module包含 exports作为其属性之一:

module.exports === exports

当你写:

exports.x = 10;

然后你改变了所提供对象的属性(该对象仍然是同一个对象,但是它已被改变)并且一切都很好。值x可用作 exports.xmodule.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.exportsexports也有所不同:

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