Файл package-lock.json (или yarn.lock в Yarn) содержит древовидную структуру зависимостей проекта. Его назначение — обеспечение воспроизводимости среды разработки.
При установке зависимостей, указанных в package.json, устанавливаются также их собственные зависимости и зависимости зависимостей (рекурсивно). package-lock.json хранит дерево всех установленных зависимостей с указанием их версий.
Проблемы без package-lock.json
Рассмотрим проект с зависимостью dependency A, версия которой указана как ^1.2.3 в package.json. Это означает, что допускаются минорные и патчные обновления.
Если на одном компьютере npm install установил версию 1.2.3 (последнюю на момент установки), а затем проект опубликован на GitHub без папки node_modules, то другой разработчик, клонировав репозиторий и выполнив npm install, может получить версию 1.3.3 (если она стала последней совместимой версией).
Результат: разные версии dependency A на разных компьютерах. Минорное обновление часто добавляет новые функции. Разработчик с более новой версией может использовать эти функции, что при слиянии изменений с проектом, использующим более старую версию, может привести к конфликтам.
Проблемы с зависимостями зависимостей
Даже если версия dependency A не изменилась, её зависимость dependency B могла обновиться с 2.0.0 до 2.1.0. Использование только package.json может привести к несоответствиям версий зависимостей, даже если dependency B не указана явно в package.json (она определяется через dependency A).
Решение: package-lock.json
package-lock.json решает эту проблему, содержа точные версии всех пакетов. После удаления node_modules и публикации проекта, все разработчики, клонирующие репозиторий и выполняющие npm install, установят одинаковые версии пакетов.
Задание
Далее приводится практическое задание для проверки понимания влияния обновления версий пакетов. Подробности будут представлены позже.