Introdução e informação
Através da API oficial do Node.js, podemos ver que o próprio Node.js fornece muitos módulos principais http://nodejs.org/api/. Esses módulos principais são compilados em arquivos binários e podem ser obtidos exigindo ('nome do módulo'); O módulo do núcleo tem a maior prioridade de carga (será refletida quando houver um módulo e o módulo principal com o mesmo nome)
(Desta vez, falamos principalmente sobre módulos personalizados)
O Node.js também possui um tipo de módulo que é um módulo de arquivo, que pode ser um arquivo de código JavaScript (.js como sufixo de arquivo), um arquivo de texto de formato json (.json como sufixo de arquivo) ou um arquivo c/c ++ editado (.node como sufixo de arquivo);
O método de acesso ao módulo de arquivo é acessado através do requer ('/filename.Suffix') require ('./ filename.suffix') requrie ('../ filename.suffix') e o sufixo do arquivo pode ser omitido; Começando com "/" é carregado com um caminho absoluto, começando com "./" e começando com "../" significa carregar com um caminho relativo e começar com "./" significa carregar com um arquivo em um diretório do mesmo nível,
O sufixo de arquivo mencionado anteriormente pode ser omitido, o arquivo JS prioritário que o NodeJS tenta carregar> JSON FILE> NODE FILE
Crie um módulo personalizado
Aceite um balcão como exemplo
A cópia do código é a seguinte:
var outputVal = 0; // valor de saída
var incremento = 1; //Incremento
/* Defina o valor da saída*/
função seoutputVal (val) {
outputVal = val;
}
/* Defina incremento*/
função setIncrement (incrementVal) {
incremento = incremento;
}
/* Saída*/
função printNextCount ()
{
outputVal += incremento;
console.log (outputVal);
}
função printOutputVal () {
console.log (outputVal);
}
exports.seOutputVal = SeOutputVal;
exports.setIncrement = setIncrement;
module.exports.printNextCount = printNextCount;
Código fonte de amostra do módulo personalizado
O foco do exemplo é exportação e módulo.Exports; Ele fornece uma interface de acesso externa. Vamos chamá -lo para ver o efeito.
Chamando módulos personalizados
A cópia do código é a seguinte:
/*
Um arquivo Node.js é um módulo, que pode ser o código JavaScript, JSON ou Extensões C/C ++ compiladas.
Dois objetos importantes:
exigir é obter módulos de fora
Exportações expõe a interface do módulo
*/
var contador = requer ('./ 1_modules_custom_counter');
console.log ('primeira chamada para o módulo [1_modules_custom_counter]');
contador.seOutputVal (10); // Defina a contagem a partir de 10
contador.setIncrement (10); // Defina o incremento para 10
contador.printNextCount ();
contador.printNextCount ();
contador.printNextCount ();
contador.printNextCount ();
/*
Exigir chamadas para o mesmo módulo várias vezes não serão carregadas repetidamente
*/
var contador = requer ('./ 1_modules_custom_counter');
console.log ('Módulo de segunda chamada [1_modules_custom_counter]');
contador.printNextCount ();
Código fonte de chamada de modo personalizado
Execute -o e descobre que ambos os métodos expostos ao público por meio de exportações e module.Exports podem ser acessados!
Como você pode ver no exemplo, recebo o módulo duas vezes exigindo ('./ 1_modules_custom_counter'), mas após a segunda referência, chamo o método PrintNextCount () começa de 60 ~~~
O motivo é que o Node.js chama o mesmo módulo várias vezes por meio do requisito e não será carregado repetidamente. O Node.js cache todos os módulos de arquivo carregados de acordo com o nome do arquivo, para que não seja recarregado.
Nota: armazenamento em cache através do nome do arquivo refere -se ao nome do arquivo real e não será considerado arquivos diferentes porque o caminho de entrada é diferente.
Existe um método PrintOutputVal () no arquivo 1_modules_custom_counter que eu criei, que não fornece métodos de acesso público por meio de exportações ou module.exports,
O que acontece se você acessar diretamente o arquivo 1_modules_load?
A resposta é: TypeError: Object #<Becut> não tem método 'PrintOutputVal'
Diferença entre exportações e módulo.exports
Através do exemplo acima, as exportações e o Module.Exports estão disponíveis para acesso! Como ambos podem alcançar o efeito, deve haver uma pequena diferença ~~~ Vamos dar um exemplo!
A cópia do código é a seguinte:
var contador = 0;
exports.printNextCount = function () {
contador += 2;
console.log (contador);
}
var iseq = (exports === Module.exports);
console.log (ISEQ);
2_modules_diff_exports.js Código fonte de arquivo
Vamos criar um novo arquivo 2_modules_diff_exports_load.js e chamá -lo
A cópia do código é a seguinte:
var contador = requer ('./ 2_modules_diff_exports');
Contador.printNextCount ();
Após a chamada, o resultado da execução é como mostrado na figura acima
Eu produzi o valor do ISEQ no arquivo 2_modules_diff_exports_load.js (var iseq = (exports === Module.exports);), o verdadeiro verdadeiro
PS: Observe que existem três sinais iguais. Se você não sabe o que você está procurando!
Não se apresse em tirar conclusões, altere esses dois arquivos JS para os códigos correspondentes do Module.Exports
A cópia do código é a seguinte:
// O código -fonte modificado 2_modules_diff_exports.js é o seguinte
var contador = 0;
module.exports = function () {
contador += 10;
this.printNextCount = function ()
{
console.log (contador);
}
}
var iseq = (exports === Module.exports);
console.log (ISEQ);
A cópia do código é a seguinte:
// o 2_modules modificado_diff_exports_load.js O código -fonte do arquivo é o seguinte
var contador = requer ('./ 2_modules_diff_exports');
var contraObj = new Counter ();
contraObj.printNextCount ();
Após a chamada, o resultado da execução é como mostrado na figura acima
Eu produzi o valor do ISEQ no arquivo 2_modules_diff_exports_load.js (var iseq = (exports === Module.exports);), e o retorno falso, que é inconsistente com o resultado obtido antes!
PS: não use contador.printNextCount (); Para acessar, você receberá apenas um prompt de erro
A API fornece explicação
http://nodejs.org/api/modules.html
Observe que as exportações são uma referência ao Module.Exports, tornando -o adequado apenas para aumento. Se você estiver exportando um único item, como um construtor, você deseja usar o Module.Exports diretamente
As exportações são apenas uma referência de endereço ao Module.Exports. O NodeJS exportará apenas o ponteiro do Module.Exports. Se o ponteiro das exportações foi alterado, é apenas que as exportações não estão apontando para o módulo.Exports, para que não sejam exportadas novamente.
Consulte outros entendimentos:
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 é a interface real, as exportações são apenas uma ferramenta auxiliar para ela. O retorno final à chamada é o Module.Exports em vez de exportações.
Todas as propriedades e métodos coletados pelas exportações são atribuídos ao Module.Exports. Obviamente, existe um pré -requisito para isso, ou seja, o Module.exporta em si não possui nenhum atributo ou métodos.
Se o Module.Exports já tiver algumas propriedades e métodos, as informações coletadas pelas exportações serão ignoradas.
exportações e module.exports substituem
O exposto acima também entende basicamente a relação e a diferença entre exportações e module.exports, mas se exportações e module. Existir existir para o método PrintNextCount (), qual é o resultado?
Resultado da chamada
Como pode ser visto nos resultados, não há erro, o que significa que ele pode ser definido assim, mas no módulo final. Exporta substitui as exportações
Embora o resultado não seja produzido por erros, se você o usar assim, haverá inevitavelmente alguns problemas no desenvolvimento.
1. É melhor não definir o módulo. Exporta e exporta separadamente
2.Nodejs Developers Recomendam o Module.Exports para exportar objetos e exportações para exportar vários métodos e variáveis.
outro...
Existem outros métodos fornecidos na API, por isso não entrarei em detalhes. Com base no exemplo acima, você o saberá sozinho assim que a produzir.
Module.id
Retorna o identificador do módulo da string de tipo, que geralmente é o nome do arquivo totalmente analisado
Module.Filename
Retorna um nome de arquivo totalmente analisado de um tipo de string
Module.loaded
Retorna um tipo bool, indicando se o carregamento está concluído
Module.parent
Retorna o módulo que faz referência ao módulo
Module.Children
Retorna uma matriz de todos os objetos do módulo referenciados por este módulo