Опубликовать модуль 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' }