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



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




  1. должен ли я транспилировать и публиковать полученную папку / out в NPM?

  2. нужно ли включать папку результатов в репозиторий Github?

  3. или я поддерживаю 2 репозитория, один с кодом ES6 + скрипт gulp для Github, а другой с транспилированными результатами + тесты для НПМ?


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

621   8  

8 ответов:

шаблон, который я видел до сих пор, чтобы сохранить файлы es6 в src каталог и построить свой материал в НПМ 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));

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

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

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

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

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

самовывоз

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

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

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

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

Comments

    Ничего не найдено.