Узел 13.2.0 и выше
NodeJS 13.2.0 теперь поддерживает модули ES без флага 🎉 Однако реализация по-прежнему помечена как экспериментальная, поэтому используйте ее с осторожностью.
Чтобы включить поддержку ESM в 13.2.0, добавьте следующее package.json
:
{
"type": "module"
}
Все .js
, .mjs
(или файлы без расширения) будет рассматриваться как ESM.
Существует целый ряд различных опций, кроме полного подписки,package.json
которые подробно описаны в Документации для 13.2.0 .
Узел 13.1.0 и ниже
Те , кто до сих пор использует старые версии Node может понадобиться попробовать ESM модуль загрузчик, который является производством готовой реализацией ES Модули Spec для NodeJS:
node -r esm main.js
Подробные обновления ...
23 апреля 2019 г.
Недавно появился PR, чтобы изменить способ обнаружения ES-модулей:
https://github.com/nodejs/node/pull/26745
Это все еще за --experimental-modules
флагом, но есть значительные изменения в способе загрузки модулей:
package.type
который может быть module
илиcommonjs
type: "commonjs"
:
.js
анализируется как commonjs
- по умолчанию для точки входа без расширения является commonjs
type: "module"
:
.js
анализируется как ESM
- не поддерживает загрузку JSON или Native Module по умолчанию
- по умолчанию для точки входа без расширения является esm
--type=[mode]
чтобы вы могли установить тип в точке входа. Переопределит package.type
для точки входа.
- Новое расширение файла
.cjs
.
- это специально для поддержки импорта commonjs в
module
режиме.
- это только в загрузчике esm, загрузчик commonjs остается без изменений, но расширение будет работать в старом загрузчике, если вы используете полный путь к файлу.
--es-module-specifier-resolution=[type]
- варианты
explicit
(по умолчанию) иnode
- по умолчанию наш загрузчик не допускает дополнительных расширений при импорте, путь к модулю должен включать расширение, если оно есть
- по умолчанию наш загрузчик не позволяет импортировать каталоги с индексным файлом
- разработчики могут использовать,
--es-module-specifier-resolution=node
чтобы включить алгоритм разрешения спецификатора commonjs
- Это не «особенность», а реализация для экспериментов. Ожидается, что он будет изменен до удаления флага
--experimental-json-loader
- единственный способ импортировать JSON, когда
"type": "module"
- при включении все
import 'thing.json'
пройдет через экспериментальный загрузчик независимо от режима
- основанный на whatwg / html # 4315
- Вы можете использовать,
package.main
чтобы установить точку входа для модуля
- расширения файлов, используемые в main, будут решаться в зависимости от типа модуля
17 января 2019 г.
Узел 11.6.0 по- прежнему перечисляет модули ES как экспериментальные, за флагом.
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 .
Февраль 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Ребята из NodeJS решили, что наименее плохим решением является использование .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 может достичь этого:
node es2015 modules
в качестве одного из лучших результатов показывает следующее: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .