In diesem Kapitel des Webs schooljavascript.com Sie erfahren, wie das Modulsystem Node.js und CommonJS funktioniert und was die Funktion tut benötigen.

CommonJS zur Rettung

El lenguaje JavaScriptJavaScript es un lenguaje de programación que funciona en el lado del cliente y con el que las webs pueden ser más funcionales. Incorporación en código HTML El código JavaScript puede ser incrustado en las páginas HTML, para que adquieran funcionalidad. Existen varias opciones. Puede estar entre las etiquetas <SCRIPT> y </SCRIPT>, puede estar contenido en un archivo externo, puede ser un parámetro de las etiquetas HTML, y puede estar Plus 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. Außerdem wird sichergestellt, dass sich Ihre Variablen im Bereich Ihres Moduls und nicht im globalen Objekt befinden.

Wie erfordert Arbeit?

El mecanismo de carga del módulo en Node.js almacena en ZwischenspeicherUn caché es un tipo de memoria auxiliar de la que se puede recuperar a alta velocidad con una capacidad de almacenamiento relativamente pequeña. Se encuentra entre la unidad central de procesamiento (CPU) y la memoria principal. Ayuda a evitar el acceso al disco duro o los recálculos complejos almacenando temporalmente ciertos datos y haciéndolos disponibles rápidamente cuando sea necesario. El caché almacena una copia de la petición actual y Plus 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 _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 InhaltEl contenido puede ser muy difícil de definir con precisión. Es una definición que se refiere a las declaraciones contenidas en un documento o publicación de cualquier tipo y puede incluir las tecnologías de la información y la comunicación. Esto cubre todos los tipos de medios como imágenes y texto. A parte de esto, en el campo de la optimización de motores de búsqueda, los términos duplicar contenido, contenido único, Plus 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 Seien Sie immer gleich, indem Sie Pakete nur von a installieren 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.