que node modules es6 javascript node.js commonjs

javascript - node - Diferencia entre "módulo.exportaciones" y "exportaciones" en el Sistema de módulos CommonJs



node modules export (4)

Además, una cosa que puede ayudar a entender:

math.js

this.add = function (a, b) { return a + b; };

cliente.js

var math = require(''./math''); console.log(math.add(2,2); // 4;

Genial, en este caso:

console.log(this === module.exports); // true console.log(this === exports); // true console.log(module.exports === exports); // true

Por lo tanto, de forma predeterminada, "esto" es en realidad igual a module.exports.

Sin embargo, si cambias tu implementación a:

math.js

var add = function (a, b) { return a + b; }; module.exports = { add: add };

En este caso, funcionará bien, sin embargo, "esto" ya no es igual a module.exports, porque se creó un nuevo objeto.

console.log(this === module.exports); // false console.log(this === exports); // true console.log(module.exports === exports); // false

Y ahora, lo que se devolverá por requerimiento es lo que se definió dentro de module.exports, no esto o las exportaciones, nunca más.

Otra forma de hacerlo sería:

math.js

module.exports.add = function (a, b) { return a + b; };

O:

math.js

exports.add = function (a, b) { return a + b; };

En esta página ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), indica que "Si desea configurar el objeto de exportación en una función o un nuevo objeto, debe usar el objeto module.exports ".

Mi pregunta es por qué.

// right module.exports = function () { console.log("hello world") } // wrong exports = function () { console.log("hello world") }

Conseguí.logged el resultado ( result=require(example.js) ) y el primero es [Function] el segundo es {} .

¿Podría por favor explicar la razón detrás de esto? Leí la publicación aquí: módulo.exportaciones vs exportaciones en Node.js. Es útil, pero no explica la razón por la que está diseñado de esa manera. ¿Habrá un problema si la referencia de las exportaciones se devuelve directamente?


La respuesta de Rene sobre la relación entre exports y module.exports es bastante clara, se trata de referencias de javascript. Solo quiero añadir eso:

Vemos esto en muchos módulos de nodo:

var app = exports = module.exports = {};

Esto asegurará que incluso si modificamos module.exports, aún podamos usar las exportaciones haciendo que esas dos variables apunten al mismo objeto.


La respuesta de Renee está bien explicada. Además de la respuesta con un ejemplo:

Node hace muchas cosas para su archivo y una de las más importantes es ENTRAR su archivo. Dentro del código fuente de nodejs se devuelve "module.exports". Vamos a dar un paso atrás y entender el envoltorio. Supongamos que tienes

saludos.js

var greet = function () { console.log(''Hello World''); }; module.exports = greet;

el código anterior se incluye como IIFE (expresión de función invocada inmediatamente) dentro del código fuente de nodejs de la siguiente manera:

(function (exports, require, module, __filename, __dirname) { //add by node var greet = function () { console.log(''Hello World''); }; module.exports = greet; }).apply(); //add by node return module.exports; //add by node

y la función anterior se invoca (.apply ()) y se devuelve module.exports. En este momento módulo.exportaciones y exportaciones apuntan a la misma referencia.

Ahora, imagina que reescribes greet.js como

exports = function () { console.log(''Hello World''); }; console.log(exports); console.log(module.exports);

la salida será

[Function] {}

la razón es: module.exports es un objeto vacío. No establecimos nada en module.exports, sino que configuramos exports = function () ..... en new greet.js. Por lo tanto, module.exports está vacío.

Técnicamente las exportaciones y el módulo.exportaciones deben apuntar a la misma referencia (¡eso es correcto!). Pero usamos "=" cuando asignamos la función () .... a las exportaciones, lo que crea otro objeto en la memoria. Por lo tanto, módulo.exportaciones y exportaciones producen resultados diferentes. Cuando se trata de exportaciones, no podemos anularlo.

Ahora, imagina que reescribes (esto se llama Mutación) greet.js (refiriéndose a la respuesta de Renee) como

exports.a = function() { console.log("Hello"); } console.log(exports); console.log(module.exports);

la salida será

{ a: [Function] } { a: [Function] }

Como puede ver, el módulo.exportaciones y exportaciones apuntan a la misma referencia que es una función. Si establece una propiedad en las exportaciones, se establecerá en module.exports porque en JS, los objetos se pasan por referencia.

La conclusión es siempre usar module.exports para evitar confusiones. Espero que esto ayude. Feliz codificacion :)


module es un objeto JavaScript simple con una propiedad de exports . exports 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 require . Una forma simplificada de ver un archivo JS en Node podría ser esta:

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

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