Пошук уроків, статей та іншого контенту
Що таке npm, як влаштований package.json, семантичне версіонування та навіщо потрібен package-lock.json.
Практично жоден реальний проєкт не пишеться повністю з нуля — розробники повторно використовують готові, перевірені бібліотеки для типових задач (робота з датами, HTTP-запити, тестування). npm (Node Package Manager) — це і реєстр публічних пакетів JavaScript, і інструмент командного рядка для встановлення та керування ними у вашому проєкті.
Кожен Node.js/npm-проєкт має файл package.json у корені — він описує сам проєкт і всі бібліотеки, від яких він залежить:
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node index.js",
"test": "vitest"
},
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"vitest": "^2.0.0"
}
}dependencies — бібліотеки, потрібні застосунку під час реального виконання (наприклад, фреймворк, HTTP-клієнт).
devDependencies — інструменти, потрібні лише під час розробки (тестові фреймворки, лінтери, збирачі), які не потрапляють у продакшн-збірку.
npm install express # додає express у dependencies і встановлює його
npm install --save-dev vitest # додає у devDependencies
npm install # встановлює УСІ пакети, перелічені в package.jsonУсі встановлені пакети потрапляють у папку node_modules — її ніколи не редагують вручну і не додають у систему контролю версій (git), оскільки вона повністю відновлюється командою npm install із самого package.json.
Версії пакетів мають формат МАЖОРНА.МІНОРНА.ПАТЧ (наприклад, 4.18.2), і зміна кожної частини має конкретне значення:
Патч (4.18.2 → 4.18.3) — виправлення багів, без нових можливостей чи зламаної сумісності.
Мінорна (4.18.2 → 4.19.0) — нові можливості, зворотно сумісні зі старим кодом.
Мажорна (4.18.2 → 5.0.0) — можуть бути зламані зміни (breaking changes), код, написаний під стару версію, може не запрацювати без правок.
Символ ^ перед версією в package.json (^4.18.0) означає «дозволити оновлення в межах тієї самої мажорної версії» — тобто до будь-якої 4.x.x, але не до 5.0.0.
package.json дозволяє діапазон версій (^4.18.0), а бібліотеки самі залежать від інших бібліотек — без додаткової фіксації різні розробники команди могли б отримати трохи різні версії при кожному npm install. package-lock.json записує точні версії всього дерева залежностей, встановленого один раз, — і на відміну від node_modules, цей файл обов'язково додають у git, щоб уся команда й сервер розгортання гарантовано отримували ідентичні версії пакетів.
node_modules — у .gitignore (не комітиться), package-lock.json — навпаки, обов'язково комітиться. Плутанина цих двох файлів — поширена помилка серед новачків.
Секція scripts у package.json визначає іменовані команди, які запускаються через npm run <ім'я> (для start і test навіть без run):
npm start # запускає команду зі скрипту "start"
npm test # запускає команду зі скрипту "test"
npm run build # запускає команду зі скрипту "build"Ручне редагування файлів у node_modules — будь-яка зміна зникне при наступному npm install.
Додавання node_modules у git — папка може важити сотні мегабайтів і повністю відновлюється з package.json/package-lock.json.
Незакомічений package-lock.json — призводить до розбіжностей версій між середовищами розробників і продакшеном.
npm — реєстр і менеджер пакетів для JavaScript. package.json описує проєкт і декларує залежності (з допустимим діапазоном версій за семантичним версіонуванням), package-lock.json фіксує точні встановлені версії для відтворюваності, а node_modules — це похідна, відновлювана папка, яку не редагують вручну й не додають у git.
Спробуйте самостійно
Не запускаючи нічого, визначте: якщо в package.json вказано "lodash": "^4.17.0", чи дозволить це оновлення до версії 4.20.0? А до 5.0.0? Поясніть, спираючись на правила семантичного версіонування з цього уроку.