Open Source

Публикация npm-пакета

lodash скачивают 50 миллионов раз в неделю. is-odd - 500 тысяч. Даже маленький пакет с одной функцией может стать частью глобальной инфраструктуры. Опубликовать пакет - это взять на себя ответственность за тех кто на него полагается.

  • left-pad инцидент 2016: 11-строчный пакет, удалённый одним человеком, сломал весь npm экосистему
  • colors.js и faker.js: maintainer намеренно сломал свои пакеты в 2022 году
  • event-stream 2018: compromised maintainer внедрил malware в популярный пакет
  • npm provenance появился как ответ на supply chain атаки - теперь это стандарт

Настройка package.json для публикации

package.json - манифест вашего пакета. Для публичного npm-пакета он должен содержать больше чем для приватного проекта. Неправильный package.json - и пользователи получают сломанные типы, лишние файлы или неправильные entry points.

Вы создаёте npm-пакет React-компонентов. Куда поместить зависимость от React?

Публикация и автоматизация через GitHub Actions

Ручная публикация через `npm publish` работает, но только для маленьких проектов. Автоматизация через GitHub Actions - стандарт для серьёзных пакетов: каждый tag автоматически публикует версию, без человеческих ошибок.

**npm provenance** (--provenance флаг) - новая фича npm которая криптографически связывает опубликованный пакет с конкретным GitHub Actions run. Пользователи могут верифицировать что пакет собран именно из вашего репозитория. Это защита от supply chain атак.

Вы случайно опубликовали версию 1.2.0 с багом. Можно ли unpublish и опубликовать правильный 1.2.0?

Ключевые идеи

  • peerDependencies для React, Vue и других фреймворков - избегает дублирования
  • "files" в package.json - whitelist что публиковать: только dist, README, LICENSE
  • exports поле - современный способ определить entry points для ESM и CJS
  • GitHub Actions + NPM_TOKEN = автопубликация по git tag
  • npm provenance - криптографическая верификация источника пакета

Связанные темы

Пакет опубликован. Следующий шаг - документация которая помогает людям его использовать.

  • Следующий урок курса — Логическое продолжение

Вопросы для размышления

  • Почему left-pad инцидент стал возможен? Какие изменения npm внёс после него?
  • Запустите `npx publint` на любом вашем пакете. Что он нашёл?

Связанные уроки

  • se-02
Публикация npm-пакета

0

1

Войти