Я искал по всему интернету без четкого ответа на это.
В настоящее время NodeJS использует только синтаксис CommonJS для загрузки модулей, и если вы действительно хотите использовать стандартный синтаксис модулей ES2015, вы должны либо перенести его заранее, либо использовать внешний загрузчик модулей во время выполнения.
В настоящее время я не слишком уверен, чтобы использовать любой из этих двух методов, планируют ли сопровождающие NodeJS даже поддерживать модули ES2015 или нет? Я вообще не нашел подсказки по этому поводу.
На данный момент NodeJS 6.x утверждает, что поддерживает 96% функций ES2015, но нет никаких ссылок на модули ( ссылка на поддержку NodeJS ES2105 ).
Знаете ли вы, будет ли NodeJS поддерживать эти модули "из коробки" в ближайшем будущем?
источник
node es2015 modules
в качестве одного из лучших результатов показывает следующее: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .Ответы:
Узел 13.2.0 и выше
NodeJS 13.2.0 теперь поддерживает модули ES без флага 🎉 Однако реализация по-прежнему помечена как экспериментальная, поэтому используйте ее с осторожностью.
Чтобы включить поддержку ESM в 13.2.0, добавьте следующее
package.json
:Все
.js
,.mjs
(или файлы без расширения) будет рассматриваться как ESM.Существует целый ряд различных опций, кроме полного подписки,
package.json
которые подробно описаны в Документации для 13.2.0 .Узел 13.1.0 и ниже
Те , кто до сих пор использует старые версии Node может понадобиться попробовать ESM модуль загрузчик, который является производством готовой реализацией ES Модули Spec для NodeJS:
Подробные обновления ...
23 апреля 2019 г.
Недавно появился PR, чтобы изменить способ обнаружения ES-модулей: https://github.com/nodejs/node/pull/26745
Это все еще за
--experimental-modules
флагом, но есть значительные изменения в способе загрузки модулей:package.type
который может бытьmodule
илиcommonjs
type: "commonjs"
:.js
анализируется как commonjstype: "module"
:.js
анализируется как ESM--type=[mode]
чтобы вы могли установить тип в точке входа. Переопределитpackage.type
для точки входа..cjs
.module
режиме.--es-module-specifier-resolution=[type]
explicit
(по умолчанию) иnode
--es-module-specifier-resolution=node
чтобы включить алгоритм разрешения спецификатора commonjs--experimental-json-loader
"type": "module"
import 'thing.json'
пройдет через экспериментальный загрузчик независимо от режимаpackage.main
чтобы установить точку входа для модуля17 января 2019 г.
Узел 11.6.0 по- прежнему перечисляет модули ES как экспериментальные, за флагом.
13 сентября 2017
NodeJS 8.5.0 был выпущен с поддержкой файлов 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
Затем запустите:
Февраль 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Ребята из NodeJS решили, что наименее плохим решением является использование
.mjs
расширения файла. Вывод из этого:А что касается сроков ...
Октябрь 2016:
Один из разработчиков на Node.JS недавно присутствовал на собрании TC-39 и написал превосходную статью о блокировщиках для реализации для Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Основной вывод из этого:
*.mjs
кажется наиболее вероятным решением, если они не могут точно обнаружить модуль ES без ввода пользователя- Оригинальный ответ -
Это была горячая картошка уже довольно давно. Суть в том, что да, Node в конечном итоге будет поддерживать синтаксис ES2015 для импорта / экспорта модулей - скорее всего, когда спецификация для загрузки модулей будет завершена и согласована.
Вот хороший обзор того, что держит NodeJS. По сути, они должны убедиться, что новая спецификация работает для Node, который в основном состоит из условной синхронной загрузки, а также для HTML, который в основном асинхронный.
Никто не знает наверняка прямо сейчас, но я предполагаю, что Node будет поддерживать
import/export
статическую загрузку, в дополнение к новойSystem.import
для динамической загрузки - при этом сохраняяrequire
устаревший код.Вот несколько предложений о том, как Node может достичь этого:
источник
.mjs
расширении:We have affectionately called these “Michael Jackson Script” files in the past
. На всякий случай, когда вы слышите, как кто-то говорит о поп-артистах во время выступления в JSimport * from 'foo'
будет обрабатываться как CommonJSimport * as bar from 'bar'
, а bar.js - как модуль ES6. Может кто-нибудь объяснить?