En Node.js, tanto exports
como module.exports
son utilizados para hacer la funcionalidad o los valores de un módulo disponibles para ser empleados en otros módulos. Aunque estos dos pueden parecer similares a primera vista, existen diferencias significativas entre ellos.
exports
es un objeto que es proporcionado por Node.js como una forma para que los módulos puedan exportar funciones, objetos o valores a otros módulos. Se puede pensar en exports
como un objeto vacío que se puede llenar con las exportaciones desejadas. De esta forma, es posible agregar más de un objeto, función o valor a exports
y estos estarán disponibles para ser importados por otros módulos.
Por ejemplo,
exports.miFuncion = function() { return 'Hola Mundo'; };
exports.myObjeto = { nombre: 'Juan', apellido: 'Pérez' };
En este caso, miFuncion
y miObjeto
pueden ser importados de este módulo y utilizados en otro módulo.
Por otro lado, module.exports
es también una forma de exportar en Node.js, pero a diferencia de exports
, sólo puede exportar una única función, objeto o valor. Si se desea exportar más de un valor, deben ser adjuntados a un objeto.
Si se intenta asignar múltiples valores a module.exports
de forma similar a exports
, solo el último valor será exportado.
Por ejemplo,
module.exports = function() { return 'Hola Mundo'; };
module.exports = { nombre: 'Juan', apellido: 'Pérez' };
En este caso, solo el objeto { nombre: 'Juan', apellido: 'Pérez' }
será exportado, y la función 'Hola Mundo'
no estará disponible para ser importada.
En resumen, la principal diferencia entre exports
y module.exports
es que exports
puede ser utilizado para exportar varios objetos, funciones o valores, mientras que module.exports
solo puede exportar un único objeto, función o valor.
Sin embargo, es importante mencionar que exports
es en realidad un alias para module.exports
. Cuando Node.js requiere un módulo, realmente retorna el objeto module.exports
. Por lo tanto, si se asignan valores a ambos exports
y module.exports
, Node.js retornará únicamente module.exports
.
Entonces, es preferible usar module.exports
en la mayoría de los casos, especialmente si el módulo necesita exportar un constructor o una clase. Si solo se está exportando una colección de funciones y/o valores, ambos, exports
y module.exports
, pueden ser usados de manera intercambiable.