Что такое package.json в 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.

Ответ 18+ 🔞

Слушай, а вот этот package.json — это, блядь, такая священная корова любого проекта на Node.js, понимаешь? Без него нихуя не работает, это типа паспорта и списка покупок в одном флаконе. Там всё про твой проект написано, и главное — чем он питается, то есть какие библиотеки тащит.

Ну смотри, что внутри обычно валяется:

  1. Кто ты такой?

    • name: Как тебя зовут, уникально, чтоб в npm не перепутали с каким-нибудь другим пиздопроектом.
    • version: Твоя текущая версия. Тут надо по семверу (SemVer) жить — БОЛЬШАЯ.СРЕДНЯЯ.ЗАПЛАТКА. Меняешь по делу, а не просто так, от скуки.
  2. На чём ты сидишь (зависимости):

    • dependencies: Это основные библиотеки, без которых твоё приложение в продакшене просто накроется медным тазом. Ставишь их обычным npm install.
    • devDependencies: А это уже для разработки — всякие линтеры, тесты, сборщики. Продакшену они нахуй не сдались. Ставишь с --save-dev.
    • peerDependencies: Хитрая жопа. Тут ты говоришь: "Слушай, я сам не поставлю, но я работаю ТОЛЬКО если у тебя уже есть вот такая-то версия React/Angular/Vue". Доверия ебать ноль к тем, кто это неправильно использует.
  3. Скрипты (Scripts):

    • scripts: Вот это, блядь, самое охуенное место! Тут ты пишешь свои команды, которые потом npm run <имя> запускаешь. Всю рутину туда засунуть можно — запуск, тесты, сборку. Автоматизация, ёпта!
  4. Разная хуйня:

    • engines: Можешь указать, на какой версии Node.js твоё творение должно работать. Типа "ребята, если у вас Node.js 12, то идите вы все нахуй, ставьте 18+".
    • main: Гланый файл, с которого всё начинается. Обычно index.js.
    • type: Если написать "module", то можно ES-модули использовать нативно. А то ёперный театр с require и import бывает.

Вот тебе живой пример, как для какого-нибудь API на 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.99.99 — ок, а 5.0.0 — уже ни хуя себе. Самый частый вариант.
  • ~4.18.2 (тильда): Только патч-версии. 4.18.99 — да, 4.19.0 — уже нет.
  • 4.18.2 (голая версия): Жёсткая фиксация. Никуда не двигаемся. Ставь и молись, чтобы багов не было.

Создаётся этот файл командой npm init — ответишь на вопросы, и готово. А потом, когда делаешь npm install, он читает этот файл, тащит все зависимости и ещё пиздопроебибный файл package-lock.json создаёт, где всё точно зафиксировано, чтобы у всех одинаково встало. Без него — пидарас шерстяной, а не разработчик.