Header Ads Widget

Ticker

6/recent/ticker-posts

Exportaciones vs module.exports en NodeJs, ¿cuál usar?

 Sabemos que cuando nuestro código se ejecuta a través del nodo, está envuelto en una expresión de función. Esto nos permite acceder al objeto del módulo, que es un parámetro que se pasa a esa función.

1
2
3
(function (exports, require, module, __filename, __dirname) {
    //module code
});

A continuación, se invoca esta expresión de función con los siguientes argumentos:

1
fn(module.exports, require, module, filename, dirname);

Entonces podemos ver eso al comenzar ambos exportsmodule.exportsapuntar hacia el mismo recuerdo donde module.exports{}reside el vacío .

exportaciones de módulos

Cuando requerimos el uso de un módulo require("module_name"), obtenemos module.exportsa cambio y no exportsEsto siempre debe tenerse en cuenta.

Entonces, cuando hacemos algo como seguir en nuestro módulo sample_module.js:

1
2
3
4
5
6
//sample_module
export.prop1 = "This is property 1;
 
export.func1 = function(){
  console.log("This is function 1");
}

La propiedad y un método se están agregando al objeto que también apunta hacia module.exports

exportaciones de módulos

Por lo tanto, cuando requerimos sample_module:

1
2
3
4
//app.js
var sample = require("sample_module");
sample.prop1;   //This is property 1
sample.func1;   //logs "This is function 1"

Por supuesto, este es el mismo resultado que habríamos obtenido si hubiéramos usado module.exportsen sample_module en lugar de exports.

Sin embargo, si tenemos que exportar un número en lugar de un objeto y lo hacemos

1
2
//sample_module
exports = 5;

La situación sería como

exportaciones de módulos

Al intentar acceder a esto desde app.js:

1
2
3
4
//app.js
var sample = require("sample_module");
typeof(sample); //object... not number
conosle.log(sample);    //will log an empty object

Esto sucede porque lo que realmente se devuelve a través de la función require () es module.exportsy en el ejemplo anterior, hemos establecido exports = 5, que esencialmente no muta el objeto al que apunta module.exports, sino que asigna una nueva ubicación de memoria exportsy establece su valor en 5;

Esto no tiene nada que ver con node. En Javascript, los objetos se pasan por "copia de una referencia". Entonces, cuando se ejecuta el módulo envuelto, se exportsobtiene una copia de referencia de module.exportsEntonces exportspuede modificar el contenido de a module.exportstravés de la referencia que recibió. Sin embargo, si exportsintenta sobrescribir la referencia (como en el ejemplo anterior), no alterará module.exportssino que creará una nueva ubicación de memoria exportsy agregará contenido a ella.

Entonces, lo que realmente se debe hacer para que el código anterior se ejecute correctamente es:

1
2
//sample_module
module.exports = 5;
exportaciones de módulos
1
2
3
4
//app.js
var sample = require("sample_module");
typeof(sample); //number
conosle.log(sample); //5

Mi consejo personal es usar siempre module.exportsy olvidar que exportsexiste la taquigrafía Esto reducirá su carga cognitiva de recordar estos pequeños detalles y hará la vida mucho más fácil.

Publicar un comentario

0 Comentarios