Опубликовать модуль ES (.mjs) в NPMJS, с обратной совместимостью для узла
до узла v8.5.0,публикация модуля, написанного на ES6 в NPMJS был простой процесс: транспилировать код ES6 с помощью такого инструмента, как Babel, и опубликовать в NPMJS полученный , пока ваш GitHub РЕПО содержит src
файлы.
С v8.5.0, узел выпустил экспериментальную поддержку собственных модулей (export
/import
) через --experimental-modules
флаг. Теперь можно опубликовать чисто-ES6 модули для Npmjs на и использовать их без каких-либо transpilation, пока соответствующие файлы имеют .mjs
1 ответов
хитрость не указать точный путь в пакета.в JSON main
запись. Вместо этого используйте расширение-less main
запись, или поставить как index.js
и index.mjs
в корне пакета.
Вариант 1-без расширения main:
если вы не включаете расширение, узел будет динамически использовать .mjs
расширение, если доступно и с помощью загрузчика ES6, или резервное копирование на .js
.
"main": "lib/entry"
это позволит избежать lib/entry.mjs
в режиме модуля ES6 или lib/entry.js
в режиме CommonJS, при этом загрузчик ES6 возвращается к версии CommonJS, если файл MJS недоступен.
Вариант 2 - Использовать index.mjs
и index.js
вместо:
если ваш пакет поставляет корневой index.mjs
и index.js
узел предпочтет index.mjs
, когда import
- ed, и все еще используйте index.js
, когда require
- ed (если нет index.mjs
поставляется, загрузчик ES6 будет использовать index.js
). Это означает, что вы можете поставить оба ES6 версия модуля от index.mjs
и CommonJS транспилированная версия из index.js
.
Вопрос:
есть одна потенциальная проблема, о которой я могу думать, хотя, если пользователи вашего пакета используют модули ES6 и CommonJS и ожидают, что они будут ссылаться на один и тот же набор объектов. В некоторых случаях edge это может быть проблемой, но несколько пакетов, использующих один и тот же экземпляр модуля, никогда не были заданы, потому что разные пакеты могут требовать различные версии пакета.
пример:
пример проекта:
index.mjs
import testmod from 'testmod';
console.log(testmod);
index.js
const testmod = require('testmod');
console.log(testmod);
node_modules/testmod/package.json
{
"name": "testmod",
"version": "1.0.0"
}
в этом файле вы можете дополнительно использовать расширение main
запись такой:
{
"name": "testmod",
"version": "1.0.0",
"main": "index"
}
node_modules/testmod/index.mjs
export default {
from: 'index.mjs'
};
node_modules/testmod/index.js
module.exports = {
from: 'index.js'
};
пример вывода (ExperimentalWarning опущены):
$ node --experimental-modules index.mjs
{ from: 'index.mjs' }
$ node --experimental-modules index.js
{ from: 'index.js' }
$ node index.js
{ from: 'index.js' }