Einführung und Informationen
Durch die offizielle API von node.js können wir sehen, dass Node.js selbst viele Kernmodule http://nodejs.org/api/ liefert. Diese Kernmodule werden in Binärdateien kompiliert und können durch Forderung erhalten werden („Modulname“). Das Kernmodul hat die höchste Ladepriorität (es wird reflektiert, wenn es ein Modul und das Kernmodul mit demselben Namen gibt).
(Diesmal sprechen wir hauptsächlich über benutzerdefinierte Module)
Node.js hat auch einen Modulyp, der ein Dateimodul ist, das eine JavaScript -Codedatei (.js als Datei -Suffix), eine JSON -Format -Textdatei (.json als Dateisuffix) oder eine bearbeitete C/C ++ -Datei (.node als Datei -Suffix) sein kann.
Auf die Dateimodulzugriffsmethode wird über Request ('/Dateiname.suffix') zugegriffen. Erforderlich ('./ FileName.suffix') Requrie ('../ Dateiname.suffix') und das Datei -Suffix kann weggelassen werden. Beginnen Sie mit "/" mit einem absoluten Pfad, beginnend mit "./" und beginnend mit "../" bedeutet, mit einem relativen Pfad zu laden, und beginnend mit "./" bedeutet, mit einer Datei in einem Verzeichnis derselben Ebene zu laden.
Das zuvor erwähnte Datei -Suffix kann weggelassen werden.
Erstellen Sie ein benutzerdefiniertes Modul
Nehmen Sie einen Zähler als Beispiel
Die Codekopie lautet wie folgt:
var outputVal = 0; // Ausgabewert
var Increment = 1; // Inkrement
/* Ausgangswert einstellen*/
Funktion seoutputval (val) {
outputVal = val;
}
/* Inkrement einstellen*/
FunktionsetIncrement (Incrementval) {
Increment = Incrementval;
}
/* Ausgabe*/
Funktion PrintNextCount ()
{
outputVal += Inkrement;
console.log (outputval);
}
Funktion printoutputval () {
console.log (outputval);
}
exports.seoutputval = seoutputval;
exports.setIncrement = setIncrement;
module.exports.printnextCount = printNextCount;
Beispiel für benutzerdefiniertes Modul Beispiel für Quellcode
Der Schwerpunkt des Beispiels liegt in Exporten und Modul.exports; Es bietet eine externe Zugriffsoberfläche. Rufen wir es an, um den Effekt zu sehen.
Aufrufen von benutzerdefinierten Modulen
Die Codekopie lautet wie folgt:
/*
Eine Node.js -Datei ist ein Modul, das JavaScript -Code, JSON oder kompilierte C/C ++ - Erweiterungen sein kann.
Zwei wichtige Objekte:
erfordern, Module von außen zu erhalten
Exporte enthüllt die Modulschnittstelle
*/
var counter = require ('./ 1_modules_custom_counter');
console.log ('Erster Anruf zum Modul [1_Modules_Custom_counter]');
counter.seoutputval (10); // Zählung ab 10 festlegen
counter.setIncrement (10); // Setzen Sie das Inkrement auf 10
Counter.printnextCount ();
Counter.printnextCount ();
Counter.printnextCount ();
Counter.printnextCount ();
/*
Erfordernde Aufrufe desselben Moduls mehrmals werden wiederholt nicht geladen
*/
var counter = require ('./ 1_modules_custom_counter');
console.log ('zweites Anrufmodul [1_Modules_Custom_counter]');
Counter.printnextCount ();
Custom -Modus -Anrufquellcode
Führen Sie es aus und stellen Sie fest, dass beide Methoden, die der Öffentlichkeit durch Exporte und Module ausgesetzt sind, zugegriffen werden können!
Wie Sie im Beispiel sehen können, erhalte ich das Modul zweimal, indem ich ('./ 1_modules_custom_counter') erfordert, aber nach der zweiten Referenz nenne ich die PrintNextCount () -Methode ab 60 ~~~
Der Grund dafür ist, dass Node.js das gleiche Modul mehrmals über Anforderung aufruft und nicht wiederholt lädt. Node.js kann alle geladenen Dateimodule entsprechend dem Dateinamen zwischengespeichert, sodass sie nicht neu geladen werden.
Hinweis: Durch das Durchschneiden von Dateiname bezieht sich auf den tatsächlichen Dateinamen und wird nicht als verschiedene Dateien angesehen, da der eingehende Pfad unterschiedlich ist.
In der von mir erstellten 1_modules_custom_counter -Datei befindet sich eine PrintoutputVal () -Methode, die keine öffentlichen Zugriffsmethoden über Exporte oder modul.exports bietet.
Was passiert, wenn Sie direkt auf die Datei 1_modules_load zugreifen?
Die Antwort lautet: TypeError: Object #<Object> hat keine Methode 'printoutputval' '
Unterschied zwischen Exporten und Modul.exports
Im obigen Beispiel sind sowohl Exporte als auch Modul.exports für den Zugriff erhältlich! Da beide den Effekt erzielen können, muss es einen kleinen Unterschied geben.
Die Codekopie lautet wie folgt:
var counter = 0;
exports.printnextCount = function () {
Zähler += 2;
console.log (Zähler);
}
var iseq = (exports === module.exports);
console.log (ISEQ);
2_modules_diff_exports.js Dateiquellencode
Erstellen wir eine neue 2_modules_diff_exports_load.js -Datei und rufen Sie sie auf
Die Codekopie lautet wie folgt:
var counter = require ('./ 2_modules_diff_exports');
Counter.printnextCount ();
Nach dem Aufrufen ist das Ausführungsergebnis wie in der obigen Abbildung gezeigt
I Ausgabe des Wertes von ISEQ in der Datei 2_Modules_Diff_exports_load.js (var iseq = (exports === module.exports);), die zurückgegebene true
PS: Beachten Sie, dass es drei gleiche Zeichen gibt. Wenn Sie nicht wissen, was Sie selbst suchen!
Beeilen Sie sich nicht, um Schlussfolgerungen zu ziehen. Ändern Sie diese beiden JS -Dateien in die entsprechenden Codes von Modul.exports
Die Codekopie lautet wie folgt:
// Der geänderte 2_Modules_Diff_exports.js Quellcode lautet wie folgt
var counter = 0;
module.exports = function () {
Zähler += 10;
this.printnextCount = Funktion ())
{
console.log (Zähler);
}
}
var iseq = (exports === module.exports);
console.log (ISEQ);
Die Codekopie lautet wie folgt:
// Der geänderte 2_modules_diff_exports_load.js -Dateiquellencode lautet wie folgt
var counter = require ('./ 2_modules_diff_exports');
var coterobj = neuer counter ();
coterobj.printnextCount ();
Nach dem Aufrufen ist das Ausführungsergebnis wie in der obigen Abbildung gezeigt
Ich mache den Wert von ISEQ in der Datei 2_Modules_Diff_exports_load.js (var iseq = (exports === module.exports);) und das zurückgegebene Falsch, das mit dem zuvor erhaltenen Ergebnis nicht abgeschlossen ist!
PS: Verwenden Sie counter.printnextCount () nicht; Zum Zugriff erhalten Sie nur eine Fehleraufforderung
Die API liefert Erklärung
http://nodejs.org/api/modules.html
Beachten Sie, dass Exporte ein Verweis auf Modul.exports sind, wodurch es nur für die Augmentation geeignet ist. Wenn Sie ein einzelnes Element wie einen Konstruktor exportieren
Exporte sind nur ein Adressverweis auf modul.exports. NodeJs exportieren nur den Zeiger von modul.exports. Wenn sich der Exportzeiger geändert hat, zeigen nur die Exporte nicht auf modul.exports, sodass sie nicht erneut exportiert werden.
Beziehen Sie sich auf andere Verständnisse:
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
http://zihua.li/2012/03/use-module-exports-or-exports-in-node/
Module.exports ist die reale Schnittstelle, Exporte ist nur ein Hilfsmittel dafür. Die endgültige Rückkehr zum Anruf ist modul.exports anstelle von Exporten.
Alle von Exporten gesammelten Eigenschaften und Methoden werden modul.exports zugeordnet. Natürlich gibt es dafür eine Voraussetzung, dh Modul.exports selbst hat keine Attribute oder Methoden.
Wenn Module.exports bereits über einige Eigenschaften und Methoden verfügt, werden die durch Exporte gesammelten Informationen ignoriert.
Exporte und Module.exports überschreiben
Das obige versteht auch grundsätzlich die Beziehung und den Unterschied zwischen Exporten und Modul.exports.
Rufergebnis
Wie aus den Ergebnissen ersichtlich ist, gibt es keinen Fehler, was bedeutet, dass es so definiert werden kann, aber im Endmodul.
Obwohl das Ergebnis nicht fehlerproduziert ist, wird es zwangsläufig einige Probleme in der Entwicklung geben, wenn Sie es so verwenden.
1. Es ist am besten, das Modul nicht zu definieren. Exports und Exporte separat
2.NodeJS -Entwickler empfehlen Modul.exports, um Objekte zu exportieren, und exportiert zum Exportieren mehrerer Methoden und Variablen.
andere...
In der API sind andere Methoden bereitgestellt, sodass ich nicht in Details eingehen werde. Basierend auf dem obigen Beispiel werden Sie es selbst selbst kennen, sobald Sie es ausgeben.
modul.id
Gibt die Modulkennung der Typ -Zeichenfolge zurück, die im Allgemeinen der voll analysierte Dateiname ist
Modul.FileName
Gibt einen vollständig analysierten Dateinamen eines Zeichenfolge -Typs zurück
modul.load
Gibt einen Bool -Typ zurück, um anzuzeigen, ob das Laden abgeschlossen ist
Modul.Parent
Gibt das Modul zurück, das das Modul verweist
Modul.Children
Gibt ein Array aller Modulobjekte zurück, auf die dieses Modul verwiesen wird