En esta página ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), establece que "si desea establecer el objeto de exportación en una función o un nuevo objeto, debe use el objeto module.exports ".
Mi pregunta es por qué.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
Console.logged el resultado ( result=require(example.js)
) y el primero es [Function]
el segundo es {}
.
¿Podría explicar la razón detrás de esto? He leído el post aquí: module.exports vs exportaciones en Node.js . Es útil, pero no explica la razón por la que está diseñado de esa manera. ¿Habrá algún problema si la referencia de las exportaciones se devuelve directamente?
javascript
node.js
commonjs
Xiao Peng - ZenUML.com
fuente
fuente
module.exports
.exports
, por ejemplo github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, que nunca será mal, pero se puede utilizarexports
si no está reemplazando el objeto predeterminado exportados, es decir, si simplemente adjuntar propiedades como esta:var foo = require('foo').foo
. Estafoo
propiedad se puede exportar así:exports.foo = ...
y por supuesto también conmodule.exports
. Es una elección personal, pero actualmente estoy usandomodule.exports
yexports
apropiada.Respuestas:
module
es un objeto JavaScript simple con unaexports
propiedad.exports
es una variable simple de JavaScript que se establece enmodule.exports
. Al final de su archivo, node.js básicamente 'regresará'module.exports
a larequire
función. Una forma simplificada de ver un archivo JS en Node podría ser esta:Si establece una propiedad en
exports
, comoexports.a = 9;
, eso también se establecerámodule.exports.a
porque los objetos se pasan como referencias en JavaScript, lo que significa que si establece múltiples variables en el mismo objeto, todos son el mismo objeto; entonces entoncesexports
ymodule.exports
son el mismo objeto.Sin embargo, si se establece
exports
a algo nuevo, que ya no se establece enmodule.exports
, por lo queexports
, ymodule.exports
ya no son el mismo objeto.fuente
module.exports
también lo describe: nodejs.org/api/modules.html#modules_module_exportsLa respuesta de Renee está bien explicada. Además de la respuesta con un ejemplo:
Node hace muchas cosas a su archivo y una de las más importantes es WRAPPING 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
greet.js
el código anterior se envuelve como IIFE (Expresión de función invocada inmediatamente) dentro del código fuente de nodejs de la siguiente manera:
y la función anterior se invoca (.apply ()) y devuelve module.exports. En este momento modulo. Exportaciones y exportaciones apuntando a la misma referencia.
Ahora, imagina que reescribes greet.js como
la salida será
la razón es: module.exports es un objeto vacío. No establecimos nada en module.exports sino que establecimos exportaciones = función () ..... en new greet.js. Entonces, module.exports está vacío.
Técnicamente exportaciones y module.exports deberían 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. Entonces, el módulo de exportaciones y exportaciones produce resultados diferentes. Cuando se trata de exportaciones, no podemos anularlo.
Ahora, imagine que reescribe (esto se llama Mutación) greet.js (refiriéndose a la respuesta de Renee) como
la salida será
Como puede ver, module.exports and export apunta a la misma referencia, que es una función. Si establece una propiedad en 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 codificación :)
fuente
Además, una cosa que puede ayudar a entender:
math.js
client.js
Genial, en este caso:
Por lo tanto, por defecto, "esto" es realmente igual a module.exports.
Sin embargo, si cambia su implementación a:
math.js
En este caso, funcionará bien, sin embargo, "esto" ya no es igual a module.exports, porque se creó un nuevo objeto.
Y ahora, lo que devolverá el requerimiento es lo que se definió dentro del módulo. Exportaciones, no esto o exportaciones, nunca más.
Otra forma de hacerlo sería:
math.js
O:
math.js
fuente
La respuesta de Rene sobre la relación entre
exports
ymodule.exports
es bastante clara, se trata de referencias de JavaScript. Solo quiero agregar eso:Vemos esto en muchos módulos de nodos:
var app = exports = module.exports = {};
Esto asegurará que incluso si cambiamos module.exports, todavía podemos usar exportaciones haciendo que esas dos variables apunten al mismo objeto.
fuente
module.exports
yexports
son variables independientes, simplemente inicializados para hacer referencia al mismo objeto. Si cambia la referencia de una variable, las dos variables ya no hacen referencia a la misma cosa. La línea de código anterior asegura que ambas variables se inicialicen en el mismo objeto nuevo.myTest.js
exports
ymodule.exports
son lo mismo y una referencia al mismo objeto. Puede agregar propiedades de ambas maneras según su conveniencia.fuente