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 utilizarexportssi no está reemplazando el objeto predeterminado exportados, es decir, si simplemente adjuntar propiedades como esta:var foo = require('foo').foo. Estafoopropiedad se puede exportar así:exports.foo = ...y por supuesto también conmodule.exports. Es una elección personal, pero actualmente estoy usandomodule.exportsyexportsapropiada.Respuestas:
modulees un objeto JavaScript simple con unaexportspropiedad.exportses una variable simple de JavaScript que se establece enmodule.exports. Al final de su archivo, node.js básicamente 'regresará'module.exportsa larequirefunció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.aporque 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 entoncesexportsymodule.exportsson el mismo objeto.Sin embargo, si se establece
exportsa algo nuevo, que ya no se establece enmodule.exports, por lo queexports, ymodule.exportsya no son el mismo objeto.fuente
module.exportstambié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
exportsymodule.exportses 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.exportsyexportsson 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
exportsymodule.exportsson lo mismo y una referencia al mismo objeto. Puede agregar propiedades de ambas maneras según su conveniencia.fuente