Comprendre module.exports et exportations dans Node.js
En tant que développeurs, nous sommes souvent confrontés à des situations où nous devons utiliser du code inconnu. Une question se posera pendant ces moments. Combien de temps devrais-je investir pour comprendre le code que je vais utiliser? Une réponse typique est d'apprendre suffisamment pour commencer à coder; puis explorez ce sujet plus loin lorsque le temps le permet. Eh bien, le moment est venu de mieux comprendre module.exports
et exports
dans Node.js. Voici ce que j'ai appris.
Remarque: cet article traite de l'utilisation de modules dans Node. Si vous voulez apprendre comment utiliser des modules dans le navigateur, lisez: Comprendre les modules JavaScript: regrouper et transpiler .
Pour une introduction approfondie et de haute qualité à Node.js, vous ne peut pas dépasser le développeur de pile plein canadien Wes Bos. Essayez son cours ici et utilisez le code SITEPOINT pour obtenir 25% de réduction et pour aider SitePoint.
Qu'est-ce qu'un module
Le module encapsule le code associé dans une seule unité de code. Lors de la création d'un module, cela peut être interprété comme déplaçant toutes les fonctions associées dans un fichier. Illustrons ce point par un exemple impliquant une application créée avec Node.js. Imaginons que nous ayons créé un fichier nommé greetings.js
et qu'il contienne les deux fonctions suivantes:
// greetings.js
sayHelloInEnglish = function () {
retourner "Bonjour";
};
sayHelloInSpanish = function () {
retourner "Hola";
};
Exportation d'un module
L'utilitaire de greetings.js
augmente lorsque son code encapsulé peut être utilisé dans d'autres fichiers. Donc, refactorons greetings.js
pour atteindre cet objectif. Pour comprendre ce qui se passe réellement, nous pouvons suivre un processus en trois étapes:
1) Imaginez que cette ligne de code existe en tant que première ligne de code dans greetings.js
:
// salutations.js
var exports = module.exports = {};
2) Attribuez une expression dans greetings.js
que nous souhaitons rendre disponible dans d'autres fichiers pour l'objet exports
: [19659007] // greetings.js
// var exports = module.exports = {};
exports.sayHelloInEnglish = function () {
retourner "BONJOUR";
};
exports.sayHelloInSpanish = function () {
retourner "Hola";
};
Dans le code ci-dessus, nous aurions pu remplacer exports
par module.exports
et obtenir le même résultat. Si cela semble déroutant, rappelez-vous que exports
et module.exports
font référence au même objet.
3) Il s'agit de la valeur actuelle de module.exports:
module.exports = {
sayHelloInEnglish: function () {
retourner "BONJOUR";
},
sayHelloInSpanish: function () {
retourner "Hola";
}
};
Importation d'un module
Importons les méthodes publiquement disponibles de greetings.js
dans un nouveau fichier appelé main.js
. Ce processus peut être décrit en trois étapes:
1) Le mot-clé requis
est utilisé dans Node.js pour importer des modules. Imaginez que c'est ainsi que nécessite
est défini:
var require = function (path) {
// ...
renvoie module.exports;
};
2) Exigeons greetings.js
dans main.js
:
// main.js
var greetings = require ("./ greetings.js");
Le code ci-dessus est équivalent à ceci:
// main.js
var salutations = {
sayHelloInEnglish: function () {
retourner "BONJOUR";
},
sayHelloInSpanish: function () {
retourner "Hola";
}
};
3) Nous pouvons maintenant accéder aux méthodes publiquement disponibles de greetings.js
en tant que propriété de notre variable greetings
dans main.js
.
// main.js
var greetings = require ("./ greetings.js");
// "Bonjour"
greetings.sayHelloInEnglish ();
// "Hola"
greetings.sayHelloInSpanish ();
Points importants
Le mot clé nécessite
renvoie un objet qui référence la valeur de module.exports
pour un fichier donné. Si un développeur réattribue involontairement ou intentionnellement module.exports
à un autre objet ou à une structure de données différente, toutes les propriétés ajoutées à l'objet module.exports
d'origine seront inaccessibles. [19659010] Un exemple aidera à élaborer ce point:
// greetings.js
// var exports = module.exports = {};
exports.sayHelloInEnglish = function () {
retourner "BONJOUR";
};
exports.sayHelloInSpanish = function () {
retourner "Hola";
};
/ *
- cette ligne de code réassigne
- module.exports
* /
module.exports = "Bonjour";
Maintenant, nous avons besoin de greetings.js
dans main.js
:
// main.js
var greetings = require ("./ greetings.js");
Rien n'est différent pour le moment. Nous affectons la variable salutations
à tout code qui est publiquement disponible dans greetings.js
.
La conséquence de la réaffectation de module.exports
à une donnée la structure autre que sa valeur par défaut est révélée lorsque nous essayons d'invoquer sayHelloInEnglish
et sayHelloInSpanish
:
// main.js
// var greetings = require ("./ greetings.js");
/ *
- TypeError: objet Bonjour n'a pas de méthode
- 'sayHelloInEnglish'
* /
greetings.sayHelloInEnglish ();
/ *
- TypeError: objet Bonjour n'a pas de méthode
- 'sayHelloInSpanish'
* /
greetings.sayHelloInSpanish ();
Pour comprendre pourquoi ces erreurs se produisent, consignons la valeur de greetings
dans une console:
// "Bonjour"
console.log (salutations);
À ce stade, nous essayons d'accéder aux méthodes sayHelloInEnglish
et sayHelloInSpanish
sur la chaîne "Bonjour." module.exports
en d'autres termes, ne fait plus référence à l'objet par défaut contenant ces méthodes.
Conclusion
Importer et exporter des modules est une tâche très répandue dans Node.js. J'espère que la différence entre exportations
et module.exports
est plus claire. De plus, si vous rencontrez une erreur lors de l’accès à des méthodes publiquement disponibles, j’espère que vous comprendrez mieux pourquoi ces erreurs peuvent se produire.
Ressources recommandées

Wes Bos
Apprenez à créer des applications et des API avec Node.js. Utilisez le code de coupon 'SITEPOINT' à la caisse pour obtenir 25% de réduction .
Il existe plusieurs façons de démarrer un serveur de noeud local. Regardez comme ce screencast explore certaines des techniques de serveur de nœuds courantes et comment les instancier.
Source link