npm и package.json
Главный инструмент экосистемы: как устанавливать чужой код и описывать свой проект.
npm (Node Package Manager) — это менеджер пакетов: он устанавливает чужие библиотеки и хранит описание вашего проекта в файле
package.json.
package.json — паспорт проекта
Любой Node-проект начинается с файла package.json. В нём описаны имя, версия, зависимости и команды запуска. Создать его можно командой:
npm init -y
Флаг -y отвечает «да» на все вопросы и сразу создаёт файл с настройками по умолчанию. Выглядит он примерно так:
{
"name": "my-app",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {},
"devDependencies": {}
}
Установка пакетов
Чтобы добавить чужую библиотеку, используют npm install (коротко npm i). Пакет скачается в папку node_modules и запишется в package.json:
npm install express
После этого express появится в разделе dependencies, и его можно подключать через require("express").
dependencies против devDependencies
Зависимости делят на два вида — это важно для размера и безопасности продакшена:
| dependencies | devDependencies |
| нужны приложению в работе | нужны только при разработке |
| express, mongoose, axios | тесты, линтеры, сборщики |
npm i express | npm i -D jest |
Флаг -D (или --save-dev) кладёт пакет в devDependencies. На сервере в продакшене такие пакеты можно не устанавливать (npm install --omit=dev) — это экономит место.
node_modules и package-lock.json
После установки появляются две вещи:
- node_modules/ — папка со скачанным кодом пакетов и их зависимостей. Она большая, её НЕ хранят в git (добавляют в
.gitignore) — её всегда можно восстановить изpackage.json. - package-lock.json — фиксирует точные версии всех установленных пакетов вплоть до вложенных. Благодаря ему у всей команды и на сервере установится ровно то же самое. Этот файл, наоборот, хранят в git.
Чтобы по чужому проекту установить всё разом — достаточно package.json и команды:
npm install
Версии в semver
Версии пакетов записывают по схеме МАЖОР.МИНОР.ПАТЧ. Символ ^ перед версией разрешает обновления, не меняющие мажор:
"dependencies": {
"express": "^4.18.2"
}
^4.18.2 означает «любая 4.x.x не ниже 4.18.2». Логику сравнения версий легко представить на чистом JS:
function major(version) {
return Number(version.split(".")[0]);
}
console.log(major("4.18.2")); // 4
console.log(major("5.0.0")); // 5
console.log("Совместимы по мажору?", major("4.18.2") === major("4.20.0"));
Вывод:
4 5 Совместимы по мажору? true
Итог
npm init -yсоздаётpackage.json— паспорт проекта.npm install пакетскачивает библиотеку вnode_modulesи пишет в зависимости.dependenciesнужны в работе,devDependencies(-D) — только при разработке.node_modulesне хранят в git, аpackage-lock.json— хранят, он фиксирует версии.