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

Зависимости делят на два вида — это важно для размера и безопасности продакшена:

dependenciesdevDependencies
нужны приложению в работенужны только при разработке
express, mongoose, axiosтесты, линтеры, сборщики
npm i expressnpm 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 — хранят, он фиксирует версии.
Проверьте себя
1. Какая команда создаёт package.json с настройками по умолчанию?
Anpm new
Bnpm init -y
Cnpm create
Dnpm start
2. Куда попадёт пакет, установленный с флагом -D?
Aв dependencies
Bв devDependencies
Cв node_modules, но не в package.json
Dв package-lock.json только
3. Какой файл фиксирует точные версии всех пакетов и хранится в git?
Anode_modules
Bpackage-lock.json
C.gitignore
DREADME.md
Поддержать проект