Descrição do Problema
Este blog resolverá os seguintes problemas:
- A conexão e a diferença entre o módulo.exportações e exportações
- Importar e exportar regras de módulos no Node
- Análise de princípios, compreensão profunda da essência
1. Introdução aos módulos no Node
O Node fornece muitas APIs de nível de servidor para JavaScript e a maioria dessas APIs são empacotadas em um módulo de núcleo nomeado.
- Por exemplo, o módulo fs core para operações de arquivo, o módulo http construído por serviços http, o módulo de operação de caminho e o módulo de informações do sistema operacional os
- Não há escopo global no nó, apenas escopo do módulo
O método require tem duas funções
- Carregue o módulo de arquivo e execute o código nele
- Obtenha o objeto de interface exportado do módulo de arquivo carregado
Existem três tipos de módulos no Node
- Módulos principais : fornecidos pelo próprio Node, como módulo de operação de arquivo fs, módulo de operação de rede http
- Módulos de terceiros : fornecidos por terceiros, use o tempo necessário para
npm
fazer o download antes de poder ser carregado usando - Módulos escritos por usuários : não é fácil escrever e manter quando escrevemos muitos códigos em arquivos, então podemos considerar dividir o código no arquivo em vários arquivos, e esses arquivos criados por nós mesmos são módulos de usuário
2. Regras de importação e exportação
2.1 Exportar vários membros
método um:
//导出
module.exports.a = 'hello';
module.exports.add = function () {
console.log('add');
}
//导入
let test = require('./a.js')
console.log(test);//{ a: 'hello', add: [Function] }
Porque há muita escrita em cima do tipo de ponto a ponto, muitos problemas e, portanto, fornece o
exports
objeto Node , oexports 和 module.exports
ponto padrão para a mesma referência
Método dois:
//导出
exports.a = "hello";
exports.add = function () {
console.log("add");
}
//导入
let test = require('./a.js')
console.log(test);//{ a: 'hello', add: [Function] }
Método três (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 um único membro
Só existe uma maneira, só 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
exports = ***
que não posso exportar um único membro? Vamos tentar
//导出
exports = 'hello';
//导入
let test = require('./a.js')
console.log(test);
//{} 结果是是一个空对象
3. Análise de princípio
- No Node, dentro de cada módulo, existe um módulo objeto
- No objeto do módulo , há um atributo
exports
, as exportações também são um objeto
var module = {
exports: {
}
}
- Bem como um membro do módulo
exports
é equivalente amodule.exports
var exports = module.exports
console.log(exports === module.exports) // => true
-
Por padrão, há uma frase no final do código: Em
return module.exports;
outras palavras, o último exportadomodule.exports
, usamos erequire
obtemosmodule.exports
, as regras acima são todas implementadas no nível inferior, não podemos vê-lo. -
Demonstração 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
Deixe-me explicar desenhando uma imagem:
(1) nenhuma reatribuição de exportações, padrão module.exports
e exports
apontam para o mesmo objeto na memória.
(2) reatribuição de exportações, exports
a desconexão e module.exports
conexão
(3) Podemos também restabelecer as referências de relacionamento de conexão, useexports = module.exports
4. Leitura estendida
https://blog.csdn.net/weixin_43974265/category_10692693.html