为什么我们在nodejs中使用导出?
我是Nodejs的新手。 按照我的module.exports
和exports
都是空对象。 module.exports
可以暴露function,而exports
不能这样做。 一切都可以从module.exports实现。
那么,为什么我们使用exports
即使我们有module.exports
? 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;
唯一的好处是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.x
和module.exports.x
。
但是,如果你写:
exports = {x: 10};
那么你分配一个新的对象 exports
而module.exports
仍然指向原来的 (空)对象。 这样你有module.exports.x
正确设置,但你也没有 module.exports.x
设置,因为现在:
module.exports !== exports
如果你想创build一个新的对象,而不是使用你在exports
得到的空对象 ,那么你必须把它分配给module.exports
:
module.exports = {x: 10};
现在module.exports
和exports
也是不同的:
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
您只能导出希望其他模块可访问的方法。 就像是把public
和private
function一样。