Репозиторий для NPM
Типичная ситуация, когда в проекте существует некий модуль который развивается, становится самостоятельным элементом и копируется в другой проект. В каждом проекте модуль обновляется и улучшается, в какой-то момент, становится не понятно, где актуальная версия. Вполне возможно, что в каждом проекте у модуля будут свои модификации, в которые будет достаточно сложно привести в порядок для использования в следующем проекте. Вполне можно ограничиться созданием отдельного репозитория в Гите для модуля, но можно пойти дальше и создать на основе такого модуля npm-пакет. Работать с такими пакетами очень просто, установить и обновить npm-пакет
можно с помощью команды.
Инициализация нового проекта
Используйте npm
для инициализации нового проекта, команда создаст файл package.json
, который будет содержать метаданные о вашем проекте и его зависимостях. Для инициализации, выполните команду:
npm init
Вам будет предложено ввести подробную информацию о вашем проекте. Вы можете нажать Enter
, чтобы принять значения по умолчанию или ввести свои собственные.
name
реальное название пакета, а не название приложения. Если лень искать адекватное название в общем пространстве имен, можно использовать пространство имен своего аккаунта@hmarketing/test
но оно платноеversion
версия проектаdescription
описание проектаmain
точка входа для пользователейCommonJS
, подключение идет за счет командыrequire("validate-npm-pc")
, папку в проекте лучше сделать логически правильную./cjs/mask.js
module
точка входа для пользователейES
, подключение идет за счет командыimport from "validate-npm-pc"
, папку в проекте лучше сделать логически правильную./esm/mask.js
type
определяет тип пакета и то, какNode.js
должен интерпретировать файлы с расширением.js
. Если файлpackage.json
не содержит этого поля, файлы.js
рассматриваются какCommonJS
. Значениеmodule
указываетNode.js
интерпретировать файлы с расширением.js
внутри пакета как использующие синтаксисES
files
массив, указывающий какие файлы должны быть включены, когда наш пакет опубликованkeywords
список ключевых слов для улучшения поиска нашего пакета на веб сайтеNPM
author
авторlicense
тип лицензииscripts
определите команды для создания, выпуска и тестирования проектаbuild
этот скрипт компилирует файлыTypeScript
вJavaScript
, используяtsc
запускает две отдельные сборки, используя файлы конфигурацииTypeScript
, которые мы будем создаватьtsconfig.json
иtsconfig.cjs.json
release
сценарий сначала запускаетbuild
, в случае успеха, публикует изменения, используяchangeset publish
test
: запускает наши тесты, используя Jest
devDependencies
зависимости, которые нужны для работы нашего модуля в режиме разработкиdependencies
зависимости, которые нужны для работы нашего модуля в режиме продакшина, эти зависимости будут установлены при скачивание пакета изNPM
хранилищяpeerDependencies
зависимости, которые должны быть установлены разработчиком совместно с вашим пакетом
Пример файла package.json
:
package.json{
"name": "название_модуля",
"version": "1.0.0",
"description": "описание_модуля",
"main": "./cjs/mask.js",
"module": "./esm/mask.js",
"type": "module",
"files": [
"/dist"
],
"scripts": {
"build": "tsc --project tsconfig.json && tsc --project tsconfig.cjs.json",
"release": "npm run build && changeset publish",
"test": "jest"
},
"keywords": [
"ключевые_слова"
],
"author": "hmarketing",
"license": "ISC",
"devDependencies": {
"ts-jest": "^29.1.2",
"typescript": "^5.4.5"
},
"dependencies": {
"test_hmarketing": "^1.0.0"
},
"peerDependencies": {
"jquery": "^3.7.0"
}
}
Зависимости
В файле package.json
присутствуют две секции dependencies
и devDependencies
. В первом перечислены зависимости, которые требуются для работы пакета в продакшене, во втором только во время разработки.
Это все прекрасно пока мы создаем приложение, но когда мы пишем библиотеку, мы должны учитывать что она будет помещена в целевой проект. В нем скорее всего уже будут установлены зависимости, которые мы тоже используем. Если мы оставим эти зависимости внутри своего dependencies
, могут возникнуть всякие неприятности типа использования двух библиотек в одном приложении. Поэтому я переношу все зависимости из dependencies
в devDependencies
, а которые нам нужны для продакшена в peerDependencies
.
Публикация пакета
Для начала нужно пройти регистрацию на npmjs.com, сделать это можно из терминала командой:
npm adduser
Если же учетная запись у вас уже есть, то нужно авторизироваться в терминале:
npm login
Проверить под какой учетной записью вы находитесь можно с помощью команды:
npm whoami
Теперь можно публиковать NPM-пакет, после введения команды, ваш пакет отправиться на сервера NPM
и будет доступен для подключения к проектам:
npm publish
Обновление NPM-пакета
Без обновлений модулей никуда. Для того чтобы правильно обновить пакет, вам нужно:
- Внести изменения в код
- Обновить версию пакета командой
npm version [ major | minor | patch ]
- Опубликовать новую версию пакета командой
npm publish
Правильное версионирование пакета поможет разработчикам, которые используют ваш пакет понять, насколько критические изменения были внесены.
Команда npm version patch
, увеличит версию пакета например, с 1.0.0 до 1.0.1. Незначительные исправления мелких ошибок:
npm version patch
Команда npm version minor
, увеличит версию пакета например, с 1.0.0 до 1.1.0. Добавления нового функционала, который не влияет на уже существующий функционал:
npm version minor
Команда npm version major
, увеличит версию пакета например, с 1.0.0 до 2.0.0. Модификация пакета без обратной совместимости с предыдущей версией. Разработчик поймет что простое обновление пакета может что-то сломать и изучит вопрос правильного обновления на новую мажорную версию:
npm version major
Удаление NPM-пакета
Удаление NPM-пакетов является очень плохим тоном, от пакетов могут зависеть проекты других пользователей. Однако, если после публикации пакета командой npm publish
прошло менее 24 часов, публикацию можно отменить командой npm unpublish
:
npm unpublish название_пакета@веосия_пакета
Удалить пакет полностью, можно из интерфейса личного кабинета на сайте NPM
.
Если необходимо удалить пакет с момента публикации которого прошло более 24 часов, напишите в поддержку, указав причину удаления пакета. Пакет будет помечен как @deprecated
и исчезнет из вашего профиля.