web-dev-qa-db-fra.com

ES2015 "importation" ne fonctionne pas dans le noeud v6.0.0 avec l'option --harmony_modules

J'utilise le noeud v6.0.0 et je voulais utiliser ES2016 (ES6). Cependant, j'ai réalisé que la syntaxe "import" ne fonctionnait pas. L'importation n'est-elle pas fondamentale pour l'écriture de code modulaire dans ES2015? J'ai essayé d'exécuter le noeud avec l'option --harmony_modules, mais j'ai toujours la même erreur à propos de "l'importation". Voici le code.

Code de travail sans "importation":

'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);

Code Notworking avec "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);

Nombre.js

'use strict';
export default class Number {

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

J'ai également vérifié http://node.green/ pour voir le es6 pris en charge, mais je ne suis pas en mesure de comprendre pourquoi cela ne fonctionne pas avec l'option --harmony_modules. S'il vous plaît aider.

80
joy

Ils ne sont tout simplement pas encore implémentés.

Le noeud 6.0.0 utilise une version de V8 avec la plupart des fonctionnalités d'ES6 complétées. Malheureusement, les modules ne font pas partie de ces fonctionnalités terminées.

node --v8-options | grep harmony 

en cours Les drapeaux d'harmonie ne sont pas complètement implémentés et ne fonctionnent généralement pas:

--es_staging (active les fonctions d'harmonie dignes d'un test (pour usage interne uniquement))
- Harmony (active toutes les fonctionnalités harmoniques terminées)
- harmony_shipping (active toutes les fonctionnalités harmoniques livrées)
- harmony_object_observe (activez "harmony Object.observe" (en cours))
- harmony_modules (activez les "modules d'harmonie" (en cours))
- harmony_function_sent (activez "harmony function.sent" (en cours))
- harmony_sharedarraybuffer (activez "Harmony sharedarraybuffer" (en cours))
- harmony_simd (activez "harmony simd" (en cours))
- harmony_do_expressions (active "expressions de harmonie" (en cours))
- harmony_iterator_close (active la "finalisation d'itérateur d'harmonie" (en cours))
- harmony_tailcalls (active les "appels de fin harmonie" (en cours))
- harmony_object_values_entries (activez "harmony Object.values ​​/ Object.entries" (en cours))
- harmony_object_own_property_descriptors (activez "harmony Object.getOwnPropertyDescriptors ()" (en cours))
- harmony_regexp_property (active les "classes de propriété d'harmonie unicode regexp" (en cours))
- nom_fonction_harmonie (activer "inférence de nom de fonction harmonie")
- harmony_regexp_lookbehind (cochez la case "harmony regexp lookbehind")
- harmony_species (activez "harmony Symbol.species")
- harmony_instanceof (activez "harmony instanceof support")
- harmony_default_parameters (activez les "paramètres par défaut d'harmonie")
- harmony_destructuring_assignment (activez "l'affectation de déstructuration d'harmonie")
- harmony_destructuring_bind (active "lier la déstructuration de l'harmonie")
- harmony_tostring (activez "harmony toString")
- harmony_regexps (active les "extensions d'expression régulière d'harmonie")
- harmony_unicode_regexps (active "les expressions rationnelles harmoniques unicode")
- harmony_sloppy (active les "fonctionnalités d'harmonie en mode manuel")
- harmony_sloppy_let (active "l 'harmonie laissée en mode bâclée")
- harmony_sloppy_function (cochez "Portée du bloc fonction d'harmonie sloppy")
- harmony_proxies (active les "mandataires d'harmonie")
- harmony_reflect (activez "harmony Reflect API")
- harmony_regexp_subclass (cochez la case "harmony regexp subclassing")

87
Paulpro

Cela devrait être un commentaire sur la réponse de @Paulpro mais je n'ai pas assez de représentant pour poster un commentaire.

Pour Les fenêtres utilisateurs la commande équivalente est:

node --v8-options | findstr harmony
40
CodeVortex

Jusqu'à ce que les modules soient implémentés, vous pouvez utiliser le "transpiler" de Babel pour exécuter votre code:

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

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

Inconvénients : il comporte divers inconvénients, tels qu'un temps de compilation supplémentaire, qui peut être important et que vous avez maintenant besoin de mappes de sources pour le débogage; je dis juste.

32
wires

Comme indiqué ci-dessus, les modules ES6 ne sont pas encore implémentés.

La mise en œuvre de modules ES6 d’une manière compatible avec les modules Common JS, qui correspond à la syntaxe actuelle du module Node.js, semble être une question non triviale.

Cependant, il existe un brouillon d'une implémentation, qui introduit une nouvelle extension de fichier - .mjs - pour un fichier contenant des modules ES6.

En outre, il existe une contre-proposition qui présente une approche alternative consistant à déclarer tous les fichiers avec des modules ES6 dans package.json comme suit:

{
    "modules.root": "/path/to/es6/modules"
}