Публикация собственного npm-пакета
Превратите небольшую библиотеку из локального файла в версионированный, устанавливаемый пакет для всей экосистемы
npm install. Теперь вы разворачиваете стрелку и становитесь производителем. В публикации нет магии: пакет -- это просто папка с корректным манифестом package.json и архивом (tarball), загруженным в реестр. Сделайте манифест правильно -- и всё остальное сводится к трём командам.
- написать готовый к публикации
package.json--name,version,exports,files,license,engines; - выбрать правильное повышение семантической версии для любого изменения;
- объявить точки входа современной картой
exports, включая двойную сборку ESM/CJS; - точно контролировать, какие файлы попадут в пакет, с помощью
filesи.npmignore; - опубликовать скоуп-пакет публично и управлять жизненным циклом
deprecateи dist-тегов.
1. package.json -- манифест, определяющий пакет
Пакет идентифицируется в реестре ровно двумя полями: name и version. Вместе они образуют неизменяемую координату -- @acme/slugify@1.0.0 означает один конкретный архив, который уже нельзя изменить после публикации. Всё остальное в манифесте описывает, как этот архив разрешается и устанавливается.
{
"name": "@acme/slugify",
"version": "1.0.0",
"description": "Turn any string into a clean URL slug",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs"
}
},
"files": ["dist", "README.md"],
"keywords": ["slug", "slugify", "url", "seo"],
"license": "MIT",
"engines": { "node": ">=18" },
"repository": { "type": "git", "url": "git+https://github.com/acme/slugify.git" },
"publishConfig": { "access": "public" }
}
Поля, наиболее важные при публикации:
name-- глобально уникально в реестре. В нижнем регистре, безопасно для URL; может быть скоуп-именем вида@acme/slugify.version-- строка semver; должна быть выше любой уже опубликованной версии под этим именем.exports-- современная карта точек входа (заменяетmain). Она точно объявляет, что могут импортировать потребители.files-- список разрешённого, попадающего в архив. Без него npm отправит почти всё содержимое папки.license-- идентификатор SPDX, напримерMIT; без него ваш пакет юридически непригоден для многих команд.engines-- версии Node, которые вы поддерживаете, напр."node": ">=18"; для потребителей это предупреждение, а не жёсткий запрет.
Зависимости делятся на три вида. dependencies устанавливаются потребителям автоматически. devDependencies (тест-раннеры, сборщики, линтеры) -- нет: они существуют только в вашем репозитории. peerDependencies объявляют пакет, который, как вы ожидаете, уже предоставит хост-приложение (плагин, которому нужен его фреймворк), и устанавливает его потребитель, а не вы.