Qué hacer " módulo.exportaciones " y " exportaciones.métodos " mean in NodeJS / Express?


Mirando un archivo fuente aleatorio del framework 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 el primer fragmento de 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 lo que significa el código en la línea.

¿Qué significan en realidad exports y module.exports?

Creo que la 2da pieza de código permite que las funciones en el archivo accedan a methods, pero nuevamente, cómo exactamente hace esto.

, Básicamente, ¿qué son estas palabras mágicas: module y exports?

Author: nbro, 2011-05-25

4 answers

Para ser más específicos:

module es la variable de ámbito global dentro de un archivo.

Así que si llamas require("foo") entonces:

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

Actúa de la misma manera que 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 que implica mutar el alcance global y esto es MAL

exports es una variable que vive en module.exports. Es básicamente lo que exportas cuando se requiere un archivo.

// foo.js
module.exports = 42;

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

Hay un problema menor con exports por sí solo. El contexto de ámbito _global + y moduleson no lo mismo. (En el navegador el contexto de ámbito global y window 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

 79
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:07

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 configurándolos en module.exports, como sigue:

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

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

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

También puedes anular module.exports enteramente para proporcionar simplemente un solo objeto sobre 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 bonito prototipo: {[17]]}

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

Hay muchas otras formas de jugar con module.exports y require. Sólo recuerda, 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 debe devolverse en la función asignada a module.exports. De lo contrario, obtendrás un TypeError:

console.log(g1.foo())
          ^
TypeError: Cannot read property 'foo' of undefined
 33
Author: Thom Blake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-22 16:53:51

Puedes encontrar la mejor respuesta en node.código fuente js. Si alguien está requiriendo tu módulo js, su script 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...
});

El nodo envolverá tu script. 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);

Así que en tu guión,

exports is just module.exports.

En su script, puede agregar algo a este objeto exports (functions..). la función require devolverá este objeto. Este es Node.sistema de módulos de js (CommonJS especificación).

Pero tenga cuidado de no modificar el módulo.exportación. De lo contrario, sus exportaciones actuales no tendrán sentido.

 15
Author: jeremyko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-30 16:35:36

El módulo es un objeto que representa lo que ese archivo fuente en particular desea exponer públicamente. En lugar de tener algo similar a los archivos de encabezado en el mundo de c/c++, describe lo que exporta el módulo definiendo este objeto. el tiempo de ejecución del nodo entonces usa este objeto para determinar qué de su módulo es ' público.'

Es un concepto similar a exportar funciones desde una dll en el mundo compilado. usted tiene que definir explícitamente qué funciones se puede acceder por el el mundo exterior. esto ayuda con la encapsulación y le permite organizar sus bibliotecas de una manera limpia.

 1
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-24 22:05:30