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