Nesta página ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), afirma que "Se você deseja definir o objeto de exportação para uma função ou um novo objeto, é necessário use o objeto module.exports. "
Minha pergunta é o porquê.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
Eu console.logging o resultado ( result=require(example.js)
) e o primeiro é [Function]
o segundo é {}
.
Poderia explicar o motivo por trás disso? Eu li o post aqui: module.exports vs exportações em Node.js . É útil, mas não explica o motivo pelo qual foi projetado dessa maneira. Haverá um problema se a referência das exportações for retornada diretamente?
javascript
node.js
commonjs
Xiao Peng - ZenUML.com
fonte
fonte
module.exports
.exports
, por exemplo, github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, você nunca vai estar errado, mas você pode usarexports
se você não está substituindo o padrão exportados objeto, isto é, se você simplesmente anexar propriedades como esta:var foo = require('foo').foo
. Estafoo
propriedade pode ser exportada assim:exports.foo = ...
e, claro, também commodule.exports
. É uma escolha pessoal, mas atualmente estou usandomodule.exports
e de formaexports
adequada.Respostas:
module
é um objeto JavaScript simples com umaexports
propriedadeexports
é uma variável JavaScript simples que passa a ser definido comomodule.exports
. No final do seu arquivo, o node.js basicamente 'retornará'module.exports
àrequire
função. Uma maneira simplificada de visualizar um arquivo JS no Node pode ser:Se você definir uma propriedade
exports
comoexports.a = 9;
, que será configuradamodule.exports.a
também porque os objetos são passados como referências em JavaScript, o que significa que, se você definir várias variáveis para o mesmo objeto, elas serão todas o mesmo objeto; então,exports
emodule.exports
são o mesmo objeto.Mas se você definir
exports
algo novo, ele não será mais definido comomodule.exports
, portanto,exports
emodule.exports
não será mais o mesmo objeto.fonte
module.exports
descreve-lo também: nodejs.org/api/modules.html#modules_module_exportsA resposta de Renee está bem explicada. Além da resposta com um exemplo:
O Nó faz muitas coisas no seu arquivo e um dos importantes é ENVIAR o arquivo. O código-fonte interno nodejs "module.exports" é retornado. Vamos dar um passo atrás e entender o invólucro. Suponha que você tenha
greet.js
o código acima é agrupado como IIFE (expressão de função imediatamente chamada) no código-fonte nodejs da seguinte maneira:
e a função acima é invocada (.apply ()) e retornada module.exports. No momento, module.exports e exporta apontando para a mesma referência.
Agora, imagine que você reescreve greet.js como
a saída será
o motivo é: module.exports é um objeto vazio. Nós não configuramos nada para module.exports, em vez disso, definimos exportações = function () ..... no novo greet.js. Portanto, module.exports está vazio.
Tecnicamente as exportações e module.exports devem apontar para a mesma referência (isso está correto !!). Mas usamos "=" ao atribuir function () .... às exportações, o que cria outro objeto na memória. Portanto, module.exports e export produzem resultados diferentes. Quando se trata de exportações, não podemos substituí-lo.
Agora, imagine que você reescreve (isso é chamado de Mutação) greet.js (consultando a resposta de Renee) como
a saída será
Como você pode ver module.exports e exportações estão apontando para a mesma referência, que é uma função. Se você configurar uma propriedade em exportações, ela será configurada em module.exports porque, em JS, os objetos são passados por referência.
A conclusão é sempre usar module.exports para evitar confusão. Espero que isto ajude. Feliz codificação :)
fonte
Além disso, algumas coisas que podem ajudar a entender:
math.js
client.js
Ótimo, neste caso:
Portanto, por padrão, "this" é realmente igual a module.exports.
No entanto, se você alterar sua implementação para:
math.js
Nesse caso, funcionará bem, no entanto, "this" não é mais igual a module.exports, porque um novo objeto foi criado.
E agora, o que será retornado pelo requisito é o que foi definido dentro do módulo. Exportações, não isso ou exportações, mais.
Outra maneira de fazer isso seria:
math.js
Ou:
math.js
fonte
A resposta de René sobre a relação entre
exports
emodule.exports
é bastante clara: trata-se de referências a javascript. Só quero adicionar que:Vemos isso em muitos módulos de nós:
var app = exports = module.exports = {};
Isso garantirá que, mesmo se alteramos o module.exports, ainda podemos usar as exportações fazendo essas duas variáveis apontarem para o mesmo objeto.
fonte
module.exports
eexports
são variáveis apenas separadas, inicializados para referenciar o mesmo objeto. Se você alterar o que uma variável faz referência, as duas variáveis não fazem mais referência à mesma coisa. A linha de código acima garante que ambas as variáveis sejam inicializadas no mesmo novo objeto.myTest.js
exports
emodule.exports
são os mesmos e uma referência ao mesmo objeto. Você pode adicionar propriedades de duas maneiras, conforme sua conveniência.fonte