npm

Материал из llmdocs — справочник разработчика
npm
АвторАйзек Шлютер (Isaac Z. Schlueter)
Первый выпуск2010
ВладелецGitHub (Microsoft), с 2020
Входит вNode.js
Реестрregistry.npmjs.org
Пакетов в реестреболее 3 миллионов
Файлыpackage.json, package-lock.json, node_modules/
Альтернативыpnpm, Yarn, Bun

npm — менеджер пакетов для JavaScript и одновременно крупнейший в мире публичный реестр программных пакетов. Утилита npm поставляется вместе с Node.js: она устанавливает зависимости, описанные в файле package.json, фиксирует их точные версии в lock-файле и запускает скрипты проекта. Через реестр npm распространяются не только серверные библиотеки, но и почти весь инструментарий фронтенда: React, сборщики, линтеры, компилятор TypeScript.

История

npm создал Айзек Шлютер в 2010 году, вскоре после появления Node.js; с 2011 года он входит в поставку Node. В 2014 году была основана компания npm, Inc., а в 2020-м её купила GitHub (Microsoft).[1] Реестр пережил несколько громких инцидентов: в 2016 году автор удалил крошечный пакет left-pad, и сборки тысяч проектов сломались — после этого правила удаления опубликованных версий ужесточили. Атаки на цепочку поставок — захват аккаунтов мейнтейнеров и вредоносные версии популярных пакетов — остаются главной угрозой экосистемы.

package.json

Файл описывает проект и его зависимости:[2]

{
  "name": "my-app",
  "version": "1.2.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "test": "vitest"
  },
  "dependencies": {
    "express": "^4.21.0"
  },
  "devDependencies": {
    "typescript": "~5.6.0",
    "vitest": "^2.1.0"
  },
  "engines": {"node": ">=20"}
}
  • dependencies — нужны при работе приложения; devDependencies — только при разработке и сборке.
  • scripts — команды проекта: npm run build, а для test и start — просто npm test.
  • version следует правилам семантического версионирования.

Диапазоны версий

npm понимает диапазоны semver:[4]

Запись Что разрешено Пример для 4.21.0
4.21.0 только эта версия 4.21.0
~4.21.0 патчи 4.21.x
^4.21.0 минорные и патчи 4.x.x, не 5.0
* или latest любая что угодно

По умолчанию npm install pkg записывает диапазон с ^. Поэтому точные установленные версии всего дерева, включая транзитивные зависимости, фиксирует package-lock.json.[3] Lock-файл обязательно хранят в Git, а в CI используют npm ci — она устанавливает строго по lock-файлу, удаляет старый node_modules и падает при расхождении с package.json.

Основные команды

npm init -y                 # создать package.json
npm install                 # установить всё (npm i)
npm install zod             # добавить зависимость
npm install -D eslint       # добавить dev-зависимость
npm ci                      # чистая установка по lock-файлу (CI)
npm outdated                # что можно обновить
npm update                  # обновить в пределах диапазонов
npm audit                   # известные уязвимости
npx create-vite@latest app  # запустить пакет без установки
npm publish --access public # опубликовать свой пакет

npx скачивает и выполняет пакет одной командой — удобно для генераторов проектов и разовых утилит.

node_modules и альтернативы

npm раскладывает зависимости в каталог node_modules, поднимая их на верхний уровень, где возможно. Каталог бывает огромным, а «плоская» структура позволяет случайно импортировать пакет, не объявленный в зависимостях.

  • pnpm хранит каждую версию пакета один раз в общем хранилище и подключает жёсткими ссылками; экономит место, ускоряет установку и запрещает необъявленные импорты.[6]
  • Yarn появился в 2016 году как более быстрая и детерминированная альтернатива; Yarn Berry предлагает режим Plug'n'Play без node_modules.
  • Bun — среда выполнения JavaScript со встроенным очень быстрым менеджером пакетов.

Все они работают с тем же реестром и package.json; инструмент Corepack в Node.js фиксирует нужный менеджер через поле packageManager. Монорепозитории поддерживаются через workspaces.

Безопасность

  • Устанавливайте зависимости через npm ci по lock-файлу и проверяйте изменения lock-файла на ревью.
  • Скрипты postinstall выполняются при установке; npm install --ignore-scripts отключает их для недоверенного кода.
  • Включайте двухфакторную аутентификацию для публикации (см. 2FA) и публикуйте пакеты из CI с provenance — подписанной ссылкой на исходный коммит и сборку.[5]
  • Проверяйте опечатки в именах пакетов: тайпсквоттинг (expres вместо express) — распространённый способ доставки вредоносного кода.

См. также

Источники

  1. npm Docs
  2. npm Docs — package.json
  3. npm Docs — package-lock.json
  4. npm Docs — semver
  5. npm Docs — Generating provenance statements
  6. pnpm — Motivation