ES2015 "Import" funktioniert in Knoten v6.0.0 mit der Option --harmony_modules nicht

80

Ich verwende den Knoten v6.0.0 und wollte ES2016 (ES6) verwenden. Ich habe jedoch festgestellt, dass die "Import" -Syntax nicht funktioniert. Ist "Importieren" nicht grundlegend für das Schreiben von modularem Code in ES2015? Ich habe versucht, Node auch mit --harmony_modulesOption auszuführen, habe aber immer noch den gleichen Fehler bezüglich "Import" erhalten. Hier ist der Code.

Arbeitscode ohne "Import":

'use strict';
let sum = 0;
class Number {

  addNumber(num1, num2) {
    return num1 + num2;
  }
}
let numberObj = new Number();
sum = numberObj.addNumber(1,2);
console.log("sum of two number 1 and 2 "+ sum);

Nicht funktionierender Code mit "Import":

server.js

'use strict';
import Number from "./Number";

let sum = 0;


let numberObj = new Number();

sum = numberObj.addNumber(1,2);
console.log("sum of two number 1 and 2 "+ sum);

Number.js

'use strict';
export default class Number {

  addNumber(num1, num2) {
    return num1 + num2;
  }
}

Ich habe auch http://node.green/ überprüft , um das unterstützte es6 zu sehen, konnte jedoch nicht verstehen, warum es mit der Option --harmony_modules nicht funktioniert. Bitte helfen Sie.

Freude
quelle
benutze Webpack zusammen Babel Loader
Naramsim
2
Sie sollten kein Babel oder Webpack in
Version
Siehe auch diesen Blog-Beitrag vom September 2016, in dem die Herausforderungen bei der Implementierung von ES6 importin Node erläutert werden. Es scheint, dass wir noch einen langen Weg vor dem Versand der ES6-Module im Knoten sind.
Jakub.g

Antworten:

87

Sie sind einfach noch nicht implementiert.

Knoten 6.0.0 verwendet eine Version von V8, wobei die meisten ES6-Funktionen abgeschlossen sind. Leider gehören Module nicht zu diesen abgeschlossenen Funktionen.

node --v8-options | grep harmony 

In Bearbeitung Harmony Flags sind nicht vollständig implementiert und funktionieren normalerweise nicht:

--es_staging (testwürdige Harmoniefunktionen aktivieren ( nur für den internen Gebrauch ))
--harmony (alle abgeschlossenen Harmoniefunktionen
aktivieren ) --harmony_shipping (alle ausgelieferten Harmoniefunktionen
aktivieren ) --harmony_object_observe (aktiviere "harmony Object.observe" ( in progress ))
--harmony_modules (aktiviere "harmony modules" ( in Bearbeitung ))
--harmony_function_sent (aktiviere "harmony function.sent" ( in Bearbeitung ))
--harmony_sharedarraybuffer (aktiviere "harmony sharedarraybuffer" ( in Bearbeitung ))
--harmony_simd (aktiviere "harmony simd" ( in Bearbeitung ))
--harmony_do_expressions (aktiviere "Harmony Do-Ausdrücke" ( in Bearbeitung ))
--harmony_iterator_close (aktiviere "Harmony Iterator Finalization" ( in Bearbeitung ))
--harmony_tailcalls (aktiviere "Harmony Tail Calls" ( in Bearbeitung ))
--harmony_object_values_entries ( in Bearbeitung ) aktiviere "harmony Object.values ​​/ Object.entries" ( in Bearbeitung ))
--harmony_object_own_property_descriptors (aktiviere "harmony Object.getOwnPropertyDescriptors ()" ( in Bearbeitung ))
--harmony_regexp_property (aktiviere "harmony unicode regexp property classes" ( in Bearbeitung ) )
--harmony_function_name (enable "Harmonie Funktionsname Inferenz ")
--harmony_regexp_lookbehind (aktiviere "harmony regexp lookbehind")
--harmony_species (aktiviere "harmony Symbol.species")
--harmony_instanceof (aktiviere "harmony instanceof support")
--harmony_default_parameters (aktiviere "harmony default parameters")
--harmony_destructuring_assignment "Harmony Destructuring Assignment")
--harmony_destructuring_bind (aktivieren Sie "Harmony Destructuring Bind")
--harmony_tostring (aktivieren Sie "Harmony toString")
--harmony_regexps (aktivieren Sie "Harmony Regular Expression Extensions")
--harmony_unicode_regexps (aktivieren Sie "Harmony Unicode Regexps"
--harmony_sloppy (aktiviere "Harmony-Funktionen im Sloppy-Modus")
--harmony_sloppy_let (aktiviere "Harmonie im schlampigen Modus")
--harmony_sloppy_function (aktiviere "Harmony Sloppy Function Block Scoping")
--harmony_proxies (aktiviere "Harmony Proxies")
--harmony_reflect (aktiviere "Harmony Reflect API")
--harmony_regexp_subclass (aktiviere "Harmony Regexp Subclassing")

Paul
quelle
13
Vielen Dank. Ich habe es gesehen, aber ich habe nicht geglaubt, dass "Import" eine der wichtigsten Syntax von es6 ist
joy
1
@joy Ja, hoffentlich ist es bald verfügbar.
Paul
4
@KingWu Ich habe es gerade gefunden, indem ich es node --v8-options | grep harmonynach dem Update auf ausgeführt habe node 6.0.0.
Paul
1
Ich war so froh zu hören, dass Knoten 6 aus war, und jetzt haben sie keine der wichtigsten Funktionen implementiert ... :(
Kokodoko
1
@ SuperUberDuper Verwenden Sie Knoten 7
Ali Gajani
40

Dies sollte ein Kommentar zu @ Paulpros Antwort sein, aber ich habe nicht genug Vertreter, um einen Kommentar zu schreiben.

Für Windows- Benutzer lautet der entsprechende Befehl:

node --v8-options | findstr harmony
CodeVortex
quelle
32

Bis zur Implementierung von Modulen können Sie den Babel "Transpiler" verwenden , um Ihren Code auszuführen:

npm install --save babel-cli babel-preset-node6
./node_modules/.bin/babel-node --presets node6 ./your_script.js

Siehe https://www.npmjs.com/package/babel-preset-node6 und https://babeljs.io/docs/usage/cli/

Nachteile : Dies hat verschiedene Nachteile, wie z. B. zusätzliche Kompilierungszeit, die erheblich sein können, und Sie benötigen jetzt Quellzuordnungen zum Debuggen. nur sagen.

Leitungen
quelle
16

Wie oben erwähnt, sind ES6-Module noch nicht implementiert.

Es scheint kein triviales Problem zu sein, ES6-Module so zu implementieren, dass sie mit Common JS-Modulen abwärtskompatibel sind. Dies ist die aktuelle Node.js-Modulsyntax.

Es gibt jedoch einen Entwurf einer Implementierung, die eine neue Dateierweiterung - .mjs- für Dateien mit ES6-Modulen einführt .

Es gibt auch einen Gegenvorschlag , der einen alternativen Ansatz zum Deklarieren aller Dateien mit ES6-Modulen in package.json wie folgt darstellt:

{
    "modules.root": "/path/to/es6/modules"
}
Роман Парадеев
quelle
1
Ich denke, das ist ein wichtiger Punkt. "The Powers That Be" streiten sich immer noch über die Spezifikation, und dann muss sie in Version 8 erscheinen, bevor sie zu Node gelangen kann.
Paul Everitt
1
Nur eine Anmerkung: Der neueste Entwurf benötigt keine .mjsErweiterung, was aus Kompatibilitätsgründen viel besser ist.
Matthew Dean
Die Frage ist: Wo finde ich diese es6-Module zum Herunterladen?
Marc Brillault
Dieser Blog-Beitrag ist möglicherweise ein guter Anfang.
16оман Парадеев