Sur cette page ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), il est indiqué que "Si vous souhaitez définir l'objet d'exportation sur une fonction ou un nouvel objet, vous devez utilisez l'objet module.exports. "
Ma question est pourquoi.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
J'ai console.logged le résultat ( result=require(example.js)
) et le premier est [Function]
le second {}
.
Pourriez-vous s'il vous plaît expliquer la raison derrière cela? J'ai lu le post ici: module.exports vs exportations en Node.js . Il est utile, mais n'explique pas la raison pour laquelle il est conçu de cette manière. Y aura-t-il un problème si la référence des exportations est retournée directement?
javascript
node.js
commonjs
Xiao Peng - ZenUML.com
la source
la source
module.exports
.exports
, par exemple github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, vous ne serez jamais tort, mais vous pouvez utiliserexports
si vous n'êtes pas remplacer la valeur par défaut objet exporté, qui est, si vous attachez simplement des propriétés comme ceci:var foo = require('foo').foo
. Cettefoo
propriété peut être exportée comme ceci:exports.foo = ...
et bien sûr aussi avecmodule.exports
. C'est un choix personnel mais j'utilise actuellementmodule.exports
et deexports
manière appropriée.Réponses:
module
est un objet JavaScript simple avec uneexports
propriété.exports
est une simple variable JavaScript qui se trouve être définie surmodule.exports
. À la fin de votre fichier, node.js «reviendra» essentiellementmodule.exports
à larequire
fonction. Une façon simplifiée d'afficher un fichier JS dans Node pourrait être la suivante:Si vous définissez une propriété sur
exports
, par exempleexports.a = 9;
, elle sera également définiemodule.exports.a
car les objets sont transmis en tant que références en JavaScript, ce qui signifie que si vous définissez plusieurs variables sur le même objet, elles sont toutes le même objet; alorsexports
etmodule.exports
sont le même objet.Mais si vous définissez
exports
quelque chose de nouveau, il ne sera plus mis àmodule.exports
, donc ,exports
etmodule.exports
ne sont plus le même objet.la source
module.exports
décrit aussi: nodejs.org/api/modules.html#modules_module_exportsLa réponse de Renée est bien expliquée. Ajout à la réponse avec un exemple:
Node fait beaucoup de choses sur votre fichier et l'un des plus importants est d'ENVELOPPER votre fichier. Le code source de nodejs "module.exports" est retourné. Permet de prendre du recul et de comprendre le wrapper. Supposons que vous ayez
salue.js
le code ci-dessus est encapsulé comme IIFE (expression de fonction immédiatement invoquée) dans le code source de nodejs comme suit:
et la fonction ci-dessus est invoquée (.apply ()) et renvoyée module.exports. Pour le moment, module.exports et exports pointent vers la même référence.
Maintenant, imaginez que vous réécrivezreet.js comme
la sortie sera
la raison en est: module.exports est un objet vide. Nous n'avons pas défini quoi que ce soit sur module.exports, nous avons plutôt défini exports = function () ..... dans le nouveau message d'accueil.js. Ainsi, module.exports est vide.
Techniquement, les exportations et module.exports doivent pointer vers la même référence (c'est correct !!). Mais nous utilisons "=" lors de l'attribution de la fonction () .... aux exportations, ce qui crée un autre objet dans la mémoire. Ainsi, module.exports et exports produisent des résultats différents. En ce qui concerne les exportations, nous ne pouvons pas passer outre.
Maintenant, imaginez que vous réécrivez (cela s'appelle Mutation)
la sortie sera
Comme vous pouvez le voir, module.exports et exports pointent vers la même référence qui est une fonction. Si vous définissez une propriété sur les exportations, elle sera définie sur module.exports car dans JS, les objets sont passés par référence.
La conclusion est toujours d'utiliser module.exports pour éviter toute confusion. J'espère que cela t'aides. Bon codage :)
la source
Aussi, une chose qui peut aider à comprendre:
math.js
client.js
Super, dans ce cas:
Ainsi, par défaut, "ceci" est en fait égal à module.exports.
Cependant, si vous changez votre implémentation en:
math.js
Dans ce cas, cela fonctionnera bien, cependant, "ceci" n'est plus égal à module.exports, car un nouvel objet a été créé.
Et maintenant, ce qui sera retourné par l'exigence est ce qui a été défini à l'intérieur du module.exports, et non plus celui-ci ou les exportations.
Une autre façon de procéder serait:
math.js
Ou:
math.js
la source
La réponse de René à propos de la relation entre
exports
etmodule.exports
est assez claire, il s'agit de références javascript. Je veux juste ajouter cela:Nous voyons cela dans de nombreux modules de nœuds:
var app = exports = module.exports = {};
Cela garantira que même si nous avons modifié module.exports, nous pouvons toujours utiliser les exportations en faisant pointer ces deux variables vers le même objet.
la source
module.exports
et neexports
sont que des variables distinctes, initialisés pour référencer le même objet. Si vous modifiez les références d'une variable, les deux variables ne font plus référence à la même chose. La ligne de code ci-dessus garantit que les deux variables sont initialisées sur le même nouvel objet.myTest.js
exports
etmodule.exports
sont les mêmes et une référence au même objet. Vous pouvez ajouter des propriétés dans les deux sens selon votre convenance.la source