it-swarm.com.de

NodeJS plant den Import / Export von es6 (es2015) Modulen

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?

262
Zorgatone

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 analysiert
    • standard für Einstiegspunkt ohne Erweiterung ist commonjs
    • type: "module":
    • .js wird als esm analysiert
    • unterstützt standardmäßig nicht das Laden von JSON oder Native Module
    • die Standardeinstellung für Einstiegspunkte ohne Erweiterung ist esm
  • --type=[mode], damit Sie den Typ am Einstiegspunkt festlegen können. Überschreibt package.type als Einstiegspunkt.
  • Eine neue Dateierweiterung .cjs.
    • dies dient speziell der Unterstützung des Imports von CommonJS im module -Modus.
    • dies ist nur im ESM-Loader möglich. Der CommonJS-Loader bleibt unberührt. Die Erweiterung funktioniert jedoch im alten Loader, wenn Sie den vollständigen Dateipfad verwenden.
  • --es-module-specifier-resolution=[type]
    • optionen sind explicit (Standard) und node
    • standardmäßig lässt unser Loader keine optionalen Erweiterungen im Import zu, der Pfad für ein Modul muss die Erweiterung enthalten, falls es eine gibt
    • standardmäßig kann unser Loader keine Verzeichnisse mit einer Indexdatei importieren
    • entwickler können --es-module-specifier-resolution=node verwenden, um den CommonJS-Algorithmus für die Spezifiziererauflösung zu aktivieren
    • Dies ist kein "Feature", sondern eine Implementierung zum Experimentieren. Es wird erwartet, dass es sich ändert, bevor das Flag entfernt wird
  • --experimental-json-loader
    • die einzige möglichkeit json zu importieren wenn "type": "module"
    • wenn alle aktiviert sind, durchläuft import 'thing.json' den experimentellen Loader unabhängig vom Modus
    • basierend auf whatwg/html # 4315
  • Mit package.main können Sie einen Einstiegspunkt für ein Modul festlegen
    • die in main verwendeten Dateierweiterungen werden je nach Modultyp aufgelöst

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 und bar.mjs verwendet werden, behandelt die Verwendung von import * from 'foo'foo.js als CommonJS, während import * 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:

  • ES-Module werden statisch analysiert, CommonJS ausgewertet
  • CommonJS-Module ermöglichen den Export von Affen-Patches, ES-Module derzeit nicht
  • Ohne Benutzereingaben ist es schwierig zu erkennen, was ein ES-Modul und was CommonJS ist, aber sie versuchen es.
  • *.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:

288
CodingIntrigue