Перейти к содержанию

Публикация собственного npm-пакета

Начало урока

Публикация собственного 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 объявляют пакет, который, как вы ожидаете, уже предоставит хост-приложение (плагин, которому нужен его фреймворк), и устанавливает его потребитель, а не вы.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя