Auf dieser Seite ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ) heißt es: "Wenn Sie das Exportobjekt auf eine Funktion oder ein neues Objekt setzen möchten, müssen Sie dies tun." Verwenden Sie das Objekt module.exports. "
Meine Frage ist warum.
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
Ich habe das Ergebnis ( result=require(example.js)
) konsolidiert und das erste ist [Function]
das zweite {}
.
Könnten Sie bitte den Grund dafür erklären? Ich lese die Post hier: module.exports vs Exporte in Node.js . Es ist hilfreich, erklärt aber nicht den Grund, warum es so gestaltet ist. Wird es ein Problem geben, wenn die Referenz der Exporte direkt zurückgegeben wird?
javascript
node.js
commonjs
Xiao Peng - ZenUML.com
quelle
quelle
module.exports
.exports
zum Beispiel github.com/tj/consolidate.js/blob/master/lib/consolidate.js ?module.exports
, werden Sie sich nie irren, aber Sie können verwenden,exports
wenn Sie das exportierte Standardobjekt nicht ersetzen, dh wenn Sie einfach Eigenschaften wie diese anhängen :var foo = require('foo').foo
. Diesefoo
Eigenschaft kann folgendermaßen exportiert werden:exports.foo = ...
und natürlich auch mitmodule.exports
. Es ist eine persönliche Entscheidung, aber ich benutzemodule.exports
undexports
angemessen.Antworten:
module
ist ein einfaches JavaScript-Objekt mit einerexports
Eigenschaft.exports
ist eine einfache JavaScript-Variable, auf die zufällig gesetzt wirdmodule.exports
. Am Ende Ihrer Datei kehrt node.js grundsätzlichmodule.exports
zurrequire
Funktion zurück. Eine vereinfachte Möglichkeit zum Anzeigen einer JS-Datei in Node könnte sein:Wenn Sie eine Eigenschaft
exports
wieexports.a = 9;
diese festlegen, wird diese ebenfalls festgelegt,module.exports.a
da Objekte in JavaScript als Referenzen übergeben werden. Wenn Sie also mehrere Variablen auf dasselbe Objekt festlegen, handelt es sich bei allen um dasselbe Objekt. also dannexports
undmodule.exports
sind das gleiche Objekt.Aber wenn Sie setzen
exports
neue zu etwas, es wird nicht mehr eingestellt werdenmodule.exports
, soexports
undmodule.exports
nicht mehr das gleiche Objekt.quelle
module.exports
beschreibt es auch: nodejs.org/api/modules.html#modules_module_exportsRenees Antwort ist gut erklärt. Ergänzung zur Antwort mit einem Beispiel:
Der Knoten macht eine Menge Dinge mit Ihrer Datei und einer der wichtigsten ist das WRAPPEN Ihrer Datei. Innerhalb des Knotens wird der Quellcode "module.exports" zurückgegeben. Machen wir einen Schritt zurück und verstehen den Wrapper. Angenommen, Sie haben
greet.js
Der obige Code wird wie folgt als IIFE (Sofort aufgerufener Funktionsausdruck) in den Quellcode des Knotens eingeschlossen:
und die obige Funktion wird aufgerufen (.apply ()) und module.exports zurückgegeben. Zu diesem Zeitpunkt exportiert module.exports und exportiert auf dieselbe Referenz.
Stellen Sie sich vor, Sie schreiben greet.js als neu
die Ausgabe wird sein
Der Grund ist: module.exports ist ein leeres Objekt. Wir haben nichts auf module.exports gesetzt, sondern export = function () ..... in new greet.js. Modul.exports ist also leer.
Technisch gesehen sollten Exporte und module.exports auf dieselbe Referenz verweisen (das ist richtig !!). Wir verwenden jedoch "=", wenn wir Exporten function () .... zuweisen, wodurch ein weiteres Objekt im Speicher erstellt wird. Module.exports und Exporte führen also zu unterschiedlichen Ergebnissen. Wenn es um Exporte geht, können wir es nicht überschreiben.
Stellen Sie sich nun vor, Sie schreiben greet.js (dies bezieht sich auf die Antwort von Renee) als (dies wird als Mutation bezeichnet) neu
die Ausgabe wird sein
Wie Sie sehen können, zeigen module.exports und exports auf dieselbe Referenz, die eine Funktion ist. Wenn Sie für Exporte eine Eigenschaft festlegen, wird diese für module.exports festgelegt, da in JS Objekte als Referenz übergeben werden.
Fazit: Verwenden Sie immer module.exports, um Verwirrung zu vermeiden. Hoffe das hilft. Viel Spaß beim Codieren :)
quelle
Auch eines, das zum Verständnis beitragen kann:
math.js
client.js
Großartig, in diesem Fall:
Daher entspricht "this" standardmäßig tatsächlich module.exports.
Wenn Sie jedoch Ihre Implementierung ändern in:
math.js
In diesem Fall funktioniert es einwandfrei, "this" ist jedoch nicht mehr gleich module.exports, da ein neues Objekt erstellt wurde.
Und jetzt wird von der Anforderung zurückgegeben, was in module.exports definiert wurde, nicht mehr dies oder exportiert.
Ein anderer Weg wäre:
math.js
Oder:
math.js
quelle
Renes Antwort auf die Beziehung zwischen
exports
undmodule.exports
ist ziemlich klar, es geht nur um Javascript-Referenzen. Ich möchte nur hinzufügen, dass:Wir sehen dies in vielen Knotenmodulen:
var app = exports = module.exports = {};
Dadurch wird sichergestellt, dass wir auch dann Exporte verwenden können, wenn wir module.exports geändert haben, indem diese beiden Variablen auf dasselbe Objekt verweisen.
quelle
module.exports
undexports
sind nur getrennte Variablen initialisiert das gleiche Objekt zu verweisen. Wenn Sie ändern, auf welche eine Variable verweist, verweisen die beiden Variablen nicht mehr auf dasselbe. Die obige Codezeile stellt sicher, dass beide Variablen mit demselben neuen Objekt initialisiert werden.myTest.js
exports
undmodule.exports
sind gleich und ein Verweis auf das gleiche Objekt. Sie können Eigenschaften nach Belieben auf beide Arten hinzufügen.quelle