Detaillierte Erklärung, wie Node.js mit ES6-Modulen umgeht

Detaillierte Erklärung, wie Node.js mit ES6-Modulen umgeht

1. Unterschiede zwischen den beiden Modulen

Es gibt erhebliche Unterschiede zwischen ES6-Modulen und CommonJS-Modulen.

In Bezug auf die Syntax werden CommonJS-Module mit require() geladen und mit module.exports exportiert, während ES6-Module Import und Export verwenden.

In Bezug auf die Verwendung ist require() eine synchrone Ladung, und der nachfolgende Code muss warten, bis dieser Befehl ausgeführt wird, bevor er ausgeführt wird. Der Importbefehl wird asynchron geladen, oder genauer gesagt, das ES6-Modul verfügt über eine unabhängige statische Analysephase, die Abhängigkeitsanalyse wird in dieser Phase abgeschlossen und das Modul auf der niedrigsten Ebene wird zuerst ausgeführt.

2. Der Unterschied zwischen Node.js

Node.js erfordert, dass ES6-Module den Dateinamen mit der Erweiterung .mjs verwenden. Mit anderen Worten: Solange der Import- oder Exportbefehl in der Skriptdatei verwendet wird, muss das Suffix .mjs verwendet werden. Wenn Node.js auf eine MJS-Datei stößt, betrachtet es diese als ES6-Modul und aktiviert standardmäßig den strikten Modus. Sie müssen nicht am Anfang jeder Moduldatei „use strict“ angeben.

Wenn Sie das Suffix nicht in .mjs ändern möchten, können Sie das Typfeld in der Datei package.json des Projekts als Modul angeben.

{
   "Typ": "Modul"
}

Sobald sie festgelegt sind, werden die JS-Skripte in diesem Verzeichnis als ES6-Module interpretiert.

# Als ES6-Modul interpretieren

$ node meine-app.js

Wenn Sie derzeit noch CommonJS-Module verwenden möchten, müssen Sie das Suffix der CommonJS-Skripte in .cjs ändern. Wenn kein Typfeld vorhanden ist oder das Typfeld „CommonJS“ ist, wird das JS-Skript als CommonJS-Modul interpretiert.

Um es in einem Satz zusammenzufassen: .mjs-Dateien werden immer als ES6-Module geladen, .cjs-Dateien werden immer als CommonJS-Module geladen und das Laden von .js-Dateien hängt von der Einstellung des Typfelds in package.json ab.

Beachten Sie, dass ES6-Module und CommonJS-Module nicht gemischt werden sollten. Der Befehl require kann keine .mjs-Dateien laden und meldet einen Fehler. Nur der Befehl import kann .mjs-Dateien laden. Umgekehrt kann der Befehl „require“ nicht in .mjs-Dateien verwendet werden, und es muss „import“ verwendet werden.

3. CommonJS-Modul lädt ES6-Modul

Der require()-Befehl von CommonJS kann ES6-Module nicht laden und meldet einen Fehler. Sie können sie nur mit der import()-Methode laden.

(asynchron () => {
  warte auf Import('./my-app.mjs');
})();

Der obige Code kann in einem CommonJS-Modul ausgeführt werden.

Ein Grund, warum require() ES6-Module nicht unterstützt, besteht darin, dass es synchron geladen wird und der Await-Befehl der obersten Ebene innerhalb von ES6-Modulen verwendet werden kann, was ein synchrones Laden unmöglich macht.

4. ES6-Module laden CommonJS-Module

Der Importbefehl von ES6-Modulen kann CommonJS-Module laden, aber nur als Ganzes, nicht nur ein einzelnes Ausgabeelement.

// Korrekter Import von packageMain aus „commonjs-package“;

// Fehler beim Importieren { Methode } aus „commonjs-package“;

Dies liegt daran, dass ES6-Module die statische Codeanalyse unterstützen müssen und die Ausgabeschnittstelle von CommonJS-Modulen module.exports ist, ein Objekt, das nicht statisch analysiert werden kann und daher nur als Ganzes geladen werden kann.

Das Laden eines einzelnen Ausgabeelements kann wie folgt geschrieben werden.

importiere packageMain aus „commonjs-package“;
const { Methode } = PaketMain;

5. Module, die beide Formate unterstützen

Außerdem ist es einfach, sowohl das CommonJS- als auch das ES6-Format für ein Modul zu unterstützen.

Wenn das Originalmodul im ES6-Format vorliegt, muss eine allgemeine Ausgabeschnittstelle angegeben werden, z. B. „export default obj“, damit CommonJS es mit „import()“ laden kann.

Wenn das Originalmodul im CommonJS-Format vorliegt, kann eine Wrapper-Ebene hinzugefügt werden.

importiere cjsModule aus „../index.js“;
: Exportieren Sie const foo = cjsModule.foo;

Der obige Code importiert zuerst das CommonJS-Modul als Ganzes und gibt dann die benannte Schnittstelle nach Bedarf aus.

Sie können die Dateierweiterung in .mjs ändern oder sie in ein Unterverzeichnis legen und in diesem Unterverzeichnis eine separate Datei package.json ablegen und dabei { type: "module" } angeben.

Ein anderer Ansatz besteht darin, die Ladeeintrittspunkte der beiden Modulformate im Exportfeld der Datei package.json anzugeben.

"Exporte": { 
    "erfordern": "./index.js",
    "importieren": "./esm/wrapper.js" 
}

Der obige Code gibt require() und import an, und beim Laden des Moduls wird automatisch zu einer anderen Eingabedatei gewechselt.

Oben finden Sie eine ausführliche Erklärung, wie Node.js ES6-Module verarbeitet. Weitere Informationen dazu, wie Node.js ES6-Module verarbeitet, finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Verständnis und Anwendung des Destrukturierungsoperators von JavaScript ES6
  • JavaScript zur Implementierung der umfassendsten Codeanalyse eines einfachen Karussells (objektorientiert ES6)
  • JavaScript zur Implementierung der umfassendsten Codeanalyse eines einfachen Einkaufswagens (ES6 objektorientiert)
  • Detaillierte Erklärung der Unterschiede zwischen var, let und const in JavaScript es6
  • Unterschiede zwischen ES6-Vererbung und ES5-Vererbung in js
  • Detaillierte Erläuterung der JS ES6-Codierungsstandards
  • JS beherrscht schnell die Verwendung von ES6-Klassen
  • Detaillierte Erläuterung der Destrukturierungszuweisung von JS ES6-Variablen
  • Mehrere magische Verwendungen des JS ES6 Spread-Operators
  • Über Front-End JavaScript ES6 Details

<<:  Analyse des Konfigurationsprozesses der Nginx-HTTP-Integritätsprüfung

>>:  Lösen Sie das Problem der blockierenden Positionierungs-DDL in MySQL 5.7

Artikel empfehlen

Zusammenfassung der benutzerdefinierten JavaScript-Objektmethoden

Inhaltsverzeichnis 1. Verwenden Sie Objekt, um ei...

Lösung für mobile Browser, die die Position nicht unterstützen: Fix

Die konkrete Methode ist wie folgt: CSS Code Code...

MySQL Server IO 100 % Analyse- und Optimierungslösung

Vorwort Während des Stresstests besteht das unmit...

Verwendung des Vuex-Namespace

Inhaltsverzeichnis Da Vuex einen einzelnen Zustan...

So verstehen Sie die Modularität von JavaScript

Inhaltsverzeichnis 1. Browserunterstützung 2. Exp...

Erstellen eines statischen Jenkins Docker-Agentknotens

Ein statischer Knoten ist auf einer Maschine fixi...

Tutorial zu den Grundlagen von JavaScript und JQuery Framework

Inhaltsverzeichnis 1. JS-Objekt DOM –1, Funktion ...

Drei Schritte zur Lösung des IE-Adressleistensymbol-Anzeigeproblems

<br />Dieses Tutorial zur Erstellung von Web...

Implementierung der Nginx-Flusskontrolle und Zugriffskontrolle

Nginx-Verkehrskontrolle Die Ratenbegrenzung ist e...

Wird der Index in der MySQL-Abfragebedingung verwendet?

Wenn Sie ein Arbeitgeber fragt, ob in einer MySQL...