module.exports
es el objeto que en realidad se devuelve como resultado de una require
llamada.
La exports
variable se establece inicialmente en ese mismo objeto (es decir, es un "alias" abreviado), por lo que en el código del módulo generalmente escribiría algo como esto:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
exportar (o "exponer") las funciones de ámbito interno myFunc1
y myFunc2
.
Y en el código de llamada usarías:
const m = require('./mymodule');
m.myFunc1();
donde la última línea muestra cómo el resultado de require
(por lo general) es solo un objeto simple a cuyas propiedades se puede acceder.
NB: si sobrescribe exports
, ya no se hará referencia module.exports
. Entonces, si desea asignar un nuevo objeto (o una referencia de función), exports
entonces también debe asignar ese nuevo objeto amodule.exports
Vale la pena señalar que el nombre agregado al exports
objeto no tiene que ser el mismo que el nombre de alcance interno del módulo para el valor que está agregando, por lo que podría tener:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
seguido por:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
Esto ya ha sido respondido pero quería agregar algunas aclaraciones ...
Puede usar ambos
exports
ymodule.exports
para importar código en su aplicación de esta manera:var mycode = require('./path/to/mycode');
El caso de uso básico que verá (por ejemplo, en el código de ejemplo de ExpressJS) es que establece propiedades en el
exports
objeto en un archivo .js que luego importa utilizandorequire()
Entonces, en un ejemplo de conteo simple, podría tener:
(counter.js):
... luego en su aplicación (web.js, o realmente cualquier otro archivo .js):
En términos simples, puede pensar en los archivos necesarios como funciones que devuelven un solo objeto, y puede agregar propiedades (cadenas, números, matrices, funciones, cualquier cosa) al objeto que se devuelve al configurarlos
exports
.A veces, querrá que el objeto devuelto de una
require()
llamada sea una función a la que pueda llamar, en lugar de solo un objeto con propiedades. En ese caso, también debe establecermodule.exports
, de esta manera:(sayhello.js):
(app.js):
La diferencia entre exportaciones y module.exports se explica mejor en esta respuesta aquí .
fuente
require
comienza en relación con la carpeta en la que se ejecutanode app.js
. Le recomiendo que publique una nueva pregunta con código explícito + ejemplos de estructura de carpetas para obtener una respuesta más clara.var sayHello = require('./ex6_module.js'); console.log(sayHello());
y módulo:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
el segundoexports
es solo una variable ¿verdad? En otras palabras, puede sermodule.exports = abc = function()
Tenga en cuenta que el mecanismo del módulo NodeJS se basa en módulos CommonJS que son compatibles con muchas otras implementaciones como RequireJS , pero también SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js o incluso Adobe Photoshop (a través de PSLib ) Puede encontrar la lista completa de implementaciones conocidas aquí .
A menos que su módulo use funciones o módulos específicos del nodo, le recomiendo que lo use en
exports
lugar de lomodule.exports
que no forma parte del estándar CommonJS y, en general, no es compatible con otras implementaciones.Otra característica específica de NodeJS es cuando asigna una referencia a un nuevo objeto en
exports
lugar de simplemente agregarle propiedades y métodos, como en el último ejemplo proporcionado por Jed Watson en este hilo. Yo personalmente desaconsejaría esta práctica ya que esto rompe el soporte de referencia circular del mecanismo de módulos CommonJS. Entonces no es compatible con todas las implementaciones y el ejemplo Jed debería escribirse de esta manera (o uno similar) para proporcionar un módulo más universal:(sayhello.js):
(app.js):
O usando las funciones de ES6
(sayhello.js):
(app.js):
PD: Parece que Appcelerator también implementa módulos CommonJS, pero sin el soporte de referencia circular (ver: módulos Appcelerator y CommonJS (almacenamiento en caché y referencias circulares) )
fuente
Algunas cosas que debe tener cuidado si asigna una referencia a un nuevo objeto
exports
y / omodules.exports
:1. Todas las propiedades / métodos previamente adjuntos al original
exports
omodule.exports
, por supuesto, se pierden porque el objeto exportado ahora hará referencia a otro nuevoEsto es obvio, pero si agrega un método exportado al comienzo de un módulo existente, asegúrese de que el objeto exportado nativo no haga referencia a otro objeto al final
2. En caso de que uno de
exports
omodule.exports
haga referencia a un nuevo valor, ya no hacen referencia al mismo objeto3. Consecuencia complicada. Si cambia la referencia a ambos
exports
ymodule.exports
, es difícil decir qué API está expuesta (parece quemodule.exports
gana)fuente
la propiedad module.exports o el objeto de exportaciones permite que un módulo seleccione lo que se debe compartir con la aplicación
Tengo un video sobre module_export disponible aquí
fuente
Al dividir el código de su programa en varios archivos,
module.exports
se utiliza para publicar variables y funciones para el consumidor de un módulo. Larequire()
llamada en su archivo fuente se reemplaza con la correspondientemodule.exports
cargada desde el módulo.Recuerde cuando escriba módulos
module.exports
objeto también está disponible comoexports
taquigrafía. Pero cuando devuelva una única función, use siempremodule.exports
.Según: "Módulos Parte 2 - Módulos de escritura" .
fuente
el enlace de referencia es así:
las propiedades de
exports
omodule.exports
, como funciones o variables, se expondrán fueraHay algo a lo que debe prestar más atención: no
override
exportar.por qué ?
debido a que exporta solo la referencia de module.exports, puede agregar las propiedades a las exportaciones, pero si anula las exportaciones, el enlace de referencia se romperá.
buen ejemplo :
mal ejemplo :
Si solo desea exponer solo una función o variable, así:
este módulo solo expuso una función y la propiedad de nombre es privada para el exterior.
fuente
Hay algunos módulos predeterminados o existentes en node.js cuando descarga e instala node.js como http, sys, etc.
Como ya están en node.js, cuando queremos usar estos módulos básicamente nos gustan los módulos de importación , pero ¿por qué? porque ya están presentes en el nodo.js. Importar es como tomarlos de node.js y ponerlos en su programa. Y luego usándolos.
Considerando que las exportaciones es exactamente lo contrario, está creando el módulo que desea, digamos el módulo add.js y colocando ese módulo en el node.js, lo hace al exportarlo.
Antes de escribir algo aquí, recuerde, module.exports.additionTwo es lo mismo que exportaciones.additionTwo
Huh, esa es la razón, nos gusta
Ten cuidado con el camino
Digamos que ha creado un módulo add.js,
Cuando ejecuta esto en su símbolo del sistema NODE.JS:
Esto se equivocará diciendo
Esto se debe a que el proceso node.js no puede agregar.js ya que no mencionamos la ruta. Entonces, podemos establecer la ruta usando NODE_PATH
¡Ahora, esto debería ejecutarse con éxito sin ningún error!
Una cosa más, también puede ejecutar el archivo add.js al no configurar NODE_PATH, de vuelta a su símbolo del sistema nodejs:
Dado que estamos proporcionando la ruta aquí al decir que está en el directorio actual,
./
esto también debería ejecutarse con éxito.fuente
Un módulo encapsula el código relacionado en una sola unidad de código. Al crear un módulo, esto puede interpretarse como mover todas las funciones relacionadas a un archivo.
Supongamos que hay un archivo Hello.js que incluye dos funciones
Escribimos una función solo cuando la utilidad del código es más de una llamada.
Supongamos que queremos aumentar la utilidad de la función a un archivo diferente, digamos World.js, en este caso, la exportación de un archivo aparece en una imagen que puede obtenerse mediante module.exports.
Puede exportar tanto la función por el código que figura a continuación
Ahora solo necesita solicitar el nombre del archivo en World.js para poder usar esas funciones
fuente
La intención es:
Wikipedia
Me imagino que se hace difícil escribir programas grandes sin código modular / reutilizable. En nodejs podemos crear programas modulares utilizando la
module.exports
definición de lo que exponemos y componimos nuestro programarequire
.fileLog.js
stdoutLog.js
program.js
ejecutar
Ahora intente intercambiar ./stdoutLog.js por ./fileLog.js .
fuente
Logra lo siguiente:
Tener módulos hace que sea más fácil encontrar ciertas partes del código, lo que hace que nuestro código sea más fácil de mantener.
NodejS
utiliza el sistema de módulos CommomJS que funciona de la siguiente manera:module.export
sintaxisrequire('file')
sintaxisEjemplo:
test1.js
test2.js
Otras cosas útiles para saber:
require()
se llama a en el mismo módulo, se extrae del caché.require()
inmediato.fuente
fuente
return "Hello world"
no hace ninguna diferencia), pero sin ninguna explicación. Antes de responder, asegúrese de que su respuesta agregará algo al tema.