JavaScript ist eine der am häufigsten verwendeten Programmiersprachen der Welt. Es ist die gemeinsame Sprache in der Webwelt und wird von allen Browsern verwendet. Die Geburt von JavaScript geht auf die Ära von Netscape zurück, und sein Kerninhalt wurde hastig entwickelt, um Microsoft zu bekämpfen und am damaligen heftigen Browserkrieg teilzunehmen. Aufgrund der vorzeitigen Veröffentlichung führten einige seiner schlechten Merkmale zwangsläufig.
Obwohl seine Entwicklungszeit kurz ist, verfügt JavaScript über viele leistungsstarke Funktionen, mit Ausnahme des Merkmals, einen globalen Namespace für jedes Skript zu teilen.
Sobald die Webseite mit JavaScript -Code geladen ist, wird sie in den globalen Namespace eingeleitet und teilen den gleichen Adressraum wie alle anderen geladenen Skripte, was zu vielen Sicherheitsproblemen, Konflikten und einigen häufigen Problemen führt, was die Verfolgung von Fehler schwer zu beheben macht.
Zum Glück hat Node einige Spezifikationen für das serverseitige JavaScript festgelegt und auch den CommonJS-Modulstandard implementiert. In diesem Standard hat jedes Modul seinen eigenen Kontext und unterscheidet sich von anderen Modulen. Dies bedeutet, dass Module den globalen Umfang nicht verschmutzen, da es überhaupt keinen sogenannten globalen Bereich gibt und Module sich nicht gegenseitig beeinträchtigen.
In diesem Kapitel erfahren wir mehr über verschiedene Module und wie man sie lädt.
Wenn Sie den Code in eine Reihe gut definierter Module aufteilen, können Sie Ihre Anwendung steuern. Im Folgenden lernen wir, wie Sie Ihre eigenen Module erstellen und verwenden.
Erfahren Sie, wie der Knoten Module lädt
Im Knoten können Module über Dateipfade oder Modulnamen referenziert werden. Wenn ein Nicht-Kern-Modul namentlich referenziert wird, spielt der Knoten den Modulnamen schließlich auf den entsprechenden Moduldateipfad an. Und diese Kernmodule, die Kernfunktionen enthalten, werden beim Start des Knotens vorinstalliert.
Zu den Nicht-Kern-Modulen gehören Module von Drittanbietern, die mit NPM (Node Package Manager) installiert wurden, sowie lokale Module, die von Ihnen oder Ihren Kollegen erstellt wurden.
Jedes vom aktuelle Skript importierte Modul wird dem Programmierer eine Reihe exponierter APIs vorlegt. Bevor Sie das Modul verwenden, müssen Sie die erforderliche Funktion verwenden, um sie wie folgt zu importieren:
Die Codekopie lautet wie folgt:
var modul = require ('module_name')
Der obige Code importiert ein Modul namens Module_Name. Es kann ein Kernmodul oder ein mit NPM installiertes Modul sein. Die erforderliche Funktion gibt ein Objekt zurück, das alle öffentlichen APIs des Moduls enthält. Abhängig vom Modul kann das zurückgegebene Objekt ein beliebiger JavaScript -Wert sein, es kann eine Funktion oder ein Objekt sein, das eine Reihe von Attributen enthält (Funktionen, Arrays oder JavaScript -Objekte).
Exportmodul
Das CommonJS -Modulsystem ist die einzige Möglichkeit, Objekte und Funktionen zwischen Dateien unter dem Knoten zu teilen. Für ein sehr komplexes Programm sollten Sie einige Klassen, Objekte oder Funktionen in eine Reihe gut definierter wiederverwendbarer Module rekonstruieren. Für Modulbenutzer wird das Modul nur den Code ausgesetzt, den Sie der Außenwelt angegeben haben.
Im folgenden Beispiel werden Sie verstehen, dass Dateien und Module im Knoten nacheinander entsprechen. Wir haben eine Datei namens Circle.js erstellt, die den Kreiskonstruktor nur nach außen exportiert.
Die Codekopie lautet wie folgt:
Funktionskreis (x, y, r) {
Funktion r_Squared () {
return math.pow (r, 2);
}
Funktionsbereich () {
return math.pi * r_squared ();
}
Rückgabe {Bereich: Bereich};
}
module.exports = circle;
Das Wichtigste im Code ist die letzte Zeile, die definiert, was das Modul nach außen exportiert. Das Modul ist eine spezielle Variable, die das aktuelle Modul selbst darstellt, und Modul.exports ist ein aus dem Modul exportierter Objekt. Es kann jedes Objekt sein. In diesem Beispiel exportieren wir den Kreiskonstruktor, damit Modulbenutzer dieses Modul zum Erstellen von Kreisinstanzen verwenden können.
Sie können auch einige komplexe Objekte modul.exports in ein leeres Objekt exportieren und alles exportieren, was Sie als Attribute des Moduls -Objekts in die äußere Welt aussetzen möchten. Sie haben beispielsweise ein Modul entworfen, das eine Reihe von Funktionen von außen freilegt:
Die Codekopie lautet wie folgt:
Funktion printa () {
console.log ('a');
}
Funktion printb () {
console.log ('b');
}
Funktion printc () {
console.log ('c');
}
module.exports.printa = printa;
module.exports.printb = printb;
module.exports.pi = math.pi;
Dieses Modul exportiert zwei Funktionen (Printa und PrintB) und eine Nummer (PI), und der aufrufende Code sieht folgendermaßen aus:
Die Codekopie lautet wie folgt:
var MyModule2 = require ('./ MYMODULE2');
myModule2.printa (); // -> a
MYMODULE2.PRINTB (); // -> b
console.log (MyModule2.pi); // -> 3.141592653589793
Lademodul
Wie bereits erwähnt, können Sie die erforderliche Funktion zum Laden von Modulen verwenden und sich keine Sorgen machen, dass das Aufrufen im Code den globalen Namespace beeinflusst, da im Knoten kein Konzept des globalen Namespace vorhanden ist. Wenn das Modul ohne Syntax- oder Initialisierungsfehler vorhanden ist, gibt die erforderliche Funktion das Modulobjekt zurück und Sie können dieses Objekt auch einer lokalen Variablen zuweisen.
Es gibt verschiedene Arten von Modulen, die grob in Kernmodule, lokale Module und Drittanbieter-Module unterteilt werden können, die über NPM installiert sind. Gemäß der Art des Moduls gibt es verschiedene Möglichkeiten, sich auf Module zu beziehen. Lassen Sie uns unten über dieses Wissen informieren.
Laden des Kernmoduls
Der Knoten hat einige Module, die in Binärdateien kompiliert werden, die als Kernmodule bezeichnet werden. Sie können nicht durch Pfade verwiesen werden und können nur mit Modulnamen verwendet werden. Das Kernmodul hat die höchste Ladepriorität, und selbst wenn es bereits ein modules Drittanbieter gibt, wird das Kernmodul zuerst geladen.
Wenn Sie beispielsweise das HTTP -Kernmodul laden und verwenden möchten, können Sie dies tun:
Die Codekopie lautet wie folgt:
var http = required ('http');
Dadurch wird ein Objekt zurückgegeben, das das HTTP -Modul enthält, das die APIs der in der Knoten -API -Dokumentation definierten HTTP -Module enthält.
Laden des Dateimoduls
Sie können auch absolute Pfade verwenden, um Module aus dem Dateisystem zu laden:
Die Codekopie lautet wie folgt:
var MyModule = Request ('/home/pedro/my_modules/my_module');
Sie können auch einen relativen Pfad verwenden, der auf der aktuellen Datei basiert:
Die Codekopie lautet wie folgt:
var MyModule = Request ('../ my_modules/my_module');
var MyModule2 = required ('./ lib/my_module_2');
Achten Sie auf den obigen Code. Sie können die Erweiterung des Dateinamens weglassen. Wenn Node diese Datei nicht finden kann, werden Sie versuchen, ein JS -Suffix nach dem Dateinamen erneut zu suchen (Anmerkung des Übersetzers: Tatsächlich suchen Sie zusätzlich zu JS auch nach JSON und Node. Weitere Informationen finden Sie in der offiziellen Website -Dokumentation). Wenn eine Datei namens My_Module.js im aktuellen Verzeichnis vorhanden ist, gibt es zwei Lademethoden:
Die Codekopie lautet wie folgt:
var mymodule = required ('./ my_module');
var mymodule = required ('./ my_module.js');
Laden des Verzeichnismoduls
Sie können auch den Verzeichnispfad verwenden, um das Modul zu laden:
Die Codekopie lautet wie folgt:
var MyModule = Request ('./ MyModuledir');
Node geht davon aus, dass dieses Verzeichnis ein Modulpaket ist und versucht, nach dem Paketdefinitionsdatei -Paket.json in diesem Verzeichnis zu suchen.
Wenn nicht gefunden wird, geht der Knoten davon aus, dass der Einstiegspunkt des Pakets die Index.js -Datei ist (Übersetzer Anmerkung: Zusätzlich zu Index.js wird auch nach Index.node gesucht, und die .node -Datei ist das Binärerweiterungspaket des Knotens, siehe offizielles Dokument für Details). Der obige Code ist ein Beispiel. Der Knoten wird versuchen, die Datei ./mymoduledir/index.js zu finden.
Im Gegenteil, wenn die Datei Package.json gefunden wird, versucht der Knoten, ihn zu analysieren und nach dem Hauptattribut in der Paketdefinition zu suchen und dann den Wert des Hauptattributs als relativer Pfad des Einstiegspunkts zu verwenden. In diesem Beispiel, wenn package.json wie folgt definiert ist:
Die Codekopie lautet wie folgt:
{
"Name": "MyModule",
"Main": "./lib/mymodule.js"
}
Der Knoten versucht, die Datei ./mymoduledir/lib/mymodule.js zu laden
Laden Sie aus dem Verzeichnis node_modules
Wenn die Parameter der Erforderungsfunktion keine relativen Pfade oder Kernmodulnamen sind, wird der Knoten im Subdadum der NODE_MODULES des aktuellen Verzeichnisses durchsucht. Im folgenden Code wird beispielsweise der Knoten versucht, die Datei zu finden./node_modules/mymodule.js:
Die Codekopie lautet wie folgt:
var MyModule = Request ('myModule.js');
Wenn nicht gefunden, sucht der Knoten weiterhin im Ordner node_modules des oberen Verzeichnisses. Wenn Sie nicht gefunden werden, suchen Sie weiter im oberen Verzeichnis, bis das entsprechende Modul gefunden oder das Stammverzeichnis erreicht ist.
Sie können diese Funktion verwenden, um den Inhalt oder die Module des Verzeichnisses node_modules zu verwalten. Es ist jedoch am besten, die Modulverwaltungsaufgaben an den NPM zu übergeben (siehe Kapitel 1). Das lokale Verzeichnis node_modules ist der Standardspeicherort für das NPM -Installationsmodul. Dieses Design assoziiert den Knoten und NPM miteinander. Normalerweise müssen Sie sich als Entwickler nicht zu sehr um diese Funktion kümmern. Sie können Pakete einfach mit NPM installieren, aktualisieren und löschen, wodurch Sie das Verzeichnis node_modules beibehalten können.
Cache -Modul
Das Modul wird nach dem ersten erfolgreichen Laden zwischengespeichert, dh wenn der Modulname auf denselben Dateipfad gelöst wird, gibt jeder Anruf ('MyModule') genau das gleiche Modul zurück.
Beispielsweise gibt es ein Modul namens My_Module.js, das den folgenden Inhalt enthält:
Die Codekopie lautet wie folgt:
console.log ('modul my_module initialisierung ...');
module.exports = function () {
console.log ('hi!');
};
console.log ('my_module initialisiert.');
Verwenden Sie dann den folgenden Code, um das Modul zu laden:
Die Codekopie lautet wie folgt:
var MyModuleinstance1 = fordert ('./ My_Module');
Es erzeugt die folgende Ausgabe:
Die Codekopie lautet wie folgt:
Modul my_module initialisieren ...
my_module initialisiert
Wenn wir es zweimal importieren:
Die Codekopie lautet wie folgt:
var MyModuleinstance1 = fordert ('./ My_Module');
var MyModuleinstance2 = require ('./ my_module');
Die Ausgabe ist still:
Die Codekopie lautet wie folgt:
Modul my_module initialisieren ...
my_module initialisiert
Das heißt, der Initialisierungscode des Moduls wird nur einmal ausgeführt. Wenn Sie Ihr eigenes Modul erstellen, müssen Sie diese Funktion besondere Aufmerksamkeit schenken.
Zusammenfassung
Der Knoten hat den globalen globalen Umfang von JavaScript abgesagt und stattdessen das CommonJS -Modulsystem übernommen, damit Sie Ihren Code besser organisieren und viele Sicherheitsprobleme und Fehler vermeiden können. Sie können die erforderliche Funktion verwenden, um Kernmodule, Module von Drittanbietern zu laden oder Ihre eigenen Module aus Dateien und Verzeichnissen zu laden.
Sie können auch relative oder absolute Pfade verwenden, um Nicht-Kernmodule zu laden. Wenn Sie das Modul in das Verzeichnis node_modules oder für mit NPM installierte Module einfügen, können Sie den Modulnamen auch direkt zum Laden verwenden.
Anmerkung des Übersetzers:
Es wird empfohlen, dass die Leser die Modulkapitel des offiziellen Dokuments lesen. Ich persönlich bin der Meinung, dass es klarer ist als der Autor. Ein sehr repräsentatives Beispiel wurde beigefügt, was bei der Verständnis des Notenmoduls von großer Hilfe sein wird. Das Folgende wird ebenfalls zitiert:
Die Codekopie lautet wie folgt:
Verwenden erfordert (x), um Module unter Pfad Y zu laden
1. Wenn x das Kernmodul ist,
A. Laden und geben Sie das Kernmodul zurück und geben Sie sie zurück
B. Ende
2. Wenn X mit './' oder '/' oder '../ beginnt
A. Load_as_file (y + x)
B. Load_as_directory (y + x)
3.. Load_Node_Modules (x, DirName (y))
4. Wirf eine Ausnahme: "Nicht gefunden"
Load_as_file (x)
1. Wenn x eine Datei ist, laden Sie X als JavaScript -Skript und enden Sie nach dem Laden
2. Wenn X.js eine Datei ist, laden Sie X.js als JavaScript -Skript und enden Sie nach dem Laden
3. Wenn x.node eine Datei ist, laden Sie x.node als Knoten-Binär-Plug-In und enden Sie nach dem Laden.
Load_as_directory (x)
1. Wenn die Datei x/package.json existiert,
A. Parses x/package.json und finden Sie das "Haupt" -Feld.
B. Auch M = x + (Wert des Hauptfeldes)
C. Load_as_file (m)
2. Wenn die Datei x/index.js vorhanden ist, laden Sie x/index.js als JavaScript -Skript und enden Sie nach dem Laden.
3. Wenn die Datei x/index.node existiert, laden Sie x/index.node als Knoten-Binär-Plug-In und enden nach dem Laden.
Lade_node_modules (x, start)
1. Auch Dirs = node_modules_paths (Start)
2. Führen Sie die folgenden Operationen für jedes Verzeichnis unter Dirs aus:
A. Load_as_file (Dir/x)
B. Load_as_directory (Dir/x)
Node_modules_paths (start)
1. Auch Teile = Pfadaufteilung (Start)
2. Auch root = Index der ersten Instanz von "node_modules" in Teilen oder 0
3. Auch i = Graf der Teile - 1
4. Auch Dirs = []
5. während ich rost,
A. Wenn Teile [i] = "NODE_MODULES" "Der Nachbeobachtungsvorgang dauert ansonsten der nächsten Schleife fort
C. Dir = Pfad Join (Teile [0 .. i] + "node_modules")
B. Dirs = Dirs + Dir
C. Auch i = i - 1
6. Kehre zu Dirs zurück