Вузол 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 для 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
аналізується як есм
- не підтримує завантаження 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
для встановлення точки входу для модуля
- розширення файлів, що використовуються в основному, будуть вирішені залежно від типу модуля
17 січня 2019 року
Вузол 11.6.0 досі перераховує модулі ES як експериментальні, за прапором.
13 вересня 2017 року
NodeJS 8.5.0 було випущено з підтримкою файлів mjs за прапором:
node --experimental-modules index.mjs
План цього - зняти прапор для випуску v10.0 LTS.
- Актуалізована інформація. Тут утримувались для історичних цілей--
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 та Virtual Machine, перш ніж 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 .