TL; DR - Не до ~ жовтня 2019 року Node.js модулі Team НЕ запитав :
Будь ласка, не публікуйте жодних пакетів модулів ES, призначених для використання Node.js до [жовтня 2019 року]
2019 травень оновлення
З 2015 року, коли було задано це запитання, підтримка модулів JavaScript значно визріла, і, сподіваємось, офіційно буде стабільною у жовтні 2019 року. Усі інші відповіді застаріли або надмірно ускладнюються. Ось поточна ситуація та найкраща практика.
Підтримка ES6
99% ES6 (він же 2015) підтримується Node з версії 6 . Поточна версія Node складає 12. Усі вічнозелені браузери підтримують переважну більшість функцій ES6. ECMAScript зараз на версії 2019 року , а схема версій тепер надає перевагу використанню років.
Модулі ES (він же модулі ECMAScript) у браузерах
Все вічнозелені браузери були підтримувати import
-ву модулі ES6 оскільки 2017. Динамічні імпорту будуть підтримуватися з допомогою Chrome (+ вила , як Opera і Samsung Інтернет) і Safari. Підтримка Firefox призначена для наступної версії 67.
Вам більше не потрібен Webpack / rollup / посилка тощо для завантаження модулів. Вони можуть бути корисні для інших цілей, але не потрібно завантажувати ваш код. Ви можете безпосередньо імпортувати URL-адреси, що вказують на код модулів ES.
Модулі ES в Node
ES модулі ( .mjs
файли з import
/ export
) підтримуються з Node v8.5.0 за допомогою дзвінка node
з --experimental-modules
прапором. Node v12, випущений у квітні 2019 року, переписав підтримку експериментальних модулів. Найбільш помітна зміна полягає в тому, що при імпорті потрібно вказати розширення файлу за замовчуванням:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Зверніть увагу на обов'язкові .mjs
розширення протягом усього часу. Виконувати як:
node --experimental-modules index.mjs
Випуск Node 12 також відбувається, коли команда модулів попросила розробників не публікувати пакети модулів ES, призначені для використання Node.js, поки не буде знайдено рішення для використання пакетів через обидва require('pkg')
і import 'pkg'
. Ви все ще можете публікувати вбудовані модулі ES, призначені для браузерів.
Підтримка екосистеми власних модулів ES
Станом на травень 2019 року підтримка екосистеми для модулів ES незріла. Наприклад, тестові рамки, такі як Jest і Ava , не підтримують --experimental-modules
. Вам потрібно використовувати транспілер, а потім вирішити між використанням названого import { symbol }
синтаксису import ( ) (який ще не працює з більшістю пакетів npm) та синтаксисом імпорту за замовчуванням ( import Package from 'package'
), який працює, але не тоді, коли Babel аналізує його для пакетів, автором яких є TypeScript (graphql-інструменти, приплив вузлів, швидкість і т. д.) Однак існує рішення, яке працює і з, --experimental-modules
і якщо Babel перетворює ваш код, щоб ви могли перевірити його за допомогою Jest / Ava / Mocha тощо:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Можливо, некрасиво, але таким чином ви можете написати власний код модулів ES за допомогою import
/ export
та запустити йогоnode --experimental-modules
без транспілерів. Якщо у вас є залежності, які ще не готові до ESM, імпортуйте їх, як описано вище, і ви зможете використовувати тестові рамки та інші інструменти через Babel.
Попередня відповідь на питання - пам’ятайте, не робіть цього, поки Node не вирішить проблему вимагати / імпортувати, сподіваємось, приблизно в жовтні 2019 року.
Публікація модулів ES6 до npm, із зворотною сумісністю
Для того, щоб опублікувати модуль ES в npmjs.org так , що він може бути імпортований безпосередньо, без Бабеля та інших transpilers, просто вказати main
поле в package.json
в .mjs
файл, але опустити розширення:
{
"name": "mjs-example",
"main": "index"
}
Це єдина зміна. Опустивши розширення, Node спочатку шукатиме файл mjs, якщо він працює з --experimental-модулями. В іншому випадку він повернеться до файлу .js, тож ваш існуючий процес транспіляції для підтримки старих версій вузла буде працювати, як і раніше - просто переконайтеся, що наведіть Babel на .mjs
файл (и).
Ось джерело для рідного модуля ES із сумісністю для зворотного для Node <8.5.0, який я опублікував у NPM. Ви можете користуватися ним прямо зараз, без Вавілон чи чогось іншого.
Встановіть модуль:
npm install local-iso-dt
# or, yarn add local-iso-dt
Створіть тестовий файл test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Запустити вузол (v8.5.0 +) за допомогою прапора --experimental-module:
node --experimental-modules test.mjs
TypeScript
Якщо ви розробляєте TypeScript, ви можете генерувати код ES6 та використовувати модулі ES6:
tsc index.js --target es6 --modules es2015
Тоді вам потрібно перейменувати *.js
вихід на .mjs
відому проблему, яка, сподіваємось, незабаром виправиться, тому tsc
зможе виводити .mjs
файли безпосередньо.