module.exports
é o objeto que é realmente retornado como resultado de uma require
chamada.
A exports
variável é inicialmente configurada para o mesmo objeto (ou seja, é um "apelido" abreviado)); portanto, no código do módulo, você normalmente escreveria algo como isto:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
exportar (ou "expor") as funções com escopo interno myFunc1
e myFunc2
.
E no código de chamada você usaria:
const m = require('./mymodule');
m.myFunc1();
onde a última linha mostra como o resultado de require
é (geralmente) apenas um objeto simples cujas propriedades podem ser acessadas.
NB: se você substituir exports
, ele não fará mais referência module.exports
. Portanto, se você deseja atribuir um novo objeto (ou uma referência de função) exports
, também deve atribuir esse novo objeto amodule.exports
Vale ressaltar que o nome adicionado ao exports
objeto não precisa ser o mesmo que o nome do escopo interno do módulo para o valor que você está adicionando, para que você possa ter:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
Seguido por:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
Isso já foi respondido, mas eu gostaria de acrescentar alguns esclarecimentos ...
Você pode usar os dois
exports
emodule.exports
importar o código para seu aplicativo da seguinte maneira:var mycode = require('./path/to/mycode');
O caso de uso básico que você verá (por exemplo, no código de exemplo do ExpressJS) é que você define propriedades no
exports
objeto em um arquivo .js que depois importa usandorequire()
Portanto, em um exemplo simples de contagem, você pode ter:
(counter.js):
... em seu aplicativo (web.js ou realmente qualquer outro arquivo .js):
Em termos simples, você pode pensar nos arquivos necessários como funções que retornam um único objeto e adicionar propriedades (cadeias, números, matrizes, funções, qualquer coisa) ao objeto retornado, configurando-os
exports
.Às vezes, você deseja que o objeto retornado de uma
require()
chamada seja uma função que você pode chamar, em vez de apenas um objeto com propriedades. Nesse caso, você também precisa definirmodule.exports
, assim:(sayhello.js):
(app.js):
A diferença entre exportações e module.exports é explicada melhor nesta resposta aqui .
fonte
require
inicia em relação à pasta em que você executanode app.js
. Recomendamos que você poste uma nova pergunta com exemplos explícitos de código + estrutura da pasta para obter uma resposta mais clara.var sayHello = require('./ex6_module.js'); console.log(sayHello());
e módulo:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
o segundoexports
é apenas uma variável, certo? Em outras palavras, pode sermodule.exports = abc = function()
Observe que o mecanismo do módulo NodeJS é baseado nos módulos CommonJS suportados em muitas outras implementações como RequireJS , mas também SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js ou até mesmo Adobe Photoshop (via PSLib ) Você pode encontrar a lista completa de implementações conhecidas aqui .
A menos que seu módulo use recursos ou módulos específicos do nó, é altamente recomendável que você o utilize, em
exports
vez demodule.exports
que não faça parte do padrão CommonJS e, em seguida, principalmente não seja suportado por outras implementações.Outro recurso específico do NodeJS é quando você atribui uma referência a um novo objeto em
exports
vez de apenas adicionar propriedades e métodos a ele, como no último exemplo fornecido por Jed Watson neste encadeamento. Eu pessoalmente desencorajaria essa prática, pois isso quebra o suporte de referência circular do mecanismo de módulos CommonJS. Em seguida, ele não é suportado por todas as implementações e o exemplo Jed deve ser escrito desta maneira (ou semelhante) para fornecer um módulo mais universal:(sayhello.js):
(app.js):
Ou usando os recursos do ES6
(sayhello.js):
(app.js):
PS: Parece que o Appcelerator também implementa os módulos CommonJS, mas sem o suporte à referência circular (consulte: Appcelerator e módulos CommonJS (cache e referências circulares) )
fonte
Algumas coisas que você deve tomar cuidado se atribuir uma referência a um novo objeto para
exports
e / oumodules.exports
:1. Todas as propriedades / métodos anteriormente anexados ao original
exports
oumodule.exports
são perdidos, é claro, porque o objeto exportado agora fará referência a outro novoEste é óbvio, mas se você adicionar um método exportado no início de um módulo existente, verifique se o objeto exportado nativo não está referenciando outro objeto no final
2. No caso de um
exports
oumodule.exports
referenciar um novo valor, eles não fazem mais referência ao mesmo objeto3. Consequência complicada. Se você alterar a referência para ambos
exports
emodule.exports
, difícil dizer qual API está exposta (parece quemodule.exports
ganha)fonte
a propriedade module.exports ou o objeto exports permite que um módulo selecione o que deve ser compartilhado com o aplicativo
Eu tenho um vídeo sobre module_export disponível aqui
fonte
Ao dividir o código do programa em vários arquivos,
module.exports
é usado para publicar variáveis e funções para o consumidor de um módulo. Arequire()
chamada no seu arquivo de origem é substituída pela correspondentemodule.exports
carregada do módulo.Lembre-se de escrever módulos
module.exports
objeto também está disponível comoexports
abreviação. Mas, ao retornar uma única função, sempre usemodule.exports
.De acordo com: "Módulos Parte 2 - Escrevendo módulos" .
fonte
o link de referência é assim:
as propriedades de
exports
oumodule.exports
, como funções ou variáveis, serão expostas forahá algo que você deve prestar mais atenção: não
override
exporte.porque ?
porque exporta apenas a referência de module.exports, você pode adicionar as propriedades às exportações, mas se você substituir as exportações, o link de referência será quebrado.
bom exemplo :
mau exemplo :
Se você deseja apenas expor apenas uma função ou variável, assim:
este módulo expôs apenas uma função e a propriedade do nome é privada para o exterior.
fonte
Existem alguns módulos padrão ou existentes no node.js. quando você baixa e instala o node.js. como http, sys etc.
Como eles já estão no node.js, quando queremos usar esses módulos, basicamente gostamos dos módulos de importação , mas por quê? porque eles já estão presentes no node.js. Importar é como tirá-los do node.js e colocá-los em seu programa. E depois usá-los.
Enquanto Exports é exatamente o oposto, você está criando o módulo que deseja, digamos o módulo additional.js e colocando esse módulo no node.js, você o faz exportando-o.
Antes de escrever qualquer coisa aqui, lembre-se, module.exports.additionTwo é o mesmo que imports.additionTwo
Huh, então essa é a razão, gostamos
Tenha cuidado com o caminho
Digamos que você criou um módulo add.js,
Quando você executa isso no prompt de comando NODE.JS:
Isto irá errar ao dizer
Isso ocorre porque o processo node.js não pode adicionar o.js, pois não mencionamos o caminho. Portanto, podemos definir o caminho usando NODE_PATH
Agora, isso deve ser executado com sucesso, sem erros!
Mais uma coisa, você também pode executar o arquivo additional.js não configurando o NODE_PATH, de volta ao prompt de comando do nodejs:
Como estamos fornecendo o caminho aqui, dizendo que ele está no diretório atual,
./
isso também deve ser executado com êxito.fonte
Um módulo encapsula o código relacionado em uma única unidade de código. Ao criar um módulo, isso pode ser interpretado como mover todas as funções relacionadas para um arquivo.
Suponha que exista um arquivo Hello.js que inclua duas funções
Nós escrevemos uma função apenas quando a utilidade do código é mais de uma chamada.
Suponha que desejemos aumentar a utilidade da função para um arquivo diferente, como World.js, neste caso, exportar um arquivo entra em cena que pode ser obtido pelo module.exports.
Você pode apenas exportar ambas as funções pelo código fornecido abaixo
Agora você só precisa solicitar o nome do arquivo no World.js para usar essas funções
fonte
A intenção é:
Wikipedia
Eu imagino que fica difícil escrever programas grandes sem código modular / reutilizável. No nodejs, podemos criar programas modulares utilizando a
module.exports
definição do que expomos e compomos nosso programarequire
.fileLog.js
stdoutLog.js
program.js
executar
Agora tente trocar ./stdoutLog.js por ./fileLog.js .
fonte
Ele realiza o seguinte:
Ter módulos facilita a localização de certas partes do código, o que torna o nosso código mais sustentável.
NodejS
usa o sistema de módulo CommomJS que funciona da seguinte maneira:module.export
sintaxerequire('file')
sintaxeExemplo:
test1.js
test2.js
Outras coisas úteis a saber:
require()
é chamada no mesmo módulo, ela é retirada do cache.require()
imediatamente.fonte
fonte
return "Hello world"
não faz diferença), mas sem nenhuma explicação. Antes de responder, certifique-se de que sua resposta adicione algo ao assunto.