Node.js module.exports vs. Exporte

Was sind sie, wie man sie benutzt und wie man sie nicht benutzt

(Beachten Sie, dass dieser Artikel nach der Version 6.1.0 von Node.js geschrieben wurde.)

TL; DR

  • Stellen Sie sich module.exports als die Variable vor, die von require () zurückgegeben wird. Es ist standardmäßig ein leeres Objekt, und es ist in Ordnung, etwas zu ändern.
  • Exporte? Nun, "Exporte" selbst werden niemals zurückgegeben!Es ist nur ein Verweis auf module.exports; Eine Convenience-Variable, mit der Modulautoren weniger Code schreiben können. Das Arbeiten mit seinen Eigenschaften ist sicher und wird empfohlen.
exports.method = function() {…} 
vs.
module.exports.method = function() {…}

Ein einfaches Modulbeispiel

Zunächst benötigen wir eine Beispielcodebasis. Beginnen wir mit einem einfachen Taschenrechner:

Verwendung:

Der Modul-Wrapper

Node.js umschließt intern alle erforderlichen () - ed-Module in einem Funktionsumbruch:

Das Modulobjekt

Die Variable " Modul " ist ein Objekt, das das aktuelle Modul darstellt. Es ist für jedes Modul lokal und auch privat (nur über den Modulcode zugänglich):

Module.exports

  • Es ist die Objektreferenz, die von den Aufrufen require () zurückgegeben wird.
  • Es wird automatisch von Node.js erstellt.
  • Es ist nur eine Referenz auf ein einfaches JavaScript-Objekt.
  • Standardmäßig ist es auch leer (unser Code fügt ihm eine "add ()" - Methode hinzu).

Es gibt zwei Möglichkeiten, wie wir module.exports verwenden können:

  1. Anhängen öffentlicher Methoden (wie im Beispiel des Taschenrechners).
  2. Ersetzen Sie es durch unser benutzerdefiniertes Objekt oder unsere benutzerdefinierte Funktion.

Warum ersetzen? Beim Ersetzen können wir jede beliebige Instanz einer anderen Klasse zurückgeben. Hier ist ein Beispiel aus ES2015:

Oben exportiert "Rechnerbasis" eine Klasse.

Erweitern wir diesmal die Klasse "Calculator" und exportieren eine Instanz:

Verwendung:

Exportiert Alias

  • "Exporte" ist nur eine praktische Variable, damit Modulautoren weniger Code schreiben können
  • Das Arbeiten mit seinen Eigenschaften ist sicher und wird empfohlen.

    (zB: exports.add = function…)

  • Exporte werden NICHT von require () zurückgegeben (module.exports is!)

Hier sind einige gute und einige schlechte Beispiele:

Hinweis: Es ist üblich, module.exports durch benutzerdefinierte Funktionen oder Objekte zu ersetzen. Wenn wir das tun, aber trotzdem weiterhin die Abkürzung „Exporte“ verwenden möchten; dann müssen "Exporte" erneut auf unser neues benutzerdefiniertes Objekt verweisen (ebenfalls im obigen Code in Zeile 12):

exports = module.exports = {}
exports.method = function() {...}

Fazit

Eine Variable namens Exporte , die nicht vollständig exportiert wird, ist verwirrend, insbesondere für Neulinge in Node.js. Auch die offizielle Dokumentation hat eine etwas seltsame Einstellung:

Wenn Ihnen die Beziehung zwischen Exporten und module.exports magisch erscheint, ignorieren Sie Exporte und verwenden Sie nur module.exports.

Meiner Meinung nach ist Code keine Magie. Entwickler sollten immer ein tieferes Verständnis der von ihnen verwendeten Plattformen und Sprachen suchen. Auf diese Weise; Programmierer gewinnen wertvolles Vertrauen und Wissen, was sich wiederum positiv auf die Codequalität, die Systemarchitektur und die Produktivität auswirkt.

Vielen Dank für das Lesen meines Beitrags. Feedback und Gedanken sind im Kommentarbereich immer willkommen.

Lazlojuly

Zum Thema passende Artikel:

  • Sind Node.js Module Singletons?

Quellen:

  • Node.js Dokumentation zu Modulen

Testen Sie meine neue Blog-Serie zum Testen von Einheiten:

Wie fange ich mit Unit Testing an? Teil 1

Ich denke, viele von uns können sich auf eine oben dargestellte Situation beziehen.

Ein Ort, an dem Unit-Tests als lästige Pflicht angesehen werden. medium.com