Что такое package.json в Node.js?

«Что такое package.json в Node.js?» — вопрос из категории Node.js Core, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Файл package.json — это фундаментальный манифест любого проекта Node.js. Он содержит метаданные о проекте и, что критически важно, управляет его зависимостями.

Основные разделы файла package.json:

  1. Идентификация проекта:

    • name: Уникальное имя пакета (для публикации в npm).
    • version: Текущая версия, следующая правилам семантического версионирования (SemVer) (MAJOR.MINOR.PATCH).
  2. Управление зависимостями:

    • dependencies: Пакеты, необходимые для работы приложения в production. Устанавливаются командой npm install <package>.
    • devDependencies: Пакеты, необходимые только во время разработки (линтеры, тест-раннеры, инструменты сборки). Устанавливаются с флагом --save-dev.
    • peerDependencies: Указывает, с какими версиями хост-пакетов (например, фреймворков) ваш пакет совместим.
  3. Скрипты (Scripts):

    • scripts: Объект с пользовательскими командами, которые можно запускать через npm run <script-name>. Это основа автоматизации в Node.js.
  4. Прочее:

    • engines: Может ограничивать версии Node.js и npm, необходимые для проекта (например, "node": ">=18.0.0").
    • main: Точка входа в пакет (по умолчанию index.js).
    • type: Может быть "module" для использования нативных ES-модулей.

Пример package.json для типичного Express-приложения:

{
  "name": "my-express-api",
  "version": "1.0.0",
  "description": "A simple REST API",
  "main": "src/index.js",
  "type": "commonjs",
  "scripts": {
    "start": "node src/index.js",
    "dev": "nodemon src/index.js",
    "test": "jest",
    "lint": "eslint .",
    "lint:fix": "eslint . --fix"
  },
  "dependencies": {
    "express": "^4.18.2",
    "dotenv": "^16.3.1"
  },
  "devDependencies": {
    "nodemon": "^3.0.1",
    "jest": "^29.7.0",
    "eslint": "^8.56.0"
  },
  "engines": {
    "node": ">=18.0.0"
  }
}

Пояснения к символам версий:

  • ^4.18.2 (каретка): Разрешает обновления до следующей мажорной версии (т.е. любые 4.x.x, но не 5.0.0). Наиболее распространённый префикс.
  • ~4.18.2 (тильда): Разрешает только патч-обновления (т.е. 4.18.x).
  • 4.18.2 (точная версия): Фиксирует версию без возможности обновления.

Файл создаётся командой npm init и является отправной точкой для установки зависимостей (npm install), которая генерирует package-lock.json.