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

我是Nodejs的新手。 按照我的module.exportsexports都是空对象。 module.exports可以暴露function,而exports不能这样做。 一切都可以从module.exports实现。

那么,为什么我们使用exports即使我们有module.exportsexportsmodule.exports上的优点是什么?

TL; DR

您可以使用:

 exports.x = 1; exports.y = 2; exports.z = 3; 

作为一种较短的写作方式:

 module.exports.x = 1; module.exports.y = 2; module.exports.z = 3; 

唯一的好处是less打字。

但是你必须写:

 module.exports = { x: 1, y: 2, z: 3 }; 

因为这不起作用:

 exports = { x: 1, y: 2, z: 3 }; 

因为它不会改变module.exports它是module.exports实际上被导出

说明

你的模块被封装在一个隐式的闭包中,它将一些variables作为parameter passing。 其中一个variables称为exports ,是一个空对象,另一个称为module ,它包括作为其属性之一的exports

 module.exports === exports 

当你写:

 exports.x = 10; 

那么你改变提供的对象的属性 (该对象仍然是相同的对象,但它是突变),一切都很好。 值x可以用作module.exports.xmodule.exports.x

但是,如果你写:

 exports = {x: 10}; 

那么你分配一个新的对象 exportsmodule.exports仍然指向原来的 (空)对象。 这样你有module.exports.x正确设置,但你也没有 module.exports.x设置,因为现在:

 module.exports !== exports 

如果你想创build一个新的对象,而不是使用你在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(公共),而不是其他(私人)。 假设你有这些function:

 function private1() { // ... } function private2() { // ... } function public1() { // ... } function public2() { // ... } 

导出两个公共函数的选项很less:

这工作

 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 ,但是当你想导出一个不同于最初提供给你的对象的时候,导出并不起作用 。 在这种情况下,您需要将module.exports设置为该新对象。

也可以看看

另请参阅此答案:

  • module.export和export有什么不同?

模块是一个带有exports属性的普通JavaScript对象。 出口是一个普通的JavaScriptvariables,恰好被设置为module.exports。 在文件的最后,node.js基本上将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引用传递的,这意味着如果你设置了多个variables到同一个对象,都是同一个对象; 那么出口和module.exports是同一个对象。 但是,如果将输出设置为新的内容,则不再将其设置为module.exports,因此exports和module.exports不再是同一个对象。

方便。 键入exports.myFunc = function(){};module.exports.myFunc = function(){};

通过module.exports您可以将整个模块导出到其他节点模块中,其中可以从导出的模块访问所有function。

通过独立exports您只能导出希望其他模块可访问的方法。 就像是把publicprivatefunction一样。