Коротка відповідь
juniorpackage-lock.json — це файл, що зберігає точні версії залежностей, встановлених через npm. Він гарантує однакову структуру node_modules у всіх середовищах, запобігаючи різним версіям пакетів. При виконанні npm install файл читається і встановлює саме ті версії, що записані в ньому.
Повне пояснення
Що це і навіщо
- package-lock.json створюється автоматично при першому виконанні npm install. Він містить дерево залежностей з точними SHA‑1 хешами, що дозволяє відтворювати однозначну структуру node_modules.
Ключові принципи
- Deterministic installs: однаковий lock‑файл → однакова інсталяція.
- Security: зберігає конкретні версії, що допомагає уникнути небажаних оновлень.
- Performance: npm може пропустити перевірку метаданих, якщо lock‑файл актуальний.
Як це працює
- При npm install npm читає package.json, шукає відповідні версії у registry, а потім порівнює їх з package-lock.json. Якщо збігаються, npm просто копіює пакети; якщо ні – оновлює lock‑файл.
Практика й реалізація
- У проекті з package.json:
{
"name": "demo",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
}
}
Після npm install створюється package-lock.json, що виглядає так:
{
"name": "demo",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {"dependencies":{"express":"4.18.2"}},
"node_modules/express": {"version":"4.18.2", ...}
}
}
Тестування
- У CI можна перевірити, що package-lock.json не змінився:
git diff --exit-code package-lock.json.
Оптимізація запитів
- Не застосовується безпосередньо, але використання lock‑файлу зменшує час інсталяції через кешування.
Безпека
- Замість
npm install --save-devвикористовуйте--save-prod, щоб уникнути встановлення небажаних dev‑залежностей у продакшн.
Особливості в контексті DevOps
- CI/CD пайплайни часто включають
npm ci, що читає лише package-lock.json, пропускаючи пакетний менеджер і забезпечуючи швидку та відтворювану інсталяцію.
Часті помилки
- package-lock.json не синхронізовано з git → різні середовища отримують різні версії.
- Використання
npm install --no-package-lock→ lock‑файл не оновлюється. - Застарілий npm (≤5) → lock‑файл не підтримується.
Cheatsheet
npm install→ створює/оновлює package-lock.json.npm ci→ чиста інсталяція з використанням package-lock.json.git add package-lock.json→ важливо комітити його в репозиторій.