← Назад к вопросам

Что указано в файле package-lock.json чего нет в package.json?

2.0 Middle🔥 171 комментариев
#Инструменты и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между package.json и package-lock.json

Основное назначение package.json — декларативное описание проекта: его метаданные, зависимости, скрипты. package-lock.json же является детализированной "картой зависимостей", автоматически генерируемой npm/yarn для фиксации точного состояния дерева зависимостей.

Ключевые данные, присутствующие ТОЛЬКО в package-lock.json:

1. Точные версии установленных пакетов

В package.json зависимости указываются с использованием семантического версионирования (^, ~, > и т.д.), что позволяет устанавливать совместимые версии. package-lock.json фиксирует конкретную версию, которая была фактически установлена.

// package.json
"dependencies": {
  "react": "^18.2.0"
}

// package-lock.json - конкретная версия
"react": {
  "version": "18.2.0",
  "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
  "integrity": "sha512-..."
}

2. Интеграционные хэши (integrity checksums)

Для каждой зависимости хранится SHA-512 хэш, позволяющий проверять целостность скачанных пакетов и гарантировать, что устанавливается именно тот файл, который ожидается.

"integrity": "sha512-6C1BfT2Zg6Lcj..."

3. URL-адреса источников (resolved URLs)

Указывается точный URL, откуда был загружен пакет, что важно для:

  • Воспроизводимости сборок
  • Работы с приватными реестрами
  • Кэширования зависимостей
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"

4. Полная структура дерева зависимостей

В package-lock.json отображается полная иерархия всех зависимостей, включая транзитивные (зависимости зависимостей), с указанием их точного расположения в node_modules.

"node_modules/react": {
  "version": "18.2.0",
  "dependencies": {
    "loose-envify": "^1.1.0"
  }
},
"node_modules/loose-envify": {
  "version": "1.4.0"
}

5. Флаги установленных пакетов

Информация о том, является ли пакет:

  • devDependency или production dependency
  • optionalDependency (опциональные зависимости)
  • bundledDependency (включенные в bundle)
"dev": true,
"optional": false,
"bundled": false

6. Информация о плоской установке (hoisting)

При использовании npm install --legacy-peer-deps или в определенных конфигурациях, package-lock.json отслеживает, какие пакеты были "подняты" в корневой node_modules.

Практическое значение этих различий

Воспроизводимость сборок: Без package-lock.json разные разработчики или CI/CD системы могут установить разные версии зависимостей, что приводит к проблемам "у меня работает".

Безопасность: Integrity checksums защищают от атак "подмены пакетов" в реестре npm.

Производительность: При наличии package-lock.json npm может использовать кэш более эффективно, так как знает точные версии и хэши.

Разрешение конфликтов: При наличии конфликтующих зависимостей, package-lock.json хранит информацию о том, какая конкретная версия была выбрана npm для разрешения конфликта.

Важное правило работы с этими файлами

package-lock.json никогда не следует редактировать вручную — это автоматически генерируемый файл. Он должен коммититься в систему контроля версий для обеспечения консистентности окружений. При изменении package.json (добавлении/удалении зависимостей) package-lock.json автоматически обновляется при выполнении npm install.

Эти два файла работают в тандеме: package.json определяет "что нам нужно", а package-lock.json фиксирует "что мы фактически получили", обеспечивая предсказуемость и стабильность проекта.