¿Por qué usamos las exportaciones en nodejs?

Soy novato de Nodejs. Según me module.exports y exports ambos son objeto vacío. module.exports puede exponer la función, mientras que las exports no pueden hacerlo. Todo se puede lograr desde el módulo.exportaciones.

Entonces, ¿por qué usamos las exports incluso tenemos module.exports ? ¿Cuáles son las ventajas de las exports sobre module.exports ?

TL; DR

Puedes usar:

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

Como una forma más corta de escribir:

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

La única ventaja es escribir menos.

Pero tienes que escribir:

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

ya que esto no funcionará:

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

porque no cambiaría el module.exports y su module.exports que realmente se exporta .

Explicación

Su módulo se envuelve en un cierre implícito que hace que algunas variables se pasen como parámetros. Una de esas variables se llama exports que es un objeto vacío y otra se llama module e incluye las exports como una de sus propiedades:

 module.exports === exports 

Cuando escribes:

 exports.x = 10; 

luego cambia la propiedad del objeto provisto (el objeto sigue siendo el mismo objeto, pero está mutado) y todo está bien. El valor x está disponible como module.exports.x y module.exports.x .

Pero si escribes:

 exports = {x: 10}; 

luego, asigna un nuevo objeto a las exports mientras que module.exports aún apunta al objeto original (vacío). De esa manera usted tiene exports.x configurado correctamente pero no tiene configurado también el conjunto de module.exports.x , porque ahora:

 module.exports !== exports 

Si desea crear un nuevo objeto en lugar de usar el vacío que obtuvo en las exports , debe asignarlo a module.exports :

 module.exports = {x: 10}; 

Ahora module.exports y exports son diferentes también:

 module.exports !== exports 

Pero es un module.exports . module.exports que realmente se exportan, así que todo está bien.

Después de asignar un nuevo objeto a module.exports también podría asignarlo a las exports :

 module.exports = {x: 10}; exports = module.exports; 

o hazlo al revés:

 exports = {x: 10}; module.exports = exports; 

por lo que aún podría utilizar el acceso directo para asignar nuevas propiedades con:

 exports.y = 20; 

Pero no lo he visto en la práctica.

Ejemplos reales

Exportando algunas funciones (públicas) pero no otras (privadas). Digamos que tienes esas funciones:

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

Tienes pocas opciones para exportar dos funciones públicas:

Esto funciona

 module.exports.public1 = public1; module.exports.public2 = public2; 

o:

 exports.public1 = public1; exports.public2 = public2; 

o:

 module.exports = { public1: public1, public2: public2 }; 

o:

 module.exports = { public1, public2 }; 

Esto no funciona

 exports = { public1: public1, public2: public2 }; 

o:

 exports = { public1, public2 }; 

Resumen

En otras palabras, las exports son solo por conveniencia para que no tenga que escribir module.exports cada vez, pero no funciona en los casos en que desea exportar un objeto diferente al que le proporcionó originalmente. En ese caso, debe configurar el module.exports a ese nuevo objeto.

Ver también

Véase también esta respuesta:

  • ¿Cuál es la diferencia entre módulo.exportación y exportación?

módulo es un objeto JavaScript simple con una propiedad de exportación. Exportaciones es una variable de JavaScript simple que se configura en module.exports. Al final de su archivo, node.js básicamente “devolverá” module.exports a la función requerida. Una forma simplificada de ver un archivo JS en Node podría ser esta:

 // your code var module = { exports: {} }; var exports = module.exports; return module.exports; 

Si configura una propiedad en exportaciones, como exports.a = 9 ;, también configurará module.exports.a porque los objetos se pasan como referencias en JavaScript, lo que significa que si establece varias variables en el mismo objeto, son todos el mismo objeto; Entonces las exportaciones y el módulo.exportaciones son el mismo objeto. Pero si configura las exportaciones en algo nuevo, ya no se establecerá en module.exports, por lo que las exportaciones y module.exports ya no son el mismo objeto.

Conveniencia. Escribiendo exports.myFunc = function(){}; es más corto que module.exports.myFunc = function(){};

con module.exports puede exportar el módulo completo para importarlo en otros módulos de nodo donde todas las funciones sean accesibles desde el módulo exportado.

Con las exports independientes, puede exportar solo los métodos que desea que sean accesibles a otros módulos. Es como hacer ciertas funciones como public y private .