DEV Community

LogUI 🌈
LogUI 🌈

Posted on

Diferencia entre exports y module.exports

¿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" }
Enter fullscreen mode Exit fullscreen mode

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" }
Enter fullscreen mode Exit fullscreen mode

Pero, ¿y si hacemos lo mismo con exports?:

exports = { hola: "hola", mundo: "mundo" }
Enter fullscreen mode Exit fullscreen mode

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.

exports apunta a module.exports que apunta a un objeto vacío

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);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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' }
Enter fullscreen mode Exit fullscreen mode

¿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)