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.