Ab Version 8.5.0 unterstützt Node.js native ES-Module, die über Befehlszeilenoptionen aktiviert werden können. Die neuen Features sind größtenteils Bradley Farias zu verdanken. Dieser Artikel stellt Ihnen hauptsächlich die Verwendung der nativen ES-Modulmethode in Node.js vor und enthält Links zu einigen Inhalten. Freunde, die sie benötigen, können darauf verweisen .
1. Demonstration
Die Codeverzeichnisstruktur dieses Beispiels ist wie folgt:
esm-demo/ lib.mjs main.mjs
lib.mjs:
export function add(x, y) { return x + y; }
main.mjs:
import {add} from './lib.mjs'; console.log('Result: '+add(2, 3));
Führen Sie die Demo aus :
$ node --experimental-modules main.mjs Result: 5
2. Checkliste: Dinge zu beachten
ES-Modul:
·Module können nicht dynamisch importiert werden. Die Arbeit an dynamischem import() ist jedoch im Gange und Unterstützung sollte bald verfügbar sein.
·Es gibt keine Metavariablen wie __dirname und __filename. Es gibt jedoch einen Vorschlag für eine ähnliche Funktion: „import.meta“. Es könnte so aussehen:
console.log(import.meta.url);
·Jetzt sind alle Modulbezeichner URLs (dieser Teil ist neu in Node.js):
· Datei – relativer Pfad mit Dateierweiterung: ../util/tools.mjs
· Bibliothek – keine Datei Erweiterung und kein Pfad lodash
· Es bleibt abzuwarten, wie npm-Bibliotheken besser auch in Browsern verfügbar gemacht werden können (ohne Bundler zu verwenden). Eine Möglichkeit besteht darin, Konfigurationsdaten im RequireJS-Stil einzuführen, die Pfade tatsächlichen Pfaden zuordnen. Derzeit ist es illegal, Bare-Path-Modul-IDs in Browsern zu verwenden.
Interoperabilität mit CJS-Modulen
Sie können CJS-Module importieren, diese haben jedoch immer nur den Standardexport – also den module.exports-Wert. Es wird bereits daran gearbeitet, dafür zu sorgen, dass CJS-Module benannte Exporte unterstützen, aber es kann eine Weile dauern. Wenn Sie helfen können, können Sie es tun.
import fs1 from 'fs'; console.log(Object.keys(fs1).length); // 86 import * as fs2 from 'fs'; console.log(Object.keys(fs2)); // ['default']
· Sie können require() nicht in ES-Modulen verwenden. Die Hauptgründe sind:
· Die Pfadauflösung funktioniert etwas anders: ESM unterstützt NODE_PATH und require.extensions nicht. Auch die Tatsache, dass es sich bei der Kennung immer um eine URL handelt, führt zu geringfügigen Unterschieden.
· ES-Module werden immer asynchron geladen, was eine maximale Kompatibilität mit dem Web gewährleistet. Dieser Ladestil kann nicht mit dem synchronen Laden von CJS-Modulen über require() gemischt werden.
· Durch die Deaktivierung des synchronen Ladens von Modulen würde auch ein Fallback-Pfad für Warteimporte von ES-Modulen auf oberster Ebene erhalten bleiben (eine Funktion, die derzeit in Betracht gezogen wird).
3. ES-Module auf früheren Versionen von Node.js
Wenn Sie es auf Node.js-Versionen vor 8.5.0 verwenden möchten ES-Module finden Sie unter @std/esm von John-David Dalton.
Tipp: Wenn Sie keine freischaltbaren Zusatzfunktionen aktivieren, bleiben Sie 100 % kompatibel mit nativen ES-Modulen in Node.js.
FAQ
Wann kann ich ES-Module ohne Befehlszeilenoptionen verwenden?
Der aktuelle Plan sieht vor, ES-Module standardmäßig in Node.js 10 LTS verfügbar zu machen.
Weiterführende Literatur
Weitere Informationen zu Node.js und ES-Modulen im Browser:
· „Transpilierte ES-Module spezifikationsgerechter gestalten“ [ES-Module nativ verwenden vs. über Babel transpilieren]
· „Modulspezifizierer: Was ist neu bei ES-Modulen? ?“ [Warum .mjs? Wie werden Modulspezifizierer aufgelöst?]
🎜>
Kommender ECMAScript-Vorschlag:
Blog: „ES-Vorschlag: import() – ES-Module dynamisch importieren“
Vorschlag: „import.meta“Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonSo verwenden Sie native ES-Module in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!