Antwort des Renee ist gut erklärt. Ergänzung zur Antwort mit einem Beispiel:
Knoten macht eine Menge Dinge zu Ihrer Datei und eine der wichtigsten ist WRAPPING Ihre Datei. Innerhalb von nodejs wird der Quellcode "module.exports" zurückgegeben. Lass uns einen Schritt zurückgehen und den Wrapper verstehen. Angenommen, Sie haben
greet.js
var greet = function() {
console.log('Hello World');
};
module.exports = greet;
der obige Code wird als IIFE gewickelt (sofort aufgerufen Funktion Expression) innerhalb NodeJS Quellcode wie folgt:
(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 zurückgegebene module.exports. Zu diesem Zeitpunkt zeigt module.exports und exports auf den gleichen Verweis.
Nun stellen Sie greet.js als
exports = function() {
console.log('Hello World');
};
console.log(exports);
console.log(module.exports);
der Ausgang
[Function]
{}
der Grund sein wird, neu schreiben: module.exports ein leeres Objekt ist. Wir haben nichts auf module.exports gesetzt, sondern exports = function() ..... in new greet.js. Also, module.exports ist leer.
Technisch Exporte und module.exports sollten auf die gleiche Referenz verweisen (das ist korrekt !!). Aber wir verwenden "=", wenn wir export Funktionen() ... zuweisen, wodurch ein anderes Objekt im Speicher erzeugt wird. Modul.exports und exports produzieren also unterschiedliche Ergebnisse. Wenn es um Exporte geht, können wir es nicht überschreiben.
Nun stellen Sie neu zu schreiben (dies wird als Mutation) greet.js (bezogen auf Renee Antwort) als
exports.a = function() {
console.log("Hello");
}
console.log(exports);
console.log(module.exports);
der Ausgang
{ a: [Function] }
{ a: [Function] }
werden Sie sehen: module.exports und exports zeigen auf dieselbe Referenz, die eine Funktion ist. Wenn Sie eine Eigenschaft für Exporte festlegen, wird sie auf module.exports festgelegt, da Objekte in JS als Verweis übergeben werden.
Fazit ist immer module.exports verwenden, um Verwirrung zu vermeiden. Hoffe, das hilft. Happy coding :)
Verwenden Sie immer 'module.exports'. –
Ich denke, die oben genannten Ratschläge können dieses Problem vermeiden. –
@GabrielLlamas Warum verwenden viele Pakete nur 'exports', zum Beispiel https://github.com/tj/consolidate.js/blob/master/lib/consolidate.js? – CodyBugstein