Ich habe das ganze Internet ohne eine klare Antwort darauf durchsucht.
Derzeit verwendet NodeJS nur CommonJS-Syntax zum Laden von Modulen. Wenn Sie die Standard-ES2015-Modulsyntax wirklich verwenden möchten, müssen Sie sie entweder vorher transpilieren oder zur Laufzeit einen externen Modullader verwenden.
Derzeit bin ich mir nicht sicher, ob ich eine dieser beiden Methoden verwenden kann. Planen die NodeJS-Betreuer überhaupt, ES2015-Module zu unterstützen, oder nicht? Ich habe überhaupt keinen Hinweis darauf gefunden.
Derzeit wird behauptet, dass NodeJS 6.x 96% der ES2015-Funktionen unterstützt, es gibt jedoch keinen Hinweis auf Module ( NodeJS ES2105-Support-Link ).
Wissen Sie, ob NodeJS diese Module in naher Zukunft sofort unterstützt?
tl; dr
Latest NodeJS listet ES-Module immer noch als experimentell hinter einem Flag auf.
Wer nach einer Lösung für das Problem sucht, sollte den esm -Modullader ausprobieren, der eine produktionsbereite Implementierung der ES Modules Spec for NodeJS ist:
node -r esm main.js
Detaillierte Updates ...
23. April 2019
Ein PR ist kürzlich gelandet, um die Art und Weise der Erkennung von ES-Modulen zu ändern: https://github.com/nodejs/node/pull/26745
Es ist immer noch hinter dem Flag --experimental-modules
, aber es gibt wesentliche Änderungen in der Art und Weise, wie Module geladen werden können:
package.type
, der entweder module
oder commonjs
sein kann type: "commonjs"
:.js
wird als commonjs analysierttype: "module":
.js
wird als esm analysiert--type=[mode]
, damit Sie den Typ am Einstiegspunkt festlegen können. Überschreibt package.type
als Einstiegspunkt..cjs
. module
-Modus.--es-module-specifier-resolution=[type]
explicit
(Standard) und node
--es-module-specifier-resolution=node
verwenden, um den CommonJS-Algorithmus für die Spezifiziererauflösung zu aktivieren--experimental-json-loader
"type": "module"
import 'thing.json'
den experimentellen Loader unabhängig vom Moduspackage.main
können Sie einen Einstiegspunkt für ein Modul festlegen 17. Januar 2019
Node 11.6. listet ES-Module weiterhin als experimentell hinter einem Flag auf.
13. September 2017
NodeJS 8.5. wurde mit Unterstützung für MJS-Dateien hinter einem Flag veröffentlicht:
node --experimental-modules index.mjs
Der Plan hierfür ist, das Flag für die LTS-Version 10.0 zu entfernen.
- Veraltete Informationen. Hier aus historischen Gründen aufbewahrt -
8. September 2017
Der NodeJS-Master-Zweig wurde mit der anfänglichen Unterstützung für ESM-Module aktualisiert:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Dies sollte spätestens abends verfügbar sein (dies kann über nvm installiert sein, um neben Ihrer vorhandenen Installation ausgeführt zu werden):
https://nodejs.org/download/nightly/
Und hinter dem Flag --experimental-modules
aktiviert:
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
Dann renne:
node --experimental-modules .
Februar 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Die NodeJS-Leute haben entschieden, dass die am wenigsten schlechte Lösung darin besteht, die Dateierweiterung .mjs
zu verwenden. Das Mitnehmen daraus ist:
Mit anderen Worten, wenn zwei Dateien
foo.js
undbar.mjs
verwendet werden, behandelt die Verwendung vonimport * from 'foo'
foo.js
als CommonJS, währendimport * from 'bar'
bar.mjs
als ES6-Modul behandelt
Und was die Zeitlinien angeht ...
Zum gegenwärtigen Zeitpunkt gibt es noch eine Reihe von Spezifikations- und Implementierungsproblemen, die auf der Seite von ES6 und Virtual Machine auftreten müssen, bevor Node.js überhaupt mit der Entwicklung einer unterstützbaren Implementierung von ES6-Modulen beginnen kann. Die Arbeiten sind im Gange, aber es wird einige Zeit dauern. Wir sehen derzeit mindestens ein Jahr .
Oktober 2016:
Einer der Entwickler von Node.JS hat kürzlich an einem TC-39-Meeting teilgenommen und einen hervorragenden Artikel über die Blocker für die Implementierung von Node.JS verfasst:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Das grundlegende Mitnehmen davon ist:
*.mjs
scheint die wahrscheinlichste Lösung zu sein, es sei denn, sie können ein ES-Modul ohne Benutzereingabe genau erkennen- Ursprüngliche Antwort -
Dies ist seit geraumer Zeit eine heiße Kartoffel. Fazit: Ja, Node unterstützt möglicherweise die ES2015-Syntax zum Importieren/Exportieren von Modulen - höchstwahrscheinlich, wenn Spezifikation zum Laden von Modulen finalisiert und vereinbart wurde.
Hier ist eine gute Übersicht was NodeJS auf Trab hält. Im Wesentlichen müssen sie sicherstellen, dass die neue Spezifikation für Node funktioniert, bei dem es sich in erster Linie um bedingtes, synchrones Laden und in erster Linie um asynchrones HTML handelt.
Momentan weiß es niemand genau, aber ich kann mir vorstellen, dass Node zusätzlich zum neuen import/export
für das dynamische Laden System.import
für den Legacy-Code require
unterstützt.
Hier sind einige Vorschläge, wie Node dies erreichen könnte: