ES2015 “імпорт” не працює у вузлі v6.0.0 з опцією --harmony_modules


80

Я використовую node v6.0.0 і хотів використовувати ES2016 (ES6). Однак я зрозумів, що синтаксис "імпорту" не працює. Чи не є імпорт принциповим для написання модульного коду в ES2015? Я також спробував запустити вузол з --harmony_modulesопцією, але все одно отримав ту ж помилку щодо "імпорту". Ось код.

Робочий код без "імпорту":

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

Неробочий код із "імпортом":

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;
  }
}

Я також перевірив http://node.green/, щоб побачити підтримуваний es6, проте не зміг зрозуміти, чому він не працює з опцією --harmony_modules. Будь ласка, допоможіть.


використовуйте Webpack разом Babel loader
Нарамсім

2
Вам не потрібно мати babel або webpack у v6
chovy



Дивіться також цю публікацію в блозі від вересня 2016 року, що пояснює проблеми, пов’язані із впровадженням ES6 importу node. Здається, нам ще далеко до того, як модулі ES6 надійдуть у вузол.
jakub.g

Відповіді:


87

Вони просто ще не реалізовані.

У вузлі 6.0.0 використовується версія V8 із завершеною більшістю функцій ES6. На жаль, модулі не є однією з тих завершених функцій.

node --v8-options | grep harmony 

в процесі виконання прапори гармонії виконуються не повністю і зазвичай не працюють:

--es_staging (увімкнути тестові функції гармонії (лише для внутрішнього використання ))
--harmony (увімкнути всі завершені функції гармонії)
--harmony_shipping (увімкнути всі відправлені функції гармонії)
--harmony_object_observe (увімкнути "гармонію Object.observe" ( у хід ))
--harmony_modules (увімкнути "модулі гармонії" ( виконується ))
--harmony_function_sent (увімкнути "гармонію function.sent" ( виконується ))
--harmony_sharedarraybuffer (увімкнути "гармонія sharedarraybuffer" ( виконується ))
--harmony_simd (увімкнути "гармонію simd" ( виконується ))
--harmony_do_expressions (увімкнути "гармонія до-виразів "( виконується ))
--harmony_iterator_close (увімкнути "фіналізація ітератора гармонії" ( виконується ))
--harmony_tailcalls (увімкнути "виклики хвоста гармонії" ( виконується ))
--harmony_object_values_entries ( увімкнути "гармонію Object.values ​​/ Object.entries" ( виконується ))
--harmony_object_own_property_descriptors (увімкнути "гармонію Object.getOwnPropertyDescriptors ()" ( виконується ))
--harmony_regexp_property (увімкнути "гармонію класів властивостей regexp" ( виконується ) )
--harmony_function_name (увімкнути "гармонія Функція висновок назви ")
--harmony_regexp_lookbehind (увімкнути "гармонійний регулярний вигляд")
--harmony_species (увімкнути "гармонію Symbol.species")
--harmony_instanceof (увімкнути "гармонію екземпляра підтримки")
--harmony_default_parameters (увімкнути "параметри гармонії за замовчуванням")
--harmony_destructuring_ assignment (увімкнути "присвоєння деструктуризації гармонії")
--harmony_destructuring_bind (увімкнути "зв'язок деструктуризації гармонії")
--harmony_tostring (увімкнути "гармонію toString")
--harmony_regexps (увімкнути "розширення регулярних виразів гармонії")
--harmony_unicode_regexps (увімкнути "гармонійні регулярні вирази unicode")
--harmony_sloppy (увімкнути "функції гармонії в недбалому режимі")
--harmony_sloppy_let (увімкнути "гармонію в недбалому режимі")
--harmony_sloppy_function (увімкнути "масштабування недбалого функціонального блоку") --harmony_reflect (увімкнути "harmoni Reflect API") --harmony_regexp_subclass (увімкнути "підкласифікацію регулярного виразу гармонії")
гармонійний недбалий функціональний блок ") --harmony_proxies (увімкнути" гармонійні проксі-сервери ")


13
Дякую. Я це бачив, але не вірив собі, оскільки "імпорт" є одним із важливих синтаксисів es6
радість

1
@joy Так, сподіваємось, це скоро з’явиться.
Пол

4
@KingWu Я щойно знайшов його, запустивши node --v8-options | grep harmonyпісля оновлення до node 6.0.0.
Пол

1
Я був дуже радий почути, що вузол 6 вийшов, і тепер вони не реалізували одну з найважливіших функцій ... :(
Кокодоко

1
@SuperUberDuper Use Node 7
Алі Гаджані

40

Це має бути коментар до відповіді @ Paulpro, але у мене недостатньо представників, щоб залишити коментар.

Для користувачів Windows еквівалентна команда:

node --v8-options | findstr harmony

32

Поки модулі не реалізовані, ви можете використовувати Babel "transpiler" для запуску коду:

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

Див. Https://www.npmjs.com/package/babel-preset-node6 та https://babeljs.io/docs/usage/cli/

Недоліки : у цього є різні мінуси, такі як додатковий час компіляції, який може бути значним, і тепер вам потрібні вихідні карти для налагодження; просто кажу.


16

Як зазначено вище, модулі ES6 ще не реалізовані.

Здається, нетривіальною проблемою є реалізація модулів ES6 таким чином, щоб вона була сумісною із модулями Common JS, що є поточним синтаксисом модуля Node.js.

Однак існує проект реалізації, який вводить нове розширення файлу .mjs- для файлів, що містять модулі ES6.

Крім того, існує зустрічна пропозиція, яка представляє альтернативний підхід до оголошення всіх файлів із модулями ES6 у пакеті.json так:

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

1
Я думаю, що це важливий момент. "Потужності, які можуть бути", досі сперечаються щодо специфікації, і тоді вона повинна з'явитися у версії 8, перш ніж вона зможе дістатися до Node.
Пол Еверітт

1
Тільки примітка: найновіший проект не вимагає .mjsрозширення, що набагато краще для сумісності.
Matthew Dean

Питання: де я можу знайти ці модулі es6 для завантаження?
Marc Brillault

Цей допис у блозі може бути гарним місцем для початку.
Роман Парадеев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.