module.exports
ist das Objekt, das als Ergebnis eines require
Aufrufs tatsächlich zurückgegeben wird .
Die exports
Variable wird anfänglich auf dasselbe Objekt gesetzt (dh es handelt sich um eine Kurzform "Alias"), sodass Sie im Modulcode normalerweise Folgendes schreiben würden:
let myFunc1 = function() { ... };
let myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
zum Exportieren (oder "Belichten") der Funktionen myFunc1
mit internem Gültigkeitsbereich und myFunc2
.
Und im aufrufenden Code würden Sie verwenden:
const m = require('./mymodule');
m.myFunc1();
wobei die letzte Zeile zeigt, wie das Ergebnis von require
(normalerweise) nur ein einfaches Objekt ist, auf dessen Eigenschaften zugegriffen werden kann.
NB: Wenn Sie überschreiben exports
, wird nicht mehr darauf verwiesen module.exports
. Wenn Sie also ein neues Objekt (oder eine Funktionsreferenz) zuweisen möchten, exports
sollten Sie auch dieses neue Objekt zuweisenmodule.exports
Es ist erwähnenswert, dass der dem exports
Objekt hinzugefügte Name nicht mit dem internen Gültigkeitsbereich des Moduls für den Wert übereinstimmen muss, den Sie hinzufügen. Sie könnten also Folgendes haben:
let myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
gefolgt von:
const m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
Dies wurde bereits beantwortet, aber ich wollte einige Klarstellungen hinzufügen ...
Sie können beides verwenden
exports
undmodule.exports
Code wie folgt in Ihre Anwendung importieren:var mycode = require('./path/to/mycode');
Der grundlegende Anwendungsfall (z. B. im ExpressJS-Beispielcode) besteht darin, dass Sie Eigenschaften für das
exports
Objekt in einer JS-Datei festlegen, die Sie dann mit importierenrequire()
In einem einfachen Zählbeispiel könnten Sie also Folgendes haben:
(counter.js):
... dann in Ihrer Anwendung (web.js oder wirklich jede andere .js-Datei):
In einfachen Worten können Sie sich erforderliche Dateien als Funktionen vorstellen, die ein einzelnes Objekt zurückgeben, und Sie können dem zurückgegebenen Objekt Eigenschaften (Zeichenfolgen, Zahlen, Arrays, Funktionen usw.) hinzufügen, indem Sie sie aktivieren
exports
.Manchmal möchten Sie, dass das von einem
require()
Aufruf zurückgegebene Objekt eine Funktion ist, die Sie aufrufen können, und nicht nur ein Objekt mit Eigenschaften. In diesem Fall müssen Sie auch Folgendes einstellenmodule.exports
:(sayhello.js):
(app.js):
Der Unterschied zwischen Exporten und module.exports wird in dieser Antwort hier besser erläutert .
quelle
require
Beginnt relativ zu dem Ordner,node app.js
in dem Sie ausgeführt werden . Ich empfehle, eine neue Frage mit expliziten Beispielen für Code + Ordnerstruktur zu stellen, um eine klarere Antwort zu erhalten.var sayHello = require('./ex6_module.js'); console.log(sayHello());
und Modul:module.exports = exports = function() { return "Hello World!"; }
module.exports = exports = function(){...}
Die zweiteexports
ist nur eine Variable, oder? Mit anderen Worten, es kann seinmodule.exports = abc = function()
Beachten Sie, dass der NodeJS-Modulmechanismus auf CommonJS- Modulen basiert, die in vielen anderen Implementierungen wie RequireJS , aber auch SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js oder sogar Adobe Photoshop (über PSLib) unterstützt werden ). Die vollständige Liste der bekannten Implementierungen finden Sie hier .
Sofern Ihr Modul keine knotenspezifischen Funktionen oder Module verwendet, empfehle ich Ihnen dringend, diese zu
exports
verwenden,module.exports
die nicht Teil des CommonJS-Standards sind und dann meist nicht von anderen Implementierungen unterstützt werden.Eine weitere NodeJS-spezifische Funktion ist das Zuweisen eines Verweises auf ein neues Objekt,
exports
anstatt nur Eigenschaften und Methoden hinzuzufügen, wie im letzten Beispiel von Jed Watson in diesem Thread. Ich persönlich würde diese Praxis als davon abgeraten , diese Pausen die kreisförmige Referenz Unterstützung des Mechanismus Module Commonjs. Es wird dann nicht von allen Implementierungen unterstützt, und das Jed-Beispiel sollte dann so geschrieben werden (oder ähnlich), um ein universelleres Modul bereitzustellen:(sayhello.js):
(app.js):
Oder mit ES6-Funktionen
(sayhello.js):
(app.js):
PS: Es sieht so aus, als ob Appcelerator auch CommonJS-Module implementiert, jedoch ohne Unterstützung für Zirkelverweise (siehe: Appcelerator- und CommonJS-Module (Caching und Zirkelverweise) ).
quelle
Einige wenige Dinge, die Sie beachten müssen, wenn Sie einem neuen Objekt einen Verweis zuweisen
exports
und / odermodules.exports
:1. Alle Eigenschaften / Methoden, die zuvor an das Original angehängt wurden
exports
odermodule.exports
natürlich verloren gehen, weil das exportierte Objekt jetzt auf ein anderes neues Objekt verweistDies ist offensichtlich, aber wenn Sie am Anfang eines vorhandenen Moduls eine exportierte Methode hinzufügen, stellen Sie sicher, dass das native exportierte Objekt am Ende nicht auf ein anderes Objekt verweist
2. Falls einer von
exports
odermodule.exports
auf einen neuen Wert verweist, verweisen sie nicht mehr auf dasselbe Objekt3. Schwierige Konsequenz. Wenn Sie den Verweis auf beide
exports
und ändernmodule.exports
, ist es schwer zu sagen, welche API verfügbar ist (es sieht nachmodule.exports
Gewinnen aus).quelle
Mit der Eigenschaft module.exports oder dem Exportobjekt kann ein Modul auswählen, was für die Anwendung freigegeben werden soll
Ich habe ein Video zu module_export hier verfügbar
quelle
Wenn Sie Ihren Programmcode auf mehrere Dateien
module.exports
aufteilen, werden Variablen und Funktionen für den Verbraucher eines Moduls veröffentlicht. Derrequire()
Aufruf in Ihrer Quelldatei wird durch den entsprechenden Aufrufmodule.exports
aus dem Modul ersetzt.Denken Sie beim Schreiben von Modulen daran
module.exports
Objekt ist auch alsexports
Kurzform verfügbar . Verwenden Sie jedoch immer, wenn Sie eine einzige Funktion zurückgebenmodule.exports
.Nach: "Module Teil 2 - Module schreiben" .
quelle
Der Verweis-Link lautet wie folgt:
Die Eigenschaften von
exports
odermodule.exports
, wie Funktionen oder Variablen, werden im Freien angezeigtEs gibt etwas, auf das Sie mehr achten müssen:
override
Exportieren Sie nicht .Warum ?
Da nur die Referenz von module.exports exportiert wird, können Sie die Eigenschaften zu den Exporten hinzufügen. Wenn Sie jedoch die Exporte überschreiben, wird der Referenzlink unterbrochen.
gutes Beispiel :
schlechtes Beispiel :
Wenn Sie nur eine Funktion oder Variable wie folgt verfügbar machen möchten:
Dieses Modul hat nur eine Funktion verfügbar gemacht, und die Eigenschaft name ist für die Außenseite privat.
quelle
Es gibt einige Standard- oder vorhandene Module in node.js, wenn Sie node.js wie http, sys usw. herunterladen und installieren .
Da sie bereits in node.js sind, wenn wir diese Module verwenden wollen tun wir im Grunde wie Import - Module , aber warum? weil sie bereits in der node.js vorhanden sind. Beim Importieren werden sie aus node.js übernommen und in Ihr Programm eingefügt. Und sie dann benutzen.
Während Exportieren genau das Gegenteil ist, erstellen Sie das gewünschte Modul, sagen wir das Modul Addition.js, und fügen dieses Modul in die Datei node.js ein. Sie tun dies, indem Sie es exportieren.
Bevor ich hier etwas schreibe, denken Sie daran, module.exports.additionTwo ist dasselbe wie exports.additionTwo
Huh, das ist der Grund, den wir mögen
Sei vorsichtig mit dem Weg
Nehmen wir an, Sie haben ein Modul add.js erstellt.
Wenn Sie dies an Ihrer NODE.JS-Eingabeaufforderung ausführen:
Dies wird fehlerhaft sagen
Dies liegt daran, dass der Prozess node.js die Datei addation.js nicht kann, da wir den Pfad nicht erwähnt haben. Wir können also den Pfad mithilfe von NODE_PATH festlegen
Nun sollte dies ohne Fehler erfolgreich laufen !!
Eine weitere Sache ist, dass Sie die Datei addation.js auch ausführen können, indem Sie NODE_PATH nicht auf die Eingabeaufforderung von nodejs zurücksetzen:
Da wir den Pfad hier angeben, indem wir sagen, dass er sich im aktuellen Verzeichnis befindet,
./
sollte dies auch erfolgreich ausgeführt werden.quelle
Ein Modul kapselt verwandten Code in eine einzelne Codeeinheit. Beim Erstellen eines Moduls kann dies so interpretiert werden, dass alle zugehörigen Funktionen in eine Datei verschoben werden.
Angenommen, es gibt eine Datei Hello.js, die zwei Funktionen enthält
Wir schreiben eine Funktion nur, wenn der Nutzen des Codes mehr als ein Aufruf ist.
Angenommen, wir möchten den Nutzen der Funktion für eine andere Datei erhöhen, z. B. World.js. In diesem Fall wird beim Exportieren einer Datei ein Bild angezeigt, das über module.exports abgerufen werden kann.
Sie können beide Funktionen einfach mit dem unten angegebenen Code exportieren
Jetzt müssen Sie nur noch den Dateinamen in World.js eingeben, um diese Funktionen nutzen zu können
quelle
Die Absicht ist:
Wikipedia
Ich stelle mir vor, es wird schwierig, große Programme ohne modularen / wiederverwendbaren Code zu schreiben. In nodejs können wir modulare Programme erstellen, indem
module.exports
wir definieren, womit wir unser Programm verfügbar machen und komponierenrequire
.fileLog.js
stdoutLog.js
program.js
ausführen
Versuchen Sie nun, ./stdoutLog.js gegen ./fileLog.js auszutauschen .
quelle
Es erreicht folgende Dinge:
Das Vorhandensein von Modulen erleichtert das Auffinden bestimmter Codeteile, wodurch unser Code besser gewartet werden kann.
NodejS
verwendet das CommomJS-Modulsystem, das folgendermaßen funktioniert:module.export
Syntax deklarierenrequire('file')
Syntax deklarierenBeispiel:
test1.js
test2.js
Andere nützliche Dinge zu wissen:
require()
Aufruf von a auf demselben Modul wird a aus dem Cache gezogen.require()
sofort auf das abgerufene Objekt zugreifen .quelle
quelle
return "Hello world"
macht keinen Unterschied), jedoch ohne Erklärung. Bitte stellen Sie vor der Beantwortung sicher, dass Ihre Antwort dem Thema etwas hinzufügt.