NodeJS планирует поддерживать модули импорта/экспорта es6 (es2015)

Я смотрел по всему Интернету без четкого ответа на этот вопрос.

В настоящее время NodeJS использует только синтаксис CommonJS для загрузки модулей, и если вы действительно хотите использовать стандартный синтаксис модулей ES2015, вам либо необходимо заранее передать его, либо использовать внешний загрузчик модулей во время выполнения.

В настоящее время я не слишком положителен, чтобы использовать любой из этих двух методов, поддерживающие NodeJS даже планируют поддерживать модули ES2015 или нет? Я не нашел в этом никаких намеков.

В настоящий момент NodeJS 6.x утверждает, что поддерживает 96% функций ES2015, но нет ссылок на модули (ссылка поддержки NodeJS ES2105).

Знаете ли вы, что NodeJS будет поддерживать эти модули из коробки, в ближайшем будущем?

Ответ 1

Обновление 17 января 2019

Узел 11.6.0 по- прежнему перечисляет модули ES как экспериментальные, за флагом.

Те, кто ищет решение проблемы может понадобиться попробовать ESM модуль загрузчик, который является производством готовой реализацией ES Модули Spec для NodeJS:

node -r esm main.js

Обновление 13 сентября 2017

NodeJS 8.5.0 был выпущен с поддержкой файлов mjs за флагом:

node --experimental-modules index.mjs

План для этого состоит в том, чтобы удалить флаг для выпуска LTS v10.0.

Обновление 8 сентября 2017

Главная ветка NodeJS была обновлена с начальной поддержкой модулей ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5

Это должно быть доступно в последнюю ночь (это может быть установлено через nvm для запуска вместе с вашей существующей установкой):
https://nodejs.org/download/nightly/

И включен за --experimental-modules:

package.json

{
  "name": "testing-mjs",
  "version": "1.0.0",
  "description": "",
  "main": "index.mjs" <-- Set this to be an mjs file
}

Затем запустите:

node --experimental-modules .

--Outdated Информация. Хранится здесь для исторического purposes--

Обновление февраль 2017:

https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37

Ребята из NodeJS решили, что наименее плохим решением является использование .mjs файла .mjs. Вывод из этого:

Другими словами, учитывая два файла foo.js и bar.mjs, использование import * from 'foo' будет рассматривать foo.js как CommonJS, а import * from 'bar' будет обрабатывать bar.mjs как модуль ES6.

А что касается сроков...

В настоящий момент все еще существует ряд проблем со спецификацией и реализацией, которые должны возникнуть на стороне ES6 и виртуальной машины, прежде чем Node.js сможет даже начать разработку поддерживаемой реализации модулей ES6. Работа продолжается, но это займет некоторое время - в настоящее время мы рассматриваем как минимум год.

Обновление октябрь 2016:

Один из разработчиков на Node.JS недавно присутствовал на собрании TC-39 и написал превосходную статью о блокировщиках для реализации для Node.JS:

https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

Основной вывод из этого:

  • Модули ES подвергаются статическому анализу, оцениваются CommonJS
  • Модули CommonJS позволяют экспортировать исправления обезьян, в настоящее время модули ES не поддерживают
  • Трудно определить, что такое ES-модуль и что такое CommonJS без какой-либо формы пользовательского ввода, но они пытаются.
  • *.mjs кажется наиболее вероятным решением, если они не могут точно определить модуль ES без ввода данных пользователем

- Оригинальный ответ -

Это была горячая картошка в течение достаточно долгого времени. Суть в том, что да, Node в конечном итоге будет поддерживать синтаксис ES2015 для импорта/экспорта модулей - скорее всего, когда спецификация для загрузки модулей будет завершена и согласована.

Вот хороший обзор того, что держит NodeJS. По сути, они должны убедиться, что новая спецификация работает для Node, который в первую очередь является условной, синхронной загрузкой, а также HTML, который в основном является асинхронным.

Никто не знает наверняка прямо сейчас, но я предполагаю, что Node будет поддерживать import/export для статической загрузки, в дополнение к новому System.import для динамической загрузки - при этом сохраняя require для унаследованного кода.

Вот несколько предложений о том, как Node может достичь этого: