Как опубликовать модуль, написанный в ES6 для NPM?

Я собирался опубликовать модуль для NPM, когда я подумал о переписывании его в ES6, как для будущего доказательства, так и для изучения ES6. Я использовал Бабеля с transpile в ES5, и запускать тесты. Но я не уверен, как продолжить:

  1. Я transpile, и опубликовать полученные /из папки с НПМ?
  2. включить ли папку результатов в репозиторий Github?
  3. или я поддерживаю 2 репозитория, один со скриптом ES6 code + gulp для Github и один с транспилированными результатами + тесты для NPM?

короче говоря: какие шаги мне нужно предпринять, чтобы опубликовать модуль, написанный в ES6 для NPM, все еще позволяя людям просматривать/разветвлять исходный код?

8 ответов


шаблон, который я видел до сих пор, состоит в том, чтобы сохранить файлы es6 в и построить свои вещи в prepublish НПМ к


мне нравится ответ Хосе. Я заметил, что несколько модулей уже следуют этой схеме. Вот как можно легко реализовать с Babel6. Установить babel-cli локально, поэтому сборка не ломается, если я когда-либо изменю свою глобальную версию babel.

.npmignore

/src/

.gitignore

/lib/
/node_modules/

Установить Babel

npm install --save-dev babel-core babel-cli babel-preset-es2015

.в JSON

{
  "main": "lib/index.js",
  "scripts": {
    "prepublish": "node_modules/babel-cli/bin/babel.js src --out-dir lib"
  },
  "babel": {
    "presets": ["es2015"]
  }
}

@Jose прав. Нет ничего плохого в публикации ES6 / ES2015 в NPM, но это может вызвать проблемы, особенно если человек, использующий ваш пакет, использует Webpack, например, потому что обычно люди игнорируют node_modules папка при предварительной обработке с помощью babel по соображениям производительности.

Итак, просто используйте gulp, grunt или просто узел.js построить lib папка, которая является ES5.

вот мой build-lib.js скрипт, который я держу в ./tools/ (не gulpили grunt здесь):

var rimraf = require('rimraf-promise');
var colors = require('colors');
var exec = require('child-process-promise').exec;

console.log('building lib'.green);

rimraf('./lib')
    .then(function (error) {
        let babelCli = 'babel --optional es7.objectRestSpread ./src --out-dir ./lib';
        return exec(babelCli).fail(function (error) {
            console.log(colors.red(error))
        });
    }).then(() => console.log('lib built'.green));

вот последний совет: Вы нужно добавить .npmignore для вашего проекта. Если npm publish не находит этот файл, он будет использовать .gitignore вместо этого, что вызовет у вас проблемы, потому что обычно ваш исключить ./lib и включения ./src, что прямо противоположно тому, что вы хотите, когда публикуете в NPM. The .npmignore файл имеет в основном тот же синтаксис .gitignore (насколько мне известно).


Если вы хотите увидеть это в действии в очень простом небольшом модуле узла с открытым исходным кодом, взгляните на N-й день (который я начал - также другие участники). Посмотри в пакете.файл json и на шаге prepublish, который приведет вас к тому, где и как это сделать. Если вы клонируете этот модуль, вы можете запустить его локально и использовать в качестве шаблона для вас.


два критерия пакета NPM заключаются в том, что он может использоваться только с require( 'package' ) и делает что-то программное обеспечение.

Если вы выполняете эти два требования, вы можете делать все, что пожелаете. Даже если модуль написан в ES6, если конечному пользователю не нужно это знать, я бы транспилировал его сейчас, чтобы получить максимальную поддержку.

однако, если бы КоА, ваш модуль требует совместимости с пользователями, использующими функции ES6, а затем, возможно, два пакетное решение было бы лучшей идеей.

еда на вынос

  1. публиковать только столько кода, сколько вам нужно сделать require( 'your-package' ) работа.
  2. если между ES5 и 6 не имеет значения для пользователя, опубликуйте только 1 пакет. Transpile его, если необходимо.

главный ключ в package.json решает точку входа в пакет после его публикации. Таким образом, вы можете поместить вывод вашего Вавилона туда, куда хотите, и просто упомянуть правильный путь в main ключ.

"main": "./lib/index.js",

вот хорошо написанная статья о том, как опубликовать пакет npm

https://codeburst.io/publish-your-own-npm-package-ff918698d450

вот образец РЕПО, который вы можете использовать для ссылка

https://github.com/flexdinesh/npm-module-boilerplate


обновление сентября 2018

С 2015 года, когда был задан этот вопрос, поддержка JavaScript для модулей значительно повзрослела. Все остальные ответы устарели или слишком сложны. Вот нынешняя ситуация и передовая практика.

поддержка

99% ES6 (aka 2015) поддерживается Node начиная с версии 6. Нынешняя ночная версия 11. Все вечнозеленые браузеры поддерживают подавляющее большинство функций ES6. ECMAScript является теперь в версии 2018, и схема управления версиями теперь благоприятствует использованию лет.

использование модуля ES6 (с бонусом импорта/экспорта)

// lib.mjs 

export const hello = 'Hello world!';

// index.mjs:

import { hello } from './lib';
console.log(hello);

Примечание обязательные (ы).

здесь источник для собственного модуля ES с обратной совместимостью для узла что я опубликовал в NPM. Вы можете использовать его прямо сейчас, без Вавилона или чего-либо еще.

установить модуль:

yarn add local-iso-dt
# or, npm install local-iso-dt

создать тестовый файл


несколько дополнительных заметок для всех, используя собственные модули непосредственно из github, не проходя через опубликовано:

The (широко используется)" prepublish " крюк не делает что-нибудь для вас.

лучшее, что можно сделать (если планирует полагаться на репозитории github, а не на опубликованные материалы):

  • unlist src from .npmignore (другими словами: разрешить). Если у вас нет .npmignore, помните: A копия .gitignore будет использоваться вместо этого в установленном месте, как ls node_modules/yourProject покажет вам.
  • убедитесь, babel-cli является depenency в вашем модуле, а не только devDepenceny, так как вы действительно строите на потребляющей машине ака на компьютере разработчиков приложений, который использует ваш модуль
  • сделайте вещь сборки, в установить крюк т. е.:

    "install": "babel src -d lib -s"

(нет добавленной стоимости в попытке что-либо "предустановка", т. е. babel-cli может отсутствовать)