1452 votes

Quel est le but de Node.js le module.les exportations et comment l'utilisez-vous?

Quel est le but de Node.js le module.les exportations et comment l'utilisez-vous?

Je n'arrive pas à trouver toutes les informations à ce sujet, mais il semble être une assez grande partie de Node.js comme je l'ai souvent le voir dans le code source.

Selon l' Node.js documentation:

module

Référence à l'actuel module. En particulier, module.exports est le même que les exportations de l'objet. Voir src/node.js pour plus d'informations.

Mais ce n'est pas vraiment utile.

Qu'est-ce exactement ne module.exports le faire, et ce serait un exemple simple?

1613voto

Alnitak Points 143355

module.exports est l'objet qui est en fait retourné à la suite d'un require appel.

L' exports variable est initialement définie à ce même objet (c'est à dire que c'est une abréviation "alias"), donc dans le module de code, vous l'habitude d'écrire quelque chose comme ceci:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

à l'exportation (ou "exposer") au sein de l'étendue des fonctions myFunc1 et myFunc2.

Et dans le code appelant, vous devez utiliser:

var m = require('mymodule');
m.myFunc1();

où la dernière ligne montre comment le résultat de l' require est (généralement) un simple objet dont les propriétés peuvent être consultés.

NB: si vous écrasez exports il n'est plus fait référence à l' module.exports. Donc, si vous souhaitez affecter un nouvel objet (ou une fonction de référence) exports , alors vous devriez également affecter à ce nouvel objet d' module.exports


Il est intéressant de noter que le nom soit ajouté à la exports objet ne doit pas être le même que le module en interne de l'étendue de nom pour la valeur que vous ajoutez, vous pouvez donc avoir:

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

suivi de:

var m = require('mymodule');
m.shortName(); // invokes module.myVeryLongInternalName

220voto

Jed Watson Points 4462

Cela a déjà été répondu, mais je voulais ajouter quelques précisions...

Vous pouvez utiliser les deux exports et module.exports à l'importation de code dans votre application comme ceci:

var mycode = require('./path/to/mycode');

La base de cas d'utilisation (par exemple, dans ExpressJS exemple de code), c'est que vous définissez des propriétés sur l' exports objet dans une .js fichier que vous importez ensuite à l'aide de require()

Donc, en un simple comptage exemple, vous pourriez avoir:

(counter.js):

var count = 1;
exports.increment = function() { count++; };
exports.getCount = function() { return count; };

... puis dans votre application (web.js ou vraiment tout autre .fichier js):

var counting = require('./counter.js');
console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

En termes simples, vous pouvez penser à des fichiers comme des fonctions qui retournent un objet unique, et vous pouvez ajouter des propriétés (chaînes de caractères, nombres, tableaux, fonctions, n'importe quoi) de l'objet renvoyé par le paramètre sur exports.

Parfois, vous aurez envie de l'objet renvoyé à partir d'un require() appel à une fonction, vous pouvez l'appeler, plutôt que de simplement un objet avec des propriétés. Dans ce cas, vous devez également définir module.exports, comme ceci:

(sayhello.js):

module.exports = exports = function() { console.log("Hello World!"); }

(app.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

La différence entre les exportations et le module.les exportations s'explique mieux dans cette réponse ici.

61voto

Alexandre Morgaut Points 410

Notez que NodeJS module mécanisme est basé sur CommonJS modules qui sont pris en charge dans de nombreuses autres implémentations comme RequireJS, mais aussi SproutCore, CouchDB, Wakanda, OrientDB, ArangoDB, RingoJS, TeaJS, SilkJS, curl.jsou encore Adobe Photoshop (via PSLib). La liste complète des connus des implémentations, il y a: http://www.commonjs.org/impl/

À moins que votre module d'utiliser un nœud de fonctionnalités spécifiques ou d'un module, je vous encourage fortement ensuite à l'aide d' exports au lieu de module.exports qui ne fait pas partie de la CommonJS standard, et alors la plupart du temps non pris en charge par d'autres implémentations.

Un autre NodeJS fonctionnalité spécifique lorsque vous affectez une référence à un objet d' exports au lieu de simplement ajouter des propriétés et des méthodes, comme par exemple dans le dernier exemple fourni par Jed Watson dans ce fil. Personnellement, je ne décourager cette pratique car cela casse la référence circulaire de soutien de la CommonJS modules mécanisme. Il n'est alors pas pris en charge par toutes les implémentations et Jed exemple devrait alors être écrit de cette manière (ou un similaire) afin d'offrir un module universel:

(sayhello.js):

exports.run = function() { console.log("Hello World!"); }

(app.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

PS: On dirait Appcelerator met également en œuvre CommonJS modules, mais sans la référence circulaire de soutien (voir: Appcelerator et CommonJS modules (mise en cache et les références circulaires))

34voto

Alexandre Morgaut Points 410

Quelques choses que vous devez prendre soin de si vous assignez une référence à un objet d' exports et /ou modules.exports:

1. Toutes les propriétés/méthodes précédemment jointe à l'original exports ou module.exports sont des cours perdus en raison de l'objet exporté sera désormais référence à un autre nouveau

C'est évident, mais si vous ajoutez un produit exporté méthode au début d'un module existant, assurez-vous que le natif objet exporté n'est pas référence à un autre objet à la fin

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. Dans le cas où l'une des exports ou module.exports de référence une nouvelle valeur, ils ne le font pas référence à l'objet même plus

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. Difficile conséquence. Si vous modifiez la référence à exports et module.exports, difficile de dire qui l'API est exposé (il ressemble module.exports victoires)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

29voto

anish Points 919

le module.les exportations de biens ou les exportations de l'objet permet à un module de sélectionner ce qui doit être partagé avec l'application

enter image description here

Une belle vidéo sur module_export est disponible ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X