Пошук уроків, статей та іншого контенту
Розділимо залежності застосунку й інструменти розробки та налаштуємо dependencies і devDependencies.
Node.js-застосунок зазвичай використовує два типи зовнішніх пакетів:
dependencies — пакети, потрібні застосунку під час виконання;
devDependencies — пакети, потрібні лише під час розробки, тестування або збирання.
Наприклад, вебсервер не зможе запуститися без express, тому express належить до dependencies. А nodemon, який автоматично перезапускає сервер після змін, потрібен лише розробнику.
Таке розділення важливе з кількох причин:
production-оточення не встановлює зайві інструменти;
зменшується розмір і час встановлення застосунку;
зрозуміло, що потрібно застосунку для роботи;
простіше налаштувати CI/CD та деплой.
dependenciesЗалежності виконання зберігаються в полі dependencies файлу package.json:
{
"dependencies": {
"express": "^5.1.0"
}
}Ці пакети потрібні безпосередньо під час запуску програми:
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
app.get("/", (req, res) => {
res.send("Сервер працює");
});
app.listen(port, () => {
console.log(`Сервер запущено на порту ${port}`);
});Встановити пакет як залежність застосунку можна командою:
npm install expressАбо скорочено:
npm i expressПісля виконання команди npm:
завантажить пакет у каталог node_modules;
додасть пакет до dependencies у package.json;
оновить файл package-lock.json.
У сучасних версіях npm прапорець --save зазвичай не потрібен:
npm install express --saveЦя команда також встановлює пакет у dependencies, але форма без --save є стандартною.
devDependenciesІнструменти, які не потрібні застосунку під час виконання, зберігаються в devDependencies:
{
"devDependencies": {
"nodemon": "^3.1.0"
}
}Встановити пакет як dev-залежність можна за допомогою прапорця -D або --save-dev:
npm install --save-dev nodemonСкорочений варіант:
npm install -D nodemonnodemon стежить за змінами у файлах і перезапускає Node.js-процес. Для production він не потрібен, тому його не слід додавати до dependencies.
До devDependencies зазвичай належать:
інструменти запуску в режимі розробки;
лінтери;
форматери;
тестові фреймворки;
інструменти збирання;
генератори та інші локальні утиліти.
Створимо простий Node.js-проєкт із сервером Express і режимом розробки через nodemon.
mkdir dependency-demo
cd dependency-demo
npm init -y
npm install express
npm install -D nodemon
mkdir srcПісля цього структура проєкту може мати такий вигляд:
dependency-demo/
├── node_modules/
├── src/
│ └── server.js
├── package-lock.json
└── package.jsonСтворимо файл src/server.js:
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
app.get("/", (req, res) => {
res.json({
message: "Сервер працює"
});
});
app.listen(port, () => {
console.log(`Сервер запущено на порту ${port}`);
});Додамо команди до package.json:
{
"name": "dependency-demo",
"version": "1.0.0",
"main": "src/server.js",
"scripts": {
"start": "node src/server.js",
"dev": "nodemon src/server.js"
},
"dependencies": {
"express": "^5.1.0"
},
"devDependencies": {
"nodemon": "^3.1.0"
}
}Точні версії у вашому package.json можуть відрізнятися. Їх встановлює актуальна на момент команди версія npm.
Запуск у звичайному режимі:
npm startЗапуск у режимі розробки:
npm run devУ двох випадках використовується express. Але під час npm run dev додатково використовується nodemon.
Якщо проєкт уже має package.json, усі залежності можна встановити командою:
npm installnpm прочитає поля:
dependencies;
devDependencies;
за потреби інші типи залежностей, наприклад optionalDependencies.
Після встановлення з’явиться каталог node_modules.
Каталог node_modules зазвичай не додають до системи контролю версій. У .gitignore достатньо вказати:
node_modules/Інші розробники або сервер зможуть відновити залежності з package.json і package-lock.json.
У production часто не потрібні devDependencies. Наприклад, серверу може бути потрібен express, але не потрібен nodemon.
Для встановлення лише залежностей виконання використовуйте:
npm install --omit=devЯкщо проєкт має package-lock.json, для відтворюваного встановлення краще використовувати:
npm ci --omit=devПрапорець --omit=dev означає: не встановлювати пакети з devDependencies.
Команда npm ci призначена для автоматизованих середовищ, зокрема CI/CD. Вона:
використовує точні версії з package-lock.json;
перед встановленням видаляє наявний node_modules;
не змінює package.json або lock-файл;
очікує, що package.json і package-lock.json узгоджені.
Для локальної розробки зазвичай використовують:
npm installДля чистого встановлення на сервері або в CI:
npm ci --omit=devpackage.json і package-lock.jsonpackage.json описує залежності проєкту на логічному рівні:
{
"dependencies": {
"express": "^5.1.0"
}
}Символ ^ дозволяє npm встановити сумісніші мінорні або patch-версії в межах відповідного major-релізу.
package-lock.json фіксує точні версії всіх встановлених пакетів, включно з транзитивними залежностями.
Наприклад, два розробники можуть мати однаковий запис у package.json, але lock-файл гарантує встановлення однакового дерева залежностей.
Файл package-lock.json слід зберігати в системі контролю версій разом із package.json.
Видалити залежність можна командою:
npm uninstall expressnpm видалить пакет:
із node_modules;
із відповідного поля package.json;
із package-lock.json.
Якщо пакет помилково встановили як звичайну залежність, його можна перенести:
npm uninstall nodemon
npm install -D nodemonЯкщо dev-інструмент помилково потрапив до dependencies, production-встановлення може містити зайві пакети. Якщо ж пакет виконання опинився в devDependencies, production-застосунок може не запуститися.
Пакет може залежати від інших пакетів. Такі пакети називаються транзитивними залежностями.
Наприклад, express має власні залежності. npm встановлює їх автоматично в node_modules, але вони не обов’язково мають бути безпосередньо перелічені у вашому package.json.
У package.json слід додавати пакет, який безпосередньо імпортує ваш код:
const express = require("express");У цьому випадку express має бути у ваших dependencies, навіть якщо він також встановлюється як залежність іншого пакета.
Не варто вручну додавати до package.json пакети, які ваш код не використовує безпосередньо, лише тому, що вони вже є в node_modules.
Поставте собі запитання: чи потрібен цей пакет, щоб запущений застосунок обробляв запити або виконував свою основну роботу?
Якщо так — це dependencies.
Приклади:
express → dependencies
pg → dependencies
jsonwebtoken → dependenciesЯкщо пакет потрібен для перевірки, тестування або зручної роботи розробника — це devDependencies.
Приклади:
nodemon → devDependencies
eslint → devDependencies
prettier → devDependenciesКласифікація залежить від конкретного використання. Один і той самий пакет у різних проєктах може мати різне призначення.
dependenciesКоманда:
npm install -D nodemonвідрізняється від:
npm install nodemonБез -D пакет потрапить до dependencies. Для інструментів розробки це створює зайві production-залежності.
Якщо код використовує пакет під час запуску:
const express = require("express");то express має бути в dependencies. Інакше після команди npm ci --omit=dev пакет не буде встановлений.
package-lock.json без причиниLock-файл потрібен для повторюваного встановлення однакових версій. Не слід видаляти його як спосіб вирішення кожної проблеми із залежностями.
node_modules до репозиторіюnode_modules може займати багато місця і залежить від операційної системи. До репозиторію додають маніфест і lock-файл, а самі пакети відновлюють через npm.
npm install замість npm ci у CInpm install може оновити lock-файл або встановити інші допустимі версії. У CI за наявності package-lock.json краще використовувати:
npm ciА для production без dev-залежностей:
npm ci --omit=devdependencies містить пакети, потрібні застосунку під час виконання.
devDependencies містить інструменти розробки, тестування та перевірки коду.
npm install package додає пакет до dependencies.
npm install -D package додає пакет до devDependencies.
package-lock.json фіксує точні версії всього дерева залежностей.
npm install встановлює звичайні та dev-залежності.
npm ci --omit=dev встановлює точні production-залежності без інструментів розробки.
Пакети, які безпосередньо імпортує застосунок, потрібно додавати до відповідного поля package.json.