with parameter node multiple functions exports example dollars convert coin javascript node.js express module export

javascript - multiple - node js export function with parameter



¿Qué significan "module.exports" y "exports.methods" en NodeJS/Express? (4)

Mirando un archivo fuente aleatorio del marco express para NodeJS , hay dos líneas del código que no entiendo (estas líneas de código son típicas de casi todos los archivos NodeJS).

/** * Expose `Router` constructor. */ exports = module.exports = Router;

y

/** * Expose HTTP methods. */ var methods = exports.methods = require(''./methods'');

Entiendo que la primera parte del código permite que el resto de las funciones del archivo se expongan a la aplicación NodeJS , pero no entiendo exactamente cómo funciona , o qué significa el código en la línea.

¿Qué significan realmente las exports y las exports module.exports ?

Creo que la segunda parte del código permite que las funciones del archivo accedan a los methods , pero una vez más, ¿cómo lo hace exactamente?

Básicamente, ¿cuáles son estas palabras mágicas: module y exports ?


Para ampliar la respuesta de Raynos ...

exports es básicamente un alias para module.exports - Recomiendo simplemente no usarlo. Puede exponer métodos y propiedades de un módulo estableciéndolos en module.exports , de la siguiente manera:

//file ''module1.js'' module.exports.foo = function () { return ''bar'' } module.exports.baz = 5

Luego tienes acceso a él en tu código:

var module1 = require(''module1'') console.log(module1.foo()) console.log(module1.baz)

También puede anular module.exports completo para proporcionar simplemente un único objeto en require:

//glorp.js module.exports = function () { this.foo = function () { return ''bar'' } this.baz = 5 return this // need to return `this` object here }

Ahora tienes un buen prototipo:

var g1 = new require(''glorp'')() console.log(g1.foo()) console.log(g1.baz)

Hay miles de otras formas de jugar con module.exports y require . Solo recuerde, require(''foo'') siempre devuelve la misma instancia incluso si la llama varias veces.

Nota

Para que lo siguiente funcione,

var g1 = new require(''glorp'')() console.log(g1.foo()) console.log(g1.baz)

this tiene que ser devuelto en la función que está asignada a module.exports . De lo contrario, obtendrás un TypeError :

console.log(g1.foo()) ^ TypeError: Cannot read property ''foo'' of undefined


Para ser más especifico:

module es la variable de alcance global dentro de un archivo.

Entonces, si llamas a require("foo") entonces:

// foo.js console.log(this === module); // true

Actúa de la misma manera que la window actúa en el navegador.

También hay otro objeto global llamado global que puede escribir y leer en cualquier archivo que desee, pero eso implica una mutación del alcance global y esto es MALVADO

exports es una variable que vive en module.exports . Básicamente es lo que exporta cuando se requiere un archivo.

// foo.js module.exports = 42; // main.js console.log(require("foo") === 42); // true

Hay un pequeño problema con las exports por sí mismo. El _global scope context + y el module no son lo mismo. (En el navegador, el contexto y la window alcance global son los mismos).

// foo.js var exports = {}; // creates a new local variable called exports, and conflicts with // living on module.exports exports = {}; // does the same as above module.exports = {}; // just works because its the "correct" exports // bar.js exports.foo = 42; // this does not create a new exports variable so it just works

Leer más sobre exportaciones


Puede encontrar la mejor respuesta en el código fuente de node.js. Si alguien requiere su módulo js, ​​su secuencia de comandos se convierte en una función por nodo de la siguiente manera (vea src / node.js).

// require function does this.. (function (exports, require, module, __filename, __dirname) { ... your javascript contents... });

Nodo ajustará su secuencia de comandos. Entonces el script anterior se ejecutará de la siguiente manera:

//module.js var args = [self.exports, require, self, filename, dirname]; return compiledWrapper.apply(self.exports, args);

Entonces en tu script,

exports is just module.exports.

En su secuencia de comandos, puede agregar algo a este objeto de exportación (funciones ...). requiere función devolverá este objeto. Este es el sistema de módulos de node.js (especificación commonJS).

Pero tenga cuidado de no modificar module.exports. De lo contrario, sus exportaciones actuales no tendrán sentido.


módulo es un objeto que representa lo que a ese archivo fuente particular le gustaría exponer públicamente. En lugar de tener algo similar a los archivos de cabecera en el mundo c / c ++, describa lo que exporta el módulo definiendo este objeto. el tiempo de ejecución del nodo utiliza este objeto para determinar qué pasa con el módulo ''público''.

es un concepto similar a las funciones de exportación de un dll en el mundo compilado. debe definir explícitamente a qué funciones puede acceder el mundo exterior. esto ayuda con la encapsulación y le permite organizar sus bibliotecas de una manera limpia.