📦 Как опубликовать свой пакет в npm

Подробное руководство о том, как безболезненно публиковать свои модули в npm.

Итак, вы закончили работу над lib, cli-инструментом, компонентом или некоторыми другими скриптами, которыми хотите поделиться со всем миром. Итак, пора опубликовать их на npm.

🥇 Ваш первый пакет

Предположим, вы уже используете npm для своих зависимостей. Вы установили их с помощью npm install XYZ или, если вы супер крутые 😎, с помощью пряжи

Если теперь вы хотите опубликовать свой пакет в npm, для этого есть простая команда:

npm publish

🔥 Но прежде чем мы это сделаем, у нас есть еще несколько моментов в нашем 📋 контрольном списке.

📦 Package.json

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

Однако наиболее важным было бы

  • name
  • version
  • description
  • author
  • license
  • repository
  • main

Поле name определяет имя, которое ваш пакет будет иметь в реестре, и люди будут устанавливать ваш пакет поверх указанного вами имени. yarn add XYZ.

Тег version определяет версию вашего пакета. Вам действительно стоит подумать об использовании семвер. Потому что, возможно, ваш пакет будет использовать множество людей. И нет ничего хуже, чем ломать производственный код людей, потому что вы вносите критические изменения, а меняете только патч-версию своего пакета. 🙈

В поле description вы должны добавить краткое и актуальное описание вашего пакета. Люди будут читать его, если будут искать ваш пакет на npmjs.org.

В поле author вы указываете свое имя и адрес электронной почты, чтобы люди знали, кто опубликовал пакет. Обычно его добавляют в виде Name <e-mail>.

Я думаю, что поле license - одно из самых забытых. Люди часто думают, что это не это важно. Однако, если вы хотите, чтобы люди использовали ваш пакет, возможно, даже в более крупных проектах вам обязательно следует добавить лицензию. Таким образом, они знают, могут ли они использовать его в коммерческих проектах, каковы ограничения и так далее.

Вы также должны добавить поле repository со ссылкой на репозиторий github, и вы также можете добавить поле bugs со ссылкой на страницу проблем github. Таким образом, люди могут сообщать об ошибках и знать, где запрашивать функции.

Вы также можете добавить keywords, который поможет людям найти ваш пакет, если они что-то ищут на npmjs.org.

🗄 Зависимости

Итак, все мы знаем, что вы можете добавлять зависимости в свой проект. Или сохраните их как devDependencies с yarn add или yarn add -D

Теперь, если вы работаете над таким проектом, как приложение или веб-сайт, не будет такой большой разницы, если вы добавите свои зависимости как dependency или devDependency. Потому что большую часть времени они встроены в сборку браузера.

Однако, если вы хотите опубликовать пакет, библиотеку, компонент vue и т. Д., важно правильно настроить зависимости.

Зависимости необходимы для работы вашей библиотеки. Итак, если вы пишете API или службу и используете, например, запрос, это зависимость. Потому что это необходимо для правильной работы вашего кода.

DevDependencies - это те, которые требуются для разработки. Как eslint или xo для линтинга или karma или ava для тестирования. Это важно, потому что, если кто-то установит ваш пакет поверх yarn add my-awesome-lib, devDependencies не будет установлен! Поэтому, если вы добавите request как devDependency и где-то в вашем коде у вас будет import request from 'request', это не сработает. Из-за отсутствия зависимости.

peerDependencies в основном используются, если вы пишете для чего-то плагин. Потому что для этого требуется, чтобы у пользователя уже была установлена ​​зависимость. Например, вы хотите написать плагин для webpack, используете некоторые функции webpack и расширяете их. Если вы добавите webpack в качестве зависимости, пользователь установил бы две версии webpack: ту, которую он уже установил для процесса сборки, и ту, которая поставляется с вашим плагином.

Это чушь. Вам придется обновлять package.json при каждом выпуске нового webpack патча и обновлять версию зависимости. С peerDependencies вы говорите: Слушай, тебе нужен веб-пакет для запуска моего плагина, так что установите его, пожалуйста. Предпочтительная версия - 2.1.x Если кто-то установит webpack 2.2.x, ваш плагин тоже будет работать. Будет peerDependency version mismatch, но пока не будет критических изменений, он будет работать. Таким образом, вы даете пользователю свободу выбора версии и обновления зависимостей.

🚪 Точки входа

А теперь самое интересное. Точки входа в ваш lib / package. Этот сильно зависит от типа вашего пакета или библиотеки. Это узловой модуль? Это плагин для браузера?

Базовая точка входа будет определена над полем main. Там вы можете добавить, например, свой index.js. Если вы перекомпилируете исходный код или свяжете его, вы можете определить файл dist там.

"main": "dist/my-awesome-lib.js",

И если вы публикуете модули узла, вам подойдет этот.

Но если вы собираетесь публиковать что-то для браузера, вам нужно знать больше полей.

Например, поле unpkg. Если вы опубликуете свою библиотеку на npm, она будет доступна через unpkg. Это CDN, поэтому люди могут вставлять ваши скрипты в свои скрипты, не устанавливая их через npm.

https://unpkg.com/package@version/file

В поле unpkg вы можете указать файл по умолчанию, который будет обслуживаться, если кто-то укажет https://unpkg.com/package.

В большинстве случаев рекомендуется определять здесь минимизированную версию вашей библиотеки.

"unpkg": "dist/my-awesome-lib.min.js",

И последнее, но не менее важное: есть еще два поля.

Поля module и jsnext:main. Которые используются современными системами сборки, такими как Webpack 2, для захвата модулей ES6.

Итак, вы создали свой lib. В основном с современным ES6. Люди хотят использовать его прямо в браузере. Так что вам нужно это транспилировать. Но поскольку у вас также есть зависимости, вам необходимо связать в него зависимости. Итак, вы создаете модуль UMD.

Но некоторые люди могут захотеть использовать ваш пакет с browserify и gulp. Или с помощью webpack 1. Итак, вам нужна транспилированная и объединенная сборка CommonJs. Однако сейчас у нас 2017 год, и теперь в моде такие вещи, как тряска деревьев. Для этого вам понадобится дополнительная сборка. Сборка модуля ES. Где большинство функций и операторов переносятся в ES2015, за исключением операторов импорта и экспорта.

Я думаю, что сейчас только Rollup поддерживает модули ES в качестве целевого вывода. (Но вы также можете транспилировать с помощью babel). Итак, если у вас есть модуль ES, вы можете установить запись в поле module и / или jsnext:main.

Таким образом, вы обслуживаете разные сборки для разных людей и разных сред.

⛓ Совместимость

Что наиболее важно для узловых модулей, вы можете определить, какая минимальная версия nodejs должна быть установлена ​​для запуска вашего модуля. Это важно, если вы используете async / await, например, без его переноса.

"engines": {
    "node": ">=7.8.0"
  },

🚫 Игнорирует и ✅ Файлы

Хорошо, теперь у нас определены различные пакеты и сборки, и мы почти готовы опубликовать наш пакет. Однако у вас может быть журнал вещей в вашем репозитории git. Источник, возможно, ресурсы, связанные файлы и т. Д. Неразумно включать все это в свой пакет npm. Рекомендуется сохранять небольшой размер.

Во-первых, вам не нужны созданные вами файлы в репозитории git. Таким образом, вы игнорируете их в своем .gitignore

Вы также можете добавить .npmignore.

Если вы не создадите .npmignore, но у вас есть .gitignore, npm будет исключать все файлы, определенные в .gitignore

Итак, мы проигнорировали, например, нашу папку dist в нашем .gitignore, потому что мы не хотим, чтобы она была в нашем репо. Теперь нам нужно сообщить npm, что мы хотим включить эти файлы.

Итак, мы добавляем массив files в наш package.json.

"files": [
    "dist"
  ],

Вы также можете быть более откровенным и добавлять только файлы

"files": [
    "dist/my-awesome-lib.js",
    "dist/my-awesome-lib.min.js",
    "dist/my-awesome-lib.esm.js"
  ],

💯 Опубликовать

Теперь мы готовы опубликовать наш пакет. Но поскольку мы разработчики, а разработчики ленивы, мы должны добавить в наши скрипты дополнительную команду. Командный сценарий prepublish.

Этот запускается перед каждым npm publish. Поэтому рекомендуется, например, очистить ваши node_modules и выполнить новую установку зависимостей, выполнить lint и протестировать код, а затем построить код перед публикацией. Но решать вам! 👇🏻

"scripts": {
    "prepublish": "yarn run lint && yarn run test && yarn run build"
  },

И наконец запускаем npm publish. Имейте в виду, что вам нужна учетная запись на npmjs.org;)

🏷 Расст. Теги

Последняя тема очень удобная! Дист-теги. Если вы опубликуете свой пакет, он автоматически получит тег @latest для опубликованной вами версии.

Люди могут установить ваш пакет со строгой версией или с последним тегом: yarn add [email protected] или yarn add my-awesome-package, что эквивалентно my-awesome-package@latest

Теперь есть некоторые обстоятельства, когда вам понадобятся dist-теги. Первый - если вы поддерживаете несколько версий вашего пакета. Хорошими примерами являются webpack, vue и многие другие. Если вы начинаете с v1, а потом работаете над v2.

Допустим, у вас пакет v1.10.0, но вы работаете над выпуском v2.0.0 и хотите, чтобы люди тестировали его, сообщали о проблемах и т. Д.

Проблема в том, что если вы просто npm publish, он получит последний тег. Таким образом, каждый, кто установит его поверх npm install my-lib, получит нестабильную версию 2.0.0, чего мы не хотим. Для этого у нас есть теги. Вы можете перечислить свои теги с помощью npm dist-tag ls, и вы получите список тегов и версий пакетов, присвоенных им.

Теперь вы можете добавить тег к своей команде публикации.

npm publish --tag beta

Таким образом, текущая версия v2.0.0 будет помечена как beta. И тег @latest остается на v1.10.0

Теперь вы можете установить его поверх npm install my-awesome-lib@beta -D

🔥 Важно знать, что тегу можно назначить только одну версию. И вы не можете перезаписать изменения в версии.

Это очень важно для целей тестирования. Я на собственном горьком опыте понял, что только потому, что ваш код работает локально и модульные тесты проходят успешно, это не означает, что связанный файл, опубликованный на npm, будет работать так, как вы думаете.

Вот почему полезно протестировать ваши пакеты перед выпуском с тегом @latest. Для этого вы можете использовать старые добрые кандидаты на выпуск. Потому что, если вы измените версию своего пакета с 2.0.0 на 2.0.1 и опубликуете его с тегом beta, а затем вы увидите, что у вас все еще есть ошибка, вам нужно будет опубликовать следующую версию с 2.0.2. Вы не можете внести изменения в выпуск 2.0.1 и опубликовать его с той же версией с последним тегом.

Вот почему нужны постфиксы релиз-кандидаты или бета.

Вы просто устанавливаете версию в вашем package.json на 2.0.0-rc1 и публикуете ее с тегом beta. Затем вы можете протестировать его и только подтолкнуть rc1 к rc2 и т. Д. Если вы думаете, что готовы к работе, вы публикуете его как 2.0.0 ⭐

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсудить рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!