Explorer les différences entre 'module.exports' et 'exports' dans Node.js
Dans le système de modules Node.js, il sont deux variables notables : « module.exports » et « exports ». Bien qu'ils puissent sembler interchangeables, comprendre les nuances entre eux est crucial pour un développement de module efficace.
Considérez le contrat mentionné dans la question fournie :
module.exports = exports = nano = function database_module(cfg) {...}
Cette syntaxe soulève la question : quel est le différence entre 'module.exports' et 'exports', et pourquoi les deux sont-ils utilisés ?
Pour résoudre ce casse-tête, imaginons que chaque module commence par les lignes suivantes :
var module = new Module(...); var exports = module.exports;
Essentiellement, 'module.exports' et 'exports' pointent initialement vers le même objet. Lorsque vous attribuez des valeurs à « exports », vous modifiez en fait l'objet auquel « module.exports » fait référence.
Dans l'exemple de contrat, considérons d'abord l'approche « sûre » :
// Using module.exports module.exports.a = function() { console.log('a'); } module.exports.b = function() { console.log('b'); }
Ici, "safe" signifie que 'module.exports' reste un objet contenant des fonctions exportées. Lorsque vous avez besoin de ce module, vous obtenez cet objet.
Cependant, l'affectation à 'exports' peut être "dangereuse" :
// Using exports exports.a = function() { console.log('a'); } exports.b = function() { console.log('b'); }
Alors que 'module.exports' et 'exports' pointent initialement vers le même objet, en attribuant directement aux pauses « exportations » cette référence. Par conséquent, 'module.exports' pointe toujours vers un objet vide {}, qui sera renvoyé lorsque le module est requis.
Il est à noter que l'attribution d'une fonction constructeur à 'module.exports' peut avoir des implications différentes que de le faire pour les « exportations » :
// Assigning constructor to module.exports module.exports = function Something() { console.log('bla bla'); }
Dans ce cas, le « typeof » du résultat renvoyé sera « fonction ». Cela vous permet de requérir et d'invoquer le module directement en tant que fonction.
Cependant, attribuer un constructeur aux 'exports' n'aura pas le même effet :
// Assigning constructor to exports exports = function Something() { console.log('bla bla'); }
En réaffectant 'exports, ' vous coupez la connexion entre 'module.exports' et la fonction constructeur, laissant 'module.exports' vide object.
En conclusion, comprendre les différences subtiles entre 'module.exports' et 'exports' est essentiel pour développer des modules Node.js efficaces. Bien que les deux variables pointent initialement vers le même objet, « module.exports » doit être considéré comme le moyen officiel d'exporter les valeurs d'un module, car il pointe systématiquement vers l'objet exporté. En revanche, les « exports » peuvent être utiles lorsque vous devez modifier directement l'objet exporté ou lors de l'attribution d'une fonction constructeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!