# npm

> Менеджер пакетов и публичный реестр экосистемы JavaScript и Node.js; package.json, lock-файл, скрипты. Альтернативы — pnpm, Yarn, Bun.

Источник: https://llmdocs.ru/wiki/npm/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Автор**: Айзек Шлютер (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](https://llmdocs.ru/wiki/javascript.md) и одновременно крупнейший в мире публичный реестр программных пакетов. Утилита `npm` поставляется вместе с [Node.js](https://llmdocs.ru/wiki/nodejs.md): она устанавливает зависимости, описанные в файле `package.json`, фиксирует их точные версии в lock-файле и запускает скрипты проекта. Через реестр npm распространяются не только серверные библиотеки, но и почти весь инструментарий фронтенда: React, сборщики, линтеры, компилятор [TypeScript](https://llmdocs.ru/wiki/typescript.md).

## История

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

## package.json

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

```json
{
  "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** следует правилам [семантического версионирования](https://llmdocs.ru/wiki/semver.md).

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

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](https://llmdocs.ru/wiki/git.md), а в CI используют `npm ci` — она устанавливает строго по lock-файлу, удаляет старый `node_modules` и падает при расхождении с `package.json`.

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

```bash
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](https://llmdocs.ru/wiki/two-factor-auth.md)) и публикуйте пакеты из CI с **provenance** — подписанной ссылкой на исходный коммит и сборку.[5]
- Проверяйте опечатки в именах пакетов: тайпсквоттинг (`expres` вместо `express`) — распространённый способ доставки вредоносного кода.

## См. также

- [Node.js](https://llmdocs.ru/wiki/nodejs.md)
- [JavaScript](https://llmdocs.ru/wiki/javascript.md)
- [TypeScript](https://llmdocs.ru/wiki/typescript.md)
- [Семантическое версионирование](https://llmdocs.ru/wiki/semver.md)

## Источники

1. [npm Docs](https://docs.npmjs.com/)
2. [npm Docs — package.json](https://docs.npmjs.com/cli/v10/configuring-npm/package-json)
3. [npm Docs — package-lock.json](https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json)
4. [npm Docs — semver](https://docs.npmjs.com/cli/v6/using-npm/semver)
5. [npm Docs — Generating provenance statements](https://docs.npmjs.com/generating-provenance-statements)
6. [pnpm — Motivation](https://pnpm.io/motivation)
