En este capítulo de la Netz schooljavascript.com Sie erfahren, wie das Modulsystem Node.js und CommonJS funktioniert und was die Funktion tut benötigen.
CommonJS zur Rettung
El lenguaje JavaScript no tenía una forma nativa de organizar el código antes del ES2015 Standard. Node.js füllte diese Lücke mit dem CommonJS-Modulformat. In diesem Artikel erfahren Sie, wie das Modulsystem Node.js funktioniert, wie Sie Ihre Module organisieren können und was der neue ES-Standard für die Zukunft von Node.js bedeutet.
Was ist das Modulsystem?
Module sind die Grundbausteine der Codestruktur. Mit dem Modulsystem können Sie Ihren Code organisieren, Informationen ausblenden und nur die öffentliche Schnittstelle einer Komponente mit verfügbar machen module.exports. Jedes Mal, wenn Sie den Anruf verwenden benötigen; Daher laden Sie ein anderes Modul.
Das einfachste Beispiel kann mit CommonJS das folgende sein:
// add.js Funktion add (a, b) {return a + b} module.exports = add
So verwenden Sie die Modul hinzufügen Wir haben gerade geschaffen, wir müssen danach fragen.
// index.js const add = require ('./ add') console.log (add (4, 5)) // 9
Obwohl es nicht auffällt, add.js Es wird von Node.js wie folgt verpackt:
(Funktion (exportiert, erfordert, Modul, __Dateiname, __Dirnname) {Funktion add (a, b) {return a + b} module.exports = add})
Aus diesem Grund können Sie auf globale Typvariablen wie zugreifen benötigen y Modul. También asegura que tus variables estén dentro del Umfang de tu módulo en lugar del objeto global.
Wie erfordert Arbeit?
El mecanismo de carga del módulo en Node.js almacena en Zwischenspeicher los módulos en la primera llamada a benötigen. Es bedeutet, dass jedes Mal, wenn Sie verwenden: erfordern ('awesome-module')erhalten Sie die gleiche Instanz von Awesome-Modul, was garantiert, dass die Module vom Typ sind Singleton und haben den gleichen Status in Ihrer Anwendung.
Sie können native Module und Pfadreferenzen aus Ihrem Dateisystem oder installierten Modulen laden. Wenn der Bezeichner an die Funktion übergeben wurde benötigen Da es sich nicht um ein natives Modul oder eine Dateireferenz handelt (beginnend mit /, ../, ./ oder ähnlichem), sucht Node.js nach installierten Modulen. Es wird Ihr Dateisystem durchsuchen und nach dem Modul suchen, auf das im Ordner verwiesen wird Knotenmodule. Es beginnt im Hauptverzeichnis Ihres aktuellen Moduls und wechselt dann in das Hauptverzeichnis, bis es das richtige Modul findet oder bis das Stammverzeichnis des Dateisystems erreicht ist.
Benötigen Sie unter der Haube - module.js
Das Modul, das sich mit dem Laden von Modulen in den Node-Kernel befasst, wird aufgerufen module.js, und kann in gefunden werden lib / module.js im Node.js-Repository.
Die wichtigsten hier zu überprüfenden Funktionen sind die Funktionen _loady y _kompilieren.
_Lademodul
Diese Funktion prüft, ob sich das Modul bereits im Cache befindet. In diesem Fall wird das Exportobjekt zurückgegeben.
Wenn das Modul nativ ist, rufen Sie das auf NativeModule.require () mit dem Dateinamen und gibt das Ergebnis zurück.
De lo contrario, crea un nuevo módulo para el archivo y lo guarda en el caché. Luego carga el Inhalt del archivo antes de devolver su objeto de exportación.
_Kompiliermodul
Die Build-Funktion führt den Inhalt der Datei im richtigen Bereich oder in der richtigen Sandbox aus und macht die Hilfsvariablen wie verfügbar benötigen, Modul oder Exporte in die Datei.
Wie organisiere ich den Code?
In unseren Anwendungen müssen wir beim Erstellen von Modulen das richtige Gleichgewicht zwischen Kohäsion und Kopplung finden. Das wünschenswerte Szenario besteht darin, eine hohe Kohäsion und eine lose Kopplung der Module zu erreichen.
Ein Modul darf sich nur auf einen Teil der Funktionalität konzentrieren, um eine hohe Kohäsion zu erzielen. Lose Kopplung bedeutet, dass Module keinen globalen oder gemeinsam genutzten Status haben sollten. Sie müssen nur durch Übergabe von Parametern kommuniziert werden und können leicht ausgetauscht werden, ohne Ihre breitere Codebasis zu berühren.
Normalerweise exportieren wir benannte oder konstante Funktionen wie folgt:
'use strict' const CONNECTION_LIMIT = 0 Funktion connect () {/ * ... * /} module.exports = {CONNECTION_LIMIT, connect}
Was ist in deinen node_modules?
Mappe Knotenmodule Hier sucht Node.js nach Modulen. npm v2 y npm v3 Sie installieren ihre Abhängigkeiten unterschiedlich. Sie können herausfinden, welche Version von npm Sie verwenden, indem Sie Folgendes ausführen:
npm --version
npm v2
npm v2 Installieren Sie alle Abhängigkeiten auf verschachtelte Weise, wobei sich die Hauptpaketabhängigkeiten in Ihrem Ordner befinden Knotenmodule.
npm v3
npm v3 Versuchen Sie, diese untergeordneten Abhängigkeiten zu reduzieren und im Stammordner zu installieren Knotenmodule. Dies bedeutet, dass Sie beim Betrachten nicht erkennen können Knotenmodule Welche Pakete sind seine expliziten oder impliziten Abhängigkeiten. Es ist auch möglich, dass die Installationsreihenfolge die Struktur Ihres Ordners ändert, weil npm v3 es ist auf diese Weise nicht deterministisch.
Sie können sicherstellen, dass Ihr Verzeichnis Knotenmodule Sein siempre el mismo instalando paquetes solo desde un package.json. Installieren Sie in diesem Fall Ihre Abhängigkeiten in alphabetischer Reihenfolge. Dies bedeutet auch, dass Sie denselben Ordnerbaum erhalten. Dies ist wichtig, da Module unter Verwendung Ihres Pfads als Suchschlüssel zwischengespeichert werden. Jedes Paket kann einen eigenen Unterordner haben node_modules, Dies kann zu mehreren Instanzen desselben Pakets und desselben Moduls führen.
Wie gehe ich mit deinen Modulen um?
Es gibt zwei Möglichkeiten, Module zu verdrahten. Eine davon verwendet fest codierte Abhängigkeiten, bei denen ein Modul mithilfe eines Funktionsaufrufs explizit in ein anderes geladen wird benötigen. Die andere Methode besteht darin, ein Abhängigkeitsinjektionsmuster zu verwenden, bei dem wir die Komponenten als Parameter übergeben, oder wir haben einen globalen Container (bekannt als IoC oder Inversion of Control-Container), der die Verwaltung der Module zentralisiert.
Wir können Node.js erlauben, den Lebenszyklus von Modulen zu verwalten, indem wir codierte Module laden. Organisieren Sie Ihre Pakete intuitiv, damit Sie sie leicht verstehen und debuggen können.
Die Abhängigkeitsinjektion wird in einer Node.js-Umgebung selten verwendet, obwohl dies ein nützliches Konzept ist. Das DI-Muster kann zu einer verbesserten Entkopplung der Module führen. Anstatt die Abhängigkeiten für ein Modul explizit zu definieren, werden sie von außen empfangen. Daher können sie leicht durch Module mit denselben Schnittstellen ersetzt werden.
Schauen wir uns ein Beispiel für an DI-Module unter Verwendung des Fabrikmusters:
Klasse Cart {Konstruktor (Optionen) {this.engine = options.engine} start () {this.engine.start ()}} Funktion create (Optionen) {neuen Cart (Optionen) zurückgeben} module.exports = create
Das ES2015-Modulsystem
Wie wir bereits gesehen haben, verwendet das CommonJS-Modulsystem die Laufzeitauswertung von Modulen und verpackt sie vor der Ausführung in eine Funktion. Es ist nicht erforderlich, die ES2015-Module als Links zu verpacken Import Export Sie werden vor der Auswertung des Moduls erstellt. Diese Inkompatibilität ist der Grund, warum es derzeit keine JavaScript-Laufzeit gibt, die ES-Module unterstützt. Es gab viele Diskussionen zu diesem Thema und ein Vorschlag befindet sich im Status ENTWURF. Wir hoffen daher, in zukünftigen Versionen von Node Unterstützung zu haben.