Frage Was ist der Zweck von Node.js module.exports und wie benutzt man sie?


Was ist der Zweck von Node.js module.exports und wie benutzt man sie?

Ich kann anscheinend keine Informationen darüber finden, aber es scheint ein ziemlich wichtiger Teil von Node.js zu sein, wie ich es oft im Quellcode sehe.

Entsprechend der Node.js Dokumentation:

Modul 

Ein Verweis auf die aktuelle    module. Bestimmtes module.exports   ist dasselbe wie das Exportobjekt. Sehen    src/node.js für mehr Informationen.

Aber das hilft nicht wirklich.

Was genau macht module.exports und was wäre ein einfaches Beispiel?


1237
2018-03-15 11:56


Ursprung


Antworten:


module.exports ist das Objekt, das tatsächlich als Ergebnis von a zurückgegeben wird require Anruf.

Das exports Die Variable wird anfänglich auf dasselbe Objekt gesetzt (d. h. es handelt sich um einen Kurzschreib- "Alias"), so dass Sie im Modulcode normalerweise Folgendes schreiben würden:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

Exportieren (oder "Expose") der intern definierten Funktionen myFunc1 und myFunc2.

Und im aufrufenden Code würden Sie verwenden:

var m = require('./mymodule');
m.myFunc1();

wo die letzte Zeile zeigt, wie das Ergebnis von require ist (normalerweise) nur ein einfaches Objekt, auf dessen Eigenschaften zugegriffen werden kann.

NB: Wenn Sie überschreiben exports dann wird es sich nicht mehr beziehen module.exports. Wenn Sie also ein neues Objekt (oder eine Funktionsreferenz) zuweisen möchten exports dann sollten Sie das neue Objekt auch zuweisen module.exports


Es ist erwähnenswert, dass der Name der hinzugefügt wurde exports Das Objekt muss nicht mit dem internen Bereichsnamen des Moduls für den hinzuzufügenden Wert identisch sein.

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

gefolgt von:

var m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName

1452
2018-03-15 12:00



Dies wurde bereits beantwortet, aber ich wollte etwas Klärung hinzufügen ...

Sie können beide verwenden exports und module.exports So importieren Sie Code in Ihre Anwendung:

var mycode = require('./path/to/mycode');

Der grundlegende Anwendungsfall, den Sie sehen werden (z. B. im ExpressJS-Beispielcode), besteht darin, dass Sie Eigenschaften für den exports Objekt in einer JS-Datei, die Sie dann mit importieren require()

In einem einfachen Zählbeispiel könnten Sie also

(counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... dann in Ihrer Anwendung (web.js, oder wirklich jede andere .js-Datei):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

Einfach gesagt können Sie sich benötigte Dateien als Funktionen vorstellen, die ein einzelnes Objekt zurückgeben, und Sie können Eigenschaften (Zeichenfolgen, Zahlen, Arrays, Funktionen, irgendetwas) zum Objekt hinzufügen, das zurückgegeben wird, indem Sie sie setzen exports.

Manchmal möchten Sie, dass das Objekt von a zurückgegeben wird require() Aufruf als Funktion, die Sie aufrufen können, und nicht nur ein Objekt mit Eigenschaften. In diesem Fall müssen Sie auch einstellen module.exports, so was:

(sayhello.js):

module.exports = exports = function() {
    console.log("Hello World!");
};

(app.js):

var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"

Der Unterschied zwischen exports und module.exports wird in. Besser erklärt diese Antwort hier.


194
2017-10-16 05:03



Beachten Sie, dass der NodeJS-Modulmechanismus darauf basiert CommonJS Module, die in vielen anderen Implementierungen wie unterstützt werden ErfordernJS, aber auch SproutCore, CouchDB, Wakanda, Orientierungsdatenbank, ArangoDB, RingoJS, TeeJS, SeideJS, locken.js, oder auch Adobe Photoshop (über PSLib). Sie können die vollständige Liste der bekannten Implementierungen finden Hier.

Sofern Ihr Modul keine knotenspezifischen Funktionen oder Module verwendet, empfehle ich Ihnen, es zu verwenden exports Anstatt von module.exports  Das ist nicht Teil des CommonJS-Standardsund dann meist nicht von anderen Implementierungen unterstützt.

Ein weiteres NodeJS-spezifisches Feature ist, wenn Sie einen Verweis auf ein neues Objekt zuweisen exports anstatt nur Eigenschaften und Methoden hinzuzufügen, wie im letzten Beispiel von Jed Watson in diesem Thread. Ich würde diese Praxis persönlich ablehnen bricht die kreisförmige Referenzunterstützung Mechanismus des CommonJS-Moduls. Es wird dann nicht von allen Implementierungen unterstützt und Jed-Beispiel sollte dann auf diese Weise (oder eine ähnliche) geschrieben werden, um ein universelleres Modul bereitzustellen:

(sayhello.js):

exports.run = function() {
    console.log("Hello World!");
}

(app.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

Oder mit ES6-Funktionen

(sayhello.js):

Object.assign(exports, {
    // Put all your public API here
    sayhello() {
        console.log("Hello World!");
    }
});

(app.js):

const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"

PS: Es sieht so aus, als ob Appcelerator auch CommonJS-Module implementiert, aber ohne die zirkuläre Referenzunterstützung (siehe: Appcelerator- und CommonJS-Module (Caching und Zirkelreferenzen))


53
2018-01-20 12:35



Einige wenige Dinge müssen Sie beachten, wenn Sie einen Verweis auf ein neues Objekt zuweisen exports und / oder modules.exports:

1. Alle Eigenschaften / Methoden, die zuvor dem Original hinzugefügt wurden exports oder module.exports sind natürlich verloren, weil das exportierte Objekt nun auf ein neues verweist

Dieser ist offensichtlich, aber Wenn Sie eine exportierte Methode am Anfang eines vorhandenen Moduls hinzufügen, müssen Sie sicherstellen, dass das native exportierte Objekt am Ende kein anderes Objekt referenziert

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. Falls einer von exports oder module.exports einen neuen Wert referenzieren, verweisen sie nicht mehr auf dasselbe Objekt

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. Tricky Konsequenz. Wenn Sie den Verweis auf beide ändern exports und module.exports, schwer zu sagen, welche API verfügbar ist (wie es aussieht module.exports Gewinnt)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

31
2018-01-25 09:02



Mit der Eigenschaft module.exports oder dem exports-Objekt kann ein Modul auswählen, was mit der Anwendung geteilt werden soll

enter image description here

Ich habe ein Video über module_export verfügbar Hier


23
2017-09-03 19:01



Wenn Sie Ihren Programmcode auf mehrere Dateien verteilen, module.exports wird verwendet, um Variablen und Funktionen für den Verbraucher eines Moduls zu veröffentlichen. Das require() Aufruf Ihrer Quelldatei wird durch entsprechende ersetzt module.exports vom Modul geladen.

Denken Sie daran, wenn Sie Module schreiben

  • Modulladungen werden zwischengespeichert, nur der erste Aufruf bewertet JavaScript.
  • Es ist möglich, lokale Variablen und Funktionen innerhalb eines Moduls zu verwenden, nicht alles muss exportiert werden.
  • Das module.exports Objekt ist auch als verfügbar exports Kurzschrift. Verwenden Sie jedoch immer nur eine einzige Funktion module.exports.

module exports diagram

Gemäß: "Module Teil 2 - Schreibmodule".


17
2017-08-06 21:05



Der Verweislink ist wie folgt:

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

die Eigenschaften von exports oder module.exports B. Funktionen oder Variablen, werden außerhalb exponiert

Da ist etwas, dem du mehr Aufmerksamkeit schenken musst: Tu es nicht override Exporte.

Warum ?

Da nur die Referenz von module.exports exportiert wird, können Sie die Eigenschaften den Exporten hinzufügen. Wenn Sie jedoch die Exporte überschreiben, wird die Referenzverbindung unterbrochen.

gutes Beispiel :

exports.name = 'william';

exports.getName = function(){
   console.log(this.name);
}

schlechtes Beispiel :

exports = 'william';

exports = function(){
     //...
}

Wenn Sie nur eine Funktion oder Variable wie folgt anzeigen möchten:

// test.js
var name = 'william';

module.exports = function(){
    console.log(name);
}   

// index.js
var test = require('./test');
test();

Dieses Modul enthüllte nur eine Funktion und die Eigenschaft name ist privat für die Außenseite.


8
2018-04-18 00:53



Es gibt einige standardmäßige oder vorhandene Module in node.js, wenn Sie node.js herunterladen und installieren http, sys etc.

Da sie bereits in node.js sind, mögen wir diese Module grundsätzlich Importmodule, aber warum? weil sie bereits in node.js vorhanden sind. Das Importieren ist wie wenn man sie von node.js nimmt und sie in Ihr Programm einfügt. Und dann benutze sie.

Wohingegen Exporte ist genau das Gegenteil, Sie erstellen das Modul, das Sie wollen, sagen wir das Modul addition.js und setzen dieses Modul in die node.js, Sie tun es, indem Sie es exportieren.

Bevor ich hier etwas schreibe, erinnere dich, module.exports.additionTwo ist das gleiche wie exports.additionTwo


4
2017-07-27 20:49