Пакетные менеджеры: npm, yarn, pnpm, lock-файлы, semver

↑ 6.2 Сборка и инфраструктура: Vite, monorepo, CI∕CD · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Воспроизводимость сборок и безопасность зависимостей.

Объяснение

МенеджерОсобенности
npmстандарт с Node.js, плоский node_modules
Yarn (Classic v1, Berry v2+)workspaces, Plug’n’Play (Berry), zero-installs
pnpmконтентно-адресуемое хранилище + жёсткие ссылки: экономия диска, скорость, строгая структура (нет «фантомных» зависимостей)
Bunбыстрый рантайм и менеджер

semver MAJOR.MINOR.PATCH: major — ломающие изменения, minor — обратно совместимые новые возможности, patch — исправления.

ДиапазонЗначение
1.2.3ровно
^1.2.3>=1.2.3 <2.0.0 (по умолчанию в npm)
~1.2.3>=1.2.3 <1.3.0
>=, *, latestопасно широкие
Pre-release 1.0.0-beta.2нестабильные

Lock-файл (package-lock.json, yarn.lock, pnpm-lock.yaml) фиксирует точное дерево зависимостей и хэши — воспроизводимая установка. Коммитьте lock-файл.

npm ci                     # строго по lock-файлу, чистая установка (CI)
npm install                # может обновить lock
pnpm install --frozen-lockfile
npm outdated / npm update / npx npm-check-updates -u
npm audit --omit=dev / npm audit fix
npm ls <pkg> / npm why <pkg>          # почему пакет в дереве
npm overrides / pnpm.overrides         # принудительные версии транзитивных зависимостей

Разделы package.json: dependencies (прод), devDependencies (сборка/тесты), peerDependencies (ожидаемые версии у хоста, для библиотек), optionalDependencies, engines, scripts, sideEffects, exports, type.

Безопасность цепочки поставок: npm audit, Dependabot/Renovate, подтверждение обновлений тестами, минимальные права установочных скриптов (ignore-scripts), проверка новых пакетов (typosquatting), provenance, защита от dependency confusion (scoped-пакеты, приватный реестр).

Нюансы и подводные камни

  • npm install вместо npm ci в CI даёт невоспроизводимые сборки.
  • Смешивание менеджеров в одном проекте портит lock-файлы.
  • ^ для 0.x версий ведёт себя строже (^0.2.3 = >=0.2.3 <0.3.0).
  • Конфликты peer-зависимостей: --legacy-peer-deps — временный костыль.
  • Доверие к postinstall-скриптам сторонних пакетов — риск.

Практика

  1. Проверьте, что в CI используется npm ci/--frozen-lockfile и lock-файл закоммичен.
  2. Найдите причину появления пакета через npm why.
  3. Настройте Renovate/Dependabot с группировкой обновлений.

Вопросы с ответами

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