Las reglas de importación y exportación y el análisis de principios de módulos en Node.js

Descripción del problema

Este blog resolverá los siguientes problemas:

  • La conexión y diferencia entre module.exports y export
  • Importar y exportar reglas de módulos en Node
  • Análisis de principios, comprensión profunda de la esencia.

1. Introducción a los módulos en Node

Node proporciona muchas API de nivel de servidor para JavaScript, y la mayoría de estas API están empaquetadas en un módulo central con nombre.

  • Por ejemplo, el módulo principal fs para operaciones de archivos, el módulo http construido por servicios http, el módulo de operación de ruta y el módulo de información del sistema operativo os
  • No hay alcance global en el nodo, solo alcance del módulo

El método require tiene dos funciones

  • Cargue el módulo de archivo y ejecute el código en él
  • Obtener el objeto de interfaz exportado desde el módulo de archivo cargado

Hay tres tipos de módulos en Node

  1. Módulos principales : proporcionados por el propio nodo, como el módulo de operación de archivos fs, el módulo de operación de red http
  2. Módulos de terceros : proporcionados por un tercero, uso del tiempo que necesitamos para npmdescargar antes de que se pueda cargar usando
  3. Módulos escritos por usuarios : no es fácil de escribir y mantener cuando escribimos mucho código en archivos, por lo que podemos considerar dividir el código en el archivo en varios archivos, luego estos archivos creados por nosotros mismos son módulos de usuario

2. Normas de importación y exportación

2.1 Exportar varios miembros

método uno:

//导出
module.exports.a = 'hello';
module.exports.add = function () {
    
    
  console.log('add');
}

//导入
let test = require('./a.js')
console.log(test);//{ a: 'hello', add: [Function] }

Debido a que hay mucho escrito además del tipo de punto a punto, demasiados problemas y, por lo tanto, proporciona el exportsobjeto Nodo , el exports 和 module.exportspunto predeterminado para la misma referencia.

Método dos:

//导出
exports.a = "hello";
exports.add = function () {
    
    
  console.log("add");
}

//导入
let test = require('./a.js')
console.log(test);//{ a: 'hello', add: [Function] }

Método tres (recomendado):

//导出
module.exports = {
    
    
  a: 'hello',
  add: function () {
    
    
    console.log('add');
  }
}

//导入
let test = require('./a.js')
console.log(test);//{ a: 'hello', add: [Function: add] }

2.2 Exportar un solo miembro

Solo hay una forma, solo usemodule.exports = ***

//导出
module.exports = 'hello';

//导入
let test = require('./a.js')
console.log(test);//hello
//导出
module.exports = 'hello';

//后者会覆盖前者
module.exports = function () {
    
    
  console.log('add');
}

//导入
let test = require('./a.js')
console.log(test);//[Function]

¿Por qué exports = ***no puedo exportar un solo miembro? Intentemos

//导出
exports = 'hello';

//导入
let test = require('./a.js')
console.log(test);
//{} 结果是是一个空对象

3. Análisis de principios

  • En Node, dentro de cada módulo, hay un módulo de objeto
  • En el objeto del módulo , hay un atributo exports, las exportaciones también son un objeto
var module = {
    
    
    exports: {
    
    }
}
  • Así como miembro del módulo exportses equivalente amodule.exports
var exports = module.exports
console.log(exports === module.exports) // => true
  • Por defecto, hay una frase al final del código: return module.exports; es decir, la última exportadamodule.exports , usamos y requireobtenemos la misma module.exports, las reglas anteriores se implementan en la parte inferior, no podemos ver.

  • Demostración de código

// 把下面这些代码想象成模块内部的底层实现

// 每个模块内部都有一个 module 对象
// module 对象中有一个成员 exports 也是一个对象
var module = {
    
    
  exports: {
    
    }
}

// 模块中同时还有一个成员 exports 等价于 module.exports
var exports = module.exports

console.log(exports === module.exports) // => true

// 这样是可以的,因为 exports === module.exports
// module.exports.a = 123
// exports.b = 456

// 对exports重新赋值会断开和 module.exports 的连接,
// 因此这样并不能导出单个成员,因为模块最后 return 的是 module.exports
// exports = function () {
    
    
// }

// 这才是导出单个成员的正确方式
module.exports = function () {
    
    
  console.log(123)
}

// 最后导出的是 module.exports
return module.exports

Déjame explicarlo haciendo un dibujo:

(1) sin reasignación de exportaciones, por defecto module.exportsy exportsapuntan al mismo objeto en la memoria.
Inserte la descripción de la imagen aquí
(2) reasignación de exportaciones, exportsla desconexión y module.exportsconexión
Inserte la descripción de la imagen aquí
(3) También podemos restablecer las referencias de relación de conexión, utilizarexports = module.exports


4. Lectura ampliada

https://blog.csdn.net/weixin_43974265/category_10692693.html

Supongo que te gusta

Origin blog.csdn.net/weixin_43974265/article/details/111823622
Recomendado
Clasificación