¿Cuál es la diferencia entre usar module.exports o exports en Node.js?
En principio, ambos apuntan al mismo objeto -vacío-. Esto significa que si utilizamos module.exports.hola = "hola"
seguido de un exports.mundo = "mundo"
, exportaremos el siguiente objeto:
{ hola: "hola", mundo: "mundo" }
Sin embargo, hay cosas que no podemos hacer. Por ejemplo, podemos asignar un objeto a module.exports de la siguiente manera:
module.exports = { hola: "hola", mundo: "mundo" }
Pero, ¿y si hacemos lo mismo con exports?:
exports = { hola: "hola", mundo: "mundo" }
Cuando intentamos acceder a alguna de sus propiedades, nos devolverá undefined
. Y es que, si pedimos que nos muestre el objeto exportado descubriremos que está vacío {}
. 😱😱😱
¿Por qué pasa esto? Resulta que exports es solamente un atajo.
¿Recuerdas que empezamos diciendo que ambos apuntan al mismo objeto vacío? No es técnicamente cierto. En realidad module.exports es quien apunta al objeto, mientras que exports apunta a module.exports. Éste funciona entonces como un puente entre exports y el objeto que queremos exportar.
Y es que cuando asignamos un objeto a una variable, lo que estamos haciendo no es dar un valor, sino crear una referencia. Imagina que tenemos este código:
let holaMundo = {
hola: 'hola'
};
let x = holaMundo;
console.log(holaMundo, x);
Si lo ejecutamos, se mostrará en pantalla { hola: 'hola' } { hola: 'hola' }
. Hasta aquí todo bien. Pero, ¿qué crees que nos mostrará si modificamos holaMundo
después de asignarlo a x
?
let holaMundo = {
hola: 'hola'
};
let x = holaMundo;
holaMundo.mundo = 'mundo';
console.log(holaMundo, x);
Cuando tenemos una variable let a = 1
y asignamos let b = a
estamos guardando el valor de a
en b
. Y después, da igual lo que hagamos con a
o lo que asignemos porque seguiremos teniendo nuestro 1
en esa segunda variable.
Teniendo esto en cuenta, la intuición nos dice que x
no debería modificarse cuando añadimos otra propiedad a holaMundo
. Sin embargo, si ejecutamos el último bloque de código la pantalla nos mostrará lo siguiente:
{ hola: 'hola', mundo: 'mundo' } { hola: 'hola', mundo: 'mundo' }
¿Por qué? De nuevo, porque lo que hacemos no es asignar el valor de holaMundo
sino crear una forma más rápida de acceder a su contenido, y escribir una letra en lugar de ocho.
Así, exports nos permite ir añadiendo valores utilizando seis letras menos que con module.exports. Para poder usar este atajo, Node lo que hace es crear la referencia exports = module.exports
por ti.
Con exports = { hola: 'hola'}
, lo que estamos haciendo es cambiar el valor de exports y eliminar esa referencia, dejando entonces de tener acceso al objeto en module.exports.
Top comments (0)