`npm install` instaluje paczki podane w packajge.json. Paczki tam podane mają swoje zależności, te paczki mają swoje zależności, a te paczki znowu mają swoje zależności itd... Kończymy instalację z wielkim node_modules w którym ściągnięte są wszystkie zależności do każdej zależności.
Problem polega na tym, że definiujemy tylko wersje głównych zależności, a zależności zależności instalują się za każdym razem "najnowsze". Gdy autorzy dowolnej paczki nie przestrzegają zasad semver zazwyczaj robi się spory bałagan na różnch środowiskach. Stąd powstał pomysł aby zapisać gdzieś dokładnie, jaką wersję ma każda zależność. W ten sposób każdy build byłby powtarzalny. Miejscem zapisu tych wersji jest package-lock.json i jest on generowany za każdym razem, gdy robimy npm install. Aby zainstalować zależności z package-lock.json należy wykonać komendę npm ci
npm ci służy głównie do Continous Delivery (gdzie powtarzalne buildy mają ogromne znacznie) oraz instalacji zależności gdy wchodzimy do projektu