Introducción e información
A través de la API oficial de Node.js, podemos ver que Node.js en sí proporciona muchos módulos centrales http://nodejs.org/api/. Estos módulos centrales se compilan en archivos binarios y se pueden obtener requeriendo ('nombre del módulo'); El módulo de núcleo tiene la prioridad de carga más alta (se reflejará cuando hay un módulo y el módulo de núcleo con el mismo nombre)
(Esta vez hablamos principalmente de módulos personalizados)
Node.js también tiene un tipo de módulo que es un módulo de archivo, que puede ser un archivo de código JavaScript (.js como sufijo de archivo), un archivo de texto de formato JSON (.json como sufijo de archivo) o un archivo c/c ++ editado (.node como sufijo de archivo);
Se accede al método de acceso al módulo de archivo a través de requerir ('/filename.suffix') require ('./ filename.suffix') requrie ('../ filename.suffix') y el sufijo de archivo se puede omitir; Comenzando con "/" se carga con una ruta absoluta, comenzando con "./" y comenzar con "../" significa cargar con una ruta relativa y comenzar con "./" significa cargarse con un archivo en un directorio del mismo nivel,
El sufijo de archivo mencionado anteriormente se puede omitir, el archivo JS prioritario que NodeJs intenta cargar> JSON Archivo> archivo de nodo
Crear un módulo personalizado
Tome un mostrador como ejemplo
La copia del código es la siguiente:
var outputVal = 0; // valor de salida
Var increment = 1; //Incremento
/* Establecer el valor de salida*/
función SEOUTPUTVAL (val) {
outputVal = val;
}
/* Establecer incremento*/
función setIncrement (incrementVal) {
incremento = incrementVal;
}
/* Producción*/
function printNextCount ()
{
outputVal += increment;
console.log (outputVal);
}
function PrintOutputVal () {
console.log (outputVal);
}
Exports.SeoutputVal = SEOUTPUTVAL;
exports.setIncrement = setIncrement;
módulo.exports.printNextCount = printNextCount;
Código fuente de muestra de módulo personalizado
El enfoque del ejemplo son las exportaciones y el módulo.exports; Proporciona una interfaz de acceso externo. Llamémoslo para ver el efecto.
Llamar módulos personalizados
La copia del código es la siguiente:
/*
Un archivo Node.js es un módulo, que puede ser código JavaScript, JSON o extensiones C/C ++ compiladas.
Dos objetos importantes:
requerir es obtener módulos desde el exterior
Las exportaciones exponen la interfaz del módulo
*/
Var contador = request ('./ 1_modules_custom_counter');
console.log ('Primera llamada al módulo [1_modules_custom_counter]');
contra.seoutputval (10); // establecer el conteo a partir de 10
Counter.setIncrement (10); // Establecer el incremento en 10
Counter.printNextCount ();
Counter.printNextCount ();
Counter.printNextCount ();
Counter.printNextCount ();
/*
Requerir llamadas al mismo módulo varias veces no se cargará repetidamente
*/
Var contador = request ('./ 1_modules_custom_counter');
console.log ('segundo módulo de llamada [1_modules_custom_counter]');
Counter.printNextCount ();
Código fuente de llamadas de modo personalizado
Ejecute y encuentre que se puede acceder a los métodos expuestos al público a través de exportaciones y módulos.
Como puede ver en el ejemplo, obtengo el módulo dos veces requeriendo ('./ 1_modules_custom_counter'), pero después de la segunda referencia, llamo al método printNextCount () comienza desde 60 ~~~
La razón es que Node.js llama al mismo módulo varias veces a través de requirequirequire y no se cargará repetidamente. Node.js caché todos los módulos de archivo cargados de acuerdo con el nombre del archivo, por lo que no se volverá a cargar.
Nota: El almacenamiento en caché a través del nombre de archivo se refiere al nombre del archivo real, y no se considerará archivos diferentes porque la ruta entrante es diferente.
Hay un método PrintOutputVal () en el archivo 1_modules_custom_counter que creé, que no proporciona métodos de acceso público a través de exportaciones o módulo.exports,
¿Qué sucede si accede directamente al archivo 1_modules_load?
La respuesta es: typeError: Object #<ject> no tiene ningún método 'PrintOutputVal'
Diferencia entre exportaciones y módulo.exports
A través del ejemplo anterior, tanto las exportaciones como el módulo. ¡Exports están disponibles para el acceso! Dado que ambos pueden lograr el efecto, debe haber una pequeña diferencia ~~~ ¡Tomemos un ejemplo!
La copia del código es la siguiente:
Var contador = 0;
exports.printNextCount = function () {
contador += 2;
console.log (contador);
}
var iseq = (exports === módulo.exports);
console.log (ISEQ);
2_modules_diff_exports.js Código fuente del archivo
Creemos un nuevo archivo 2_modules_diff_exports_load.js y llamárselo
La copia del código es la siguiente:
var contador = request ('./ 2_modules_diff_exports');
Counter.printNextCount ();
Después de llamar, el resultado de la ejecución es como se muestra en la figura anterior
ENTRO el valor de ISEQ en el archivo 2_modules_diff_exports_load.js (var iseq = (exports === módulo.exports);), el verdadero devuelto verdadero
PD: Tenga en cuenta que hay tres signos iguales. ¡Si no sabe lo que está buscando la información usted mismo!
No se apresure a sacar conclusiones, cambie estos dos archivos JS a los códigos correspondientes de módulo.
La copia del código es la siguiente:
// El código fuente modificado 2_modules_diff_exports.js es el siguiente
Var contador = 0;
módulo.exports = function () {
contador += 10;
this.printNextCount = function ()
{
console.log (contador);
}
}
var iseq = (exports === módulo.exports);
console.log (ISEQ);
La copia del código es la siguiente:
// El código fuente de archivo modificado 2_modules_diff_exports_load.js es el siguiente
var contador = request ('./ 2_modules_diff_exports');
var contraobj = nuevo contador ();
contraobj.printNextCount ();
Después de llamar, el resultado de la ejecución es como se muestra en la figura anterior
ENTRO el valor de ISEQ en el archivo 2_modules_diff_exports_load.js (var iseq = (exports === Module.exports);), y el falso devuelto, que es inconsistente con el resultado obtenido antes!
PD: No use contador.printNextCount (); Para acceder, solo obtendrá un mensaje de error
La API proporciona explicación
http://nodejs.org/api/modules.html
Tenga en cuenta que las exportaciones son una referencia al módulo. Exports que lo hacen adecuado solo para el aumento. Si está exportando un solo artículo, como un constructor, querrá usar módulo. Exports directamente en su lugar
Exports es solo una referencia de dirección a Module.Exports. NodeJS solo exportará el puntero de Module.Exports. Si el puntero de las exportaciones ha cambiado, es solo que las exportaciones no apuntan a módulo. Exports, por lo que no se exportarán nuevamente.
Consulte otros entendimientos:
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
http://zihua.li/2012/03/use-module-exports-or-exports-in-node/
Module.Exports es la interfaz real, Exports es solo una herramienta auxiliar para ella. El retorno final a la llamada es módulo.exports en lugar de exportaciones.
Todas las propiedades y métodos recopilados por las exportaciones se asignan a Module.Exports. Por supuesto, existe un requisito previo para esto, es decir, Module.Exports en sí no tiene ningún atributo o método.
Si Module.Exports ya tiene algunas propiedades y métodos, se ignorará la información recopilada por las exportaciones.
Exportaciones y módulo. EXPORTS ONVRIDE
Lo anterior también entiende básicamente la relación y la diferencia entre exportaciones y módulos.
Resultado de la llamada
Como se puede ver en los resultados, no hay error, lo que significa que se puede definir así, pero al final del módulo. Exports sobrescribe las exportaciones
Aunque el resultado no será producido por error, si lo usa así, inevitablemente habrá algunos problemas en el desarrollo.
1. Es mejor no definir módulo. Exportaciones y exportaciones por separado
2. Los desarrolladores de Nodejs recomiendan módulo. Exports para exportar objetos y exportarse para exportar múltiples métodos y variables.
otro...
Hay otros métodos proporcionados en la API, por lo que no entraré en detalles. Según el ejemplo anterior, lo sabrá usted mismo por usted mismo tan pronto como lo genere.
módulo.id
Devuelve el identificador del módulo de la cadena de tipo, que generalmente es el nombre de archivo totalmente analizado
módulo.fileName
Devuelve un nombre de archivo totalmente analizado de un tipo de cadena
módulo. Cargado
Devuelve un tipo de bool, indicando si la carga se completa
módulo.
Devuelve el módulo que hace referencia al módulo
módulo. Cifrados
Devuelve una matriz de todos los objetos del módulo a los que se hace referencia este módulo