Unterschied zwischen “module.exports” und “exports” im CommonJs Module System

Lesezeit: 7 Minuten

Unterschied zwischen moduleexports und exports im CommonJs Module System
Entwickler lieben ZenUML

Auf dieser Seite (http://docs.nodejitsu.com/articles/getting-started/what-is-require), heißt es: „Wenn Sie das Objekt exports auf eine Funktion oder ein neues Objekt setzen möchten, müssen Sie das Objekt module.exports verwenden.“

Meine Frage ist warum.

// 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.

    – Vitalii Korsakow

    26. September 13 um 10:30 Uhr

  • @GabrielLlamas, also warum verwenden viele Pakete nur exportszum 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.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

1643916309 266 Unterschied zwischen moduleexports und exports im CommonJs Module System
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.

    – Vitalii Korsakow

    26. September 13 um 10:32 Uhr

  • Tolle Erklärung. Die Dokumentation für module.exports beschreibt es auch: nodejs.org/api/modules.html#modules_module_exports

    – Brian Morearty

    1. Mai 19 um 4:38 Uhr

  • Hier ist die Dokumentation für den Export: nodejs.org/api/modules.html#modules_exports_shortcutwas mir eine andere Ansicht des Verständnisses gab

    – Apollo

    23. Mai 19 um 3:37 Uhr

  • 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

exports.a = function() {
    console.log("Hello");
}

console.log(exports);
console.log(module.exports);

die Ausgabe wird sein

{ a: [Function] }
{ a: [Function] }

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

Unterschied zwischen moduleexports und exports im CommonJs Module System
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;

Super, in diesem Fall:

console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true

Daher ist “this” standardmäßig gleich module.exports.

Wenn Sie jedoch Ihre Implementierung ändern in:

math.js

var add = function (a, b) {
    return a + b;
};

module.exports = {
    add: add
};

In diesem Fall wird es gut funktionieren, aber “this” ist nicht mehr gleich module.exports, weil ein neues Objekt erstellt wurde.

console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false

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;
};

Unterschied zwischen moduleexports und exports im CommonJs Module System
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.

1643916310 182 Unterschied zwischen moduleexports und exports im CommonJs Module System
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.

1643916311 880 Unterschied zwischen moduleexports und exports im CommonJs Module System
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);

.

759210cookie-checkUnterschied zwischen “module.exports” und “exports” im CommonJs Module System

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy