Как опубликовать модуль, написанный на ES6 в NPM?
Я собирался опубликовать модуль в NPM, когда я подумал о переписывании его в ES6, чтобы как в будущем, так и узнать ES6. Я использовал Babel для транспилирования в ES5 и запуска тестов. Но я не уверен, как поступить:
- должен ли я транспилировать и публиковать полученную папку / out в NPM?
- нужно ли включать папку результатов в репозиторий Github?
- или я поддерживаю 2 репозитория, один с кодом ES6 + скрипт gulp для Github, а другой с транспилированными результатами + тесты для НПМ?
короче говоря: какие шаги мне нужно предпринять, чтобы опубликовать модуль, написанный на ES6 в NPM, при этом позволяя людям просматривать/разветвлять исходный код?
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, а затем, возможно, два пакетное решение было бы лучшей идеей.
самовывоз
- публикуйте только столько кода, сколько вам нужно сделать
require( 'your-package' )работа.- если только между ES5 и 6 не имеет значения для пользователя, опубликуйте только 1 пакет. Транспилируйте его, если нужно.
главный ключ в
package.jsonопределяет точку входа в пакет после его публикации. Таким образом, вы можете поместить выход вашего Вавилона туда, где вы хотите, и просто должны упомянуть правильный путь вmainключ."main": "./lib/index.js",вот хорошо написанная статья о том, как опубликовать пакет npm
https://codeburst.io/publish-your-own-npm-package-ff918698d450
вот пример РЕПО, который вы можете использовать для ссылка
обновление в сентябре 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);обратите внимание на обязательное (ы).
установить модуль:
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