module.exports
est l'objet qui est réellement retourné à la suite d'un require
appel.
La exports
variable est initialement définie sur ce même objet (c'est-à-dire qu'il s'agit d'un "alias" abrégé), donc dans le code du module, vous écrivez généralement quelque chose comme ceci:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
pour exporter (ou "exposer") les fonctions de portée interne myFunc1
et myFunc2
.
Et dans le code d'appel, vous utiliseriez:
const m = require('./mymodule');
m.myFunc1();
où la dernière ligne montre comment le résultat require
est (généralement) juste un objet simple dont les propriétés sont accessibles.
NB: si vous écrasez exports
alors il ne fera plus référence module.exports
. Donc, si vous souhaitez affecter un nouvel objet (ou une référence de fonction) à, exports
vous devez également affecter ce nouvel objet àmodule.exports
Il convient de noter que le nom ajouté à l' exports
objet ne doit pas nécessairement être le même que le nom de portée interne du module pour la valeur que vous ajoutez, vous pouvez donc avoir:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
suivi par:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
Cela a déjà été répondu, mais je voulais ajouter quelques éclaircissements ...
Vous pouvez utiliser les deux
exports
etmodule.exports
pour importer du code dans votre application comme ceci:var mycode = require('./path/to/mycode');
Le cas d'utilisation de base que vous verrez (par exemple dans le code d'exemple ExpressJS) est que vous définissez les propriétés de l'
exports
objet dans un fichier .js que vous importez ensuite à l'aiderequire()
Donc, dans un exemple de comptage simple, vous pourriez avoir:
(counter.js):
... puis dans votre application (web.js, ou vraiment tout autre fichier .js):
En termes simples, vous pouvez considérer les fichiers requis comme des fonctions qui renvoient un seul objet et vous pouvez ajouter des propriétés (chaînes, nombres, tableaux, fonctions, quoi que ce soit) à l'objet renvoyé en les activant
exports
.Parfois, vous souhaiterez que l'objet renvoyé par un
require()
appel soit une fonction que vous pouvez appeler, plutôt qu'un simple objet avec des propriétés. Dans ce cas, vous devez également définirmodule.exports
, comme ceci:(sayhello.js):
(app.js):
La différence entre les exportations et module.exports est mieux expliquée dans cette réponse ici .
la source
require
commence par rapport au dossiernode app.js
dans lequel vous exécutez . Je vous recommande de poster une nouvelle question avec du code explicite + des exemples de structure de dossier pour obtenir une réponse plus claire.var sayHello = require('./ex6_module.js'); console.log(sayHello());
et module:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
le 2eexports
est juste une variable non? En d'autres termes, cela peut êtremodule.exports = abc = function()
Notez que le mécanisme du module NodeJS est basé sur des modules CommonJS qui sont pris en charge dans de nombreuses autres implémentations comme RequireJS , mais aussi SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js ou même Adobe Photoshop (via PSLib ). Vous pouvez trouver la liste complète des implémentations connues ici .
À moins que votre module n'utilise des fonctionnalités ou des modules spécifiques aux nœuds, je vous encourage fortement à les utiliser à la
exports
place de ceuxmodule.exports
qui ne font pas partie de la norme CommonJS et qui ne sont généralement pas pris en charge par d'autres implémentations.Une autre caractéristique spécifique de NodeJS consiste à affecter une référence à un nouvel objet au
exports
lieu de simplement lui ajouter des propriétés et des méthodes comme dans le dernier exemple fourni par Jed Watson dans ce fil. Je découragerais personnellement cette pratique car cela rompt le support de référence circulaire du mécanisme des modules CommonJS. Il n'est alors pas pris en charge par toutes les implémentations et l'exemple Jed devrait alors être écrit de cette façon (ou similaire) pour fournir un module plus universel:(sayhello.js):
(app.js):
Ou en utilisant les fonctionnalités ES6
(sayhello.js):
(app.js):
PS: Il semble qu'Appcelerator implémente également des modules CommonJS, mais sans le support de référence circulaire (voir: Modules Appcelerator et CommonJS (mise en cache et références circulaires) )
la source
Vous devez faire attention à quelques éléments si vous attribuez une référence à un nouvel objet
exports
et / oumodules.exports
:1. Toutes les propriétés / méthodes précédemment attachées à l'original
exports
oumodule.exports
sont bien sûr perdues car l'objet exporté en référencera désormais un autre nouveauCelui-ci est évident, mais si vous ajoutez une méthode exportée au début d'un module existant, assurez-vous que l'objet exporté natif ne fait pas référence à un autre objet à la fin
2. Dans le cas où l'une
exports
oumodule.exports
référencer une nouvelle valeur, ils ne font plus référence au même objet3. Conséquence délicate. Si vous changez la référence aux deux
exports
etmodule.exports
, difficile de dire quelle API est exposée (cela ressemble à desmodule.exports
victoires)la source
la propriété module.exports ou l'objet exports permet à un module de sélectionner ce qui doit être partagé avec l'application
J'ai une vidéo sur module_export disponible ici
la source
Lors de la division de votre code de programme sur plusieurs fichiers,
module.exports
est utilisé pour publier des variables et des fonctions pour le consommateur d'un module. L'require()
appel dans votre fichier source est remplacé par un correspondantmodule.exports
chargé depuis le module.N'oubliez pas lors de l'écriture des modules
module.exports
objet est également disponible enexports
raccourci. Mais lorsque vous retournez une seule fonction, utilisez toujoursmodule.exports
.Selon: "Modules Part 2 - Writing modules" .
la source
le lien de référence est comme ceci:
les propriétés de
exports
oumodule.exports
, telles que les fonctions ou les variables, seront exposées à l'extérieuril faut faire plus attention: ne pas
override
exporter.Pourquoi ?
car exporte uniquement la référence de module.exports, vous pouvez ajouter les propriétés aux exportations, mais si vous remplacez les exportations, le lien de référence sera rompu.
bon exemple :
mauvais exemple:
Si vous souhaitez simplement exposer une seule fonction ou variable, comme ceci:
ce module n'a exposé qu'une seule fonction et la propriété du nom est privée pour l'extérieur.
la source
Il y a des modules par défaut ou existants dans node.js lorsque vous téléchargez et installez node.js comme http, sys etc.
Comme ils sont déjà dans node.js, lorsque nous voulons utiliser ces modules, nous aimons essentiellement les modules d'importation , mais pourquoi? car ils sont déjà présents dans le node.js. L'importation revient à les retirer de node.js et à les placer dans votre programme. Et puis en les utilisant.
Alors que Exports est exactement le contraire, vous créez le module que vous voulez, disons le module addition.js et mettez ce module dans le node.js, vous le faites en l'exportant.
Avant d'écrire quoi que ce soit ici, rappelez-vous, module.exports.additionTwo est identique à exports.additionTwo
C'est la raison pour laquelle nous aimons
Soyez prudent avec le chemin
Disons que vous avez créé un module addition.js,
Lorsque vous exécutez cela sur votre invite de commande NODE.JS:
Ce sera une erreur de dire
C'est parce que le processus node.js ne peut pas ajouter.js puisque nous n'avons pas mentionné le chemin. Donc, nous pouvons définir le chemin en utilisant NODE_PATH
Maintenant, cela devrait fonctionner sans erreur !!
Encore une chose, vous pouvez également exécuter le fichier addition.js en ne définissant pas le NODE_PATH, de retour à votre invite de commande nodejs:
Puisque nous fournissons le chemin ici en disant qu'il se trouve dans le répertoire courant,
./
cela devrait également fonctionner correctement.la source
Un 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 le déplacement de toutes les fonctions associées dans un fichier.
Supposons qu'il existe un fichier Hello.js qui comprend deux fonctions
Nous écrivons une fonction uniquement lorsque l'utilité du code est plus d'un appel.
Supposons que nous voulons augmenter l'utilité de la fonction dans un fichier différent, disons World.js, dans ce cas, l'exportation d'un fichier entre en image, ce qui peut être obtenu par module.exports.
Vous pouvez simplement exporter à la fois la fonction par le code donné ci-dessous
Il vous suffit maintenant d'exiger le nom du fichier dans World.js pour utiliser ces fonctions
la source
L'intention est:
Wikipédia
J'imagine qu'il devient difficile d'écrire un gros programme sans code modulaire / réutilisable. Dans nodejs, nous pouvons créer des programmes modulaires en utilisant la
module.exports
définition de ce que nous exposons et composons notre programme avecrequire
.fileLog.js
stdoutLog.js
program.js
exécuter
Essayez maintenant de remplacer ./stdoutLog.js par ./fileLog.js .
la source
Il accomplit les choses suivantes:
Avoir des modules facilite la recherche de certaines parties de code, ce qui rend notre code plus facile à maintenir.
NodejS
utilise le système de modules CommomJS qui fonctionne de la manière suivante:module.export
syntaxerequire('file')
syntaxeExemple:
test1.js
test2.js
Autres choses utiles à savoir:
require()
est appelé sur le même module, il est extrait du cache.require()
immédiatement à l'objet récupéré .la source
la source
return "Hello world"
cela ne fait aucune différence), mais sans aucune explication. Veuillez vous assurer avant de répondre que votre réponse ajoutera quelque chose au sujet.