// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
I console.logged das Ergebnis (result=require(example.js)) und der erste ist [Function] der zweite ist {}.
Könnten Sie bitte den Grund dafür erklären? Ich habe den Beitrag hier gelesen: module.exports vs exports in Node.js . Es ist hilfreich, erklärt aber nicht den Grund, warum es so gestaltet ist. Wird es ein Problem geben, wenn die Exportreferenz direkt zurückgegeben wird?
Verwenden Sie immer module.exports.
– Gabriel Lamas
5. Mai 13 um 11:04 Uhr
Ich denke, die Befolgung der oben genannten Ratschläge ermöglicht es, dieses Problem zu vermeiden.
@Imray Wenn Sie immer verwenden module.exportsSie werden nie falsch liegen, aber Sie können verwenden exports wenn Sie das standardmäßig exportierte Objekt nicht ersetzen, das heißt, wenn Sie einfach Eigenschaften wie diese anhängen: var foo = require('foo').foo. Dies foo Eigenschaft kann wie folgt exportiert werden: exports.foo = ... und natürlich auch mit module.exports. Es ist eine persönliche Entscheidung, aber ich verwende derzeit module.exports und exports passend.
– Gabriel Lamas
9. Februar 15 um 9:13 Uhr
Ich bevorzuge exports.myFunc = function() {}, damit ich keine Exportliste am Ende der Datei führen muss. Es fühlt sich näher an der üblichen Praxis des Exports an, wenn Sie in ES6 deklarieren.
– SacWebDeveloper
7. Oktober 19 um 7:20 Uhr
Gehe zur Bushaltestelle
module ist ein einfaches JavaScript-Objekt mit einem exports Eigentum. exports ist eine einfache JavaScript-Variable, die zufällig auf gesetzt ist module.exports. Am Ende Ihrer Datei wird node.js im Grunde “zurück” module.exports zum require Funktion. Eine vereinfachte Möglichkeit, eine JS-Datei in Node anzuzeigen, könnte folgendermaßen aussehen:
var module = { exports: {} };
var exports = module.exports;
// your code
return module.exports;
Wenn Sie eine Eigenschaft auf setzen exportsmögen exports.a = 9;das wird sich einstellen module.exports.a auch, weil Objekte in JavaScript als Referenzen herumgereicht werden, was bedeutet, dass, wenn Sie mehrere Variablen auf dasselbe Objekt setzen, sie sind alles das gleiche Objekt; also dann exports und module.exports sind dasselbe Objekt.
Aber wenn Sie setzen exports auf etwas neues, es wird nicht mehr darauf eingestellt module.exportsAlso exports und module.exports sind nicht mehr dasselbe Objekt.
Richtig, es sind nur die Grundlagen von Referenztypen.
Danke, aber warum brauchen wir beides exports und module.exports? Können wir der Einfachheit halber (und des KISS-Prinzips) nicht mit letzterem leben?
– zambotn
20. Mai 20 um 14:52 Uhr
Es besteht grundsätzlich keine Notwendigkeit exports, es ist nur eine praktische Abkürzung. Aber jetzt kann es nie entfernt werden, weil es den gesamten vorhandenen Code beschädigen würde.
– Gehe zur Bushaltestelle
26. Mai 20 um 18:32 Uhr
Renees Antwort ist gut erklärt. Ergänzung der Antwort mit einem Beispiel:
Node macht eine Menge Dinge mit Ihrer Datei und eine der wichtigsten ist das WICKELN Ihrer Datei. Im Quellcode von nodejs wird “module.exports” zurückgegeben. Lassen Sie uns einen Schritt zurückgehen und den Wrapper verstehen. Angenommen, Sie haben
grüße.js
var greet = function () {
console.log('Hello World');
};
module.exports = greet;
Der obige Code wird wie folgt als IIFE (Immediately Invoked Function Expression) in den Quellcode von nodejs eingebunden:
(function (exports, require, module, __filename, __dirname) { //add by node
var greet = function () {
console.log('Hello World');
};
module.exports = greet;
}).apply(); //add by node
return module.exports; //add by node
und die obige Funktion wird aufgerufen (.apply()) und module.exports zurückgegeben. Zu diesem Zeitpunkt verweisen module.exports und exports auf dieselbe Referenz.
Stellen Sie sich nun vor, Sie schreiben “greet.js” neu als
exports = function () {
console.log('Hello World');
};
console.log(exports);
console.log(module.exports);
die Ausgabe wird sein
[Function]
{}
Der Grund ist: module.exports ist ein leeres Objekt. Wir haben nichts auf module.exports gesetzt, sondern exports = function()….. in newgreeet.js gesetzt. module.exports ist also leer.
Technisch gesehen sollten Exporte und module.exports auf dieselbe Referenz verweisen (das ist richtig!!). Aber wir verwenden “=” beim Zuweisen von function()…. zu exports, wodurch ein weiteres Objekt im Speicher erstellt wird. module.exports und exports erzeugen also unterschiedliche Ergebnisse. Wenn es um Exporte geht, können wir es nicht außer Kraft setzen.
Stellen Sie sich nun vor, Sie schreiben (dies wird als Mutation bezeichnet) „greet.js“ (in Bezug auf die Antwort von Renee) als neu
Wie Sie sehen können, verweisen module.exports und exports auf dieselbe Referenz, die eine Funktion ist. Wenn Sie eine Eigenschaft für Exporte festlegen, wird sie für module.exports festgelegt, da Objekte in JS als Referenz übergeben werden.
Fazit ist immer, module.exports zu verwenden, um Verwirrung zu vermeiden. Hoffe das hilft. Viel Spaß beim Codieren 🙂
Auch dies ist eine schöne aufschlussreiche Antwort und ergänzt die Antwort von @goto-bus-stop . 🙂
– Varun
31. August 19 um 14:32 Uhr
Rodrigo Branas
Auch eine Sache, die zum Verständnis beitragen kann:
math.js
this.add = function (a, b) {
return a + b;
};
client.js
var math = require('./math');
console.log(math.add(2,2); // 4;
Und jetzt wird von require zurückgegeben, was in module.exports definiert wurde, nicht mehr this oder exports.
Eine andere Möglichkeit wäre:
math.js
module.exports.add = function (a, b) {
return a + b;
};
Oder:
math.js
exports.add = function (a, b) {
return a + b;
};
Feng Shuo
Renes Antwort über die Beziehung zwischen exports und module.exports ist ganz klar, es dreht sich alles um Javascript-Referenzen. Möchte nur ergänzen:
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 wir diese beiden Variablen auf dasselbe Objekt verweisen lassen.
node macht sowas:
module.exports = exports = {}
module.exports und exports beziehen sich auf dasselbe Objekt.
Dies geschieht nur aus Bequemlichkeit. also anstatt sowas zu schreiben
module.exports.PI = 3.14
wir können schreiben
exports.PI = 3.14
Es ist also in Ordnung, eine Eigenschaft zu Exporten hinzuzufügen, aber es ist nicht in Ordnung, sie einem anderen Objekt zuzuweisen
exports.add = function(){
.
.
}
↑ das ist OK und dasselbe wie module.exports.add = function(){…}
exports = function(){
.
.
}
↑ das ist nicht in Ordnung und es wird ein leeres Objekt zurückgegeben, da module.exports immer noch auf {} verweist und Exporte auf ein anderes Objekt verweisen.
Simonwo
myTest.js
module.exports.get = function () {};
exports.put = function () {};
console.log(module.exports)
// output: { get: [Function], put: [Function] }
exports und module.exports gleich sind und auf das gleiche Objekt verweisen. Sie können Eigenschaften nach Belieben auf beide Arten hinzufügen.
Dharman
Da alle oben geposteten Antworten gut erklärt sind, möchte ich etwas hinzufügen, mit dem ich heute konfrontiert war.
Wenn Sie etwas mit exports exportieren, müssen Sie es mit Variablen verwenden. Mögen,
Datei1.js
exports.a = 5;
In einer anderen Datei
Datei2.js
const A = require("./File1.js");
console.log(A.a);
und verwenden module.exports
Datei1.js
module.exports.a = 5;
In Datei2.js
const A = require("./File1.js");
console.log(A.a);
und default module.exports
Datei1.js
module.exports = 5;
in Datei2.js
const A = require("./File2.js");
console.log(A);
.
7592100cookie-checkUnterschied zwischen “module.exports” und “exports” im CommonJs Module Systemyes
Verwenden Sie immer
module.exports
.– Gabriel Lamas
5. Mai 13 um 11:04 Uhr
Ich denke, die Befolgung der oben genannten Ratschläge ermöglicht es, dieses Problem zu vermeiden.
– Vitalii Korsakow
26. September 13 um 10:30 Uhr
@GabrielLlamas, also warum verwenden viele Pakete nur
exports
zum Beispiel github.com/tj/consolidate.js/blob/master/lib/consolidate.js?– CodyBugstein
9. Februar 15 um 7:48 Uhr
@Imray Wenn Sie immer verwenden
module.exports
Sie werden nie falsch liegen, aber Sie können verwendenexports
wenn Sie das standardmäßig exportierte Objekt nicht ersetzen, das heißt, wenn Sie einfach Eigenschaften wie diese anhängen:var foo = require('foo').foo
. Diesfoo
Eigenschaft kann wie folgt exportiert werden:exports.foo = ...
und natürlich auch mitmodule.exports
. Es ist eine persönliche Entscheidung, aber ich verwende derzeitmodule.exports
undexports
passend.– Gabriel Lamas
9. Februar 15 um 9:13 Uhr
Ich bevorzuge exports.myFunc = function() {}, damit ich keine Exportliste am Ende der Datei führen muss. Es fühlt sich näher an der üblichen Praxis des Exports an, wenn Sie in ES6 deklarieren.
– SacWebDeveloper
7. Oktober 19 um 7:20 Uhr