Ответ
Файл package.json — это фундаментальный манифест любого проекта Node.js. Он содержит метаданные о проекте и, что критически важно, управляет его зависимостями.
Основные разделы файла package.json:
-
Идентификация проекта:
name: Уникальное имя пакета (для публикации в npm).version: Текущая версия, следующая правилам семантического версионирования (SemVer) (MAJOR.MINOR.PATCH).
-
Управление зависимостями:
dependencies: Пакеты, необходимые для работы приложения в production. Устанавливаются командойnpm install <package>.devDependencies: Пакеты, необходимые только во время разработки (линтеры, тест-раннеры, инструменты сборки). Устанавливаются с флагом--save-dev.peerDependencies: Указывает, с какими версиями хост-пакетов (например, фреймворков) ваш пакет совместим.
-
Скрипты (Scripts):
scripts: Объект с пользовательскими командами, которые можно запускать черезnpm run <script-name>. Это основа автоматизации в Node.js.
-
Прочее:
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, понимаешь? Без него нихуя не работает, это типа паспорта и списка покупок в одном флаконе. Там всё про твой проект написано, и главное — чем он питается, то есть какие библиотеки тащит.
Ну смотри, что внутри обычно валяется:
-
Кто ты такой?
name: Как тебя зовут, уникально, чтоб в npm не перепутали с каким-нибудь другим пиздопроектом.version: Твоя текущая версия. Тут надо по семверу (SemVer) жить —БОЛЬШАЯ.СРЕДНЯЯ.ЗАПЛАТКА. Меняешь по делу, а не просто так, от скуки.
-
На чём ты сидишь (зависимости):
dependencies: Это основные библиотеки, без которых твоё приложение в продакшене просто накроется медным тазом. Ставишь их обычнымnpm install.devDependencies: А это уже для разработки — всякие линтеры, тесты, сборщики. Продакшену они нахуй не сдались. Ставишь с--save-dev.peerDependencies: Хитрая жопа. Тут ты говоришь: "Слушай, я сам не поставлю, но я работаю ТОЛЬКО если у тебя уже есть вот такая-то версия React/Angular/Vue". Доверия ебать ноль к тем, кто это неправильно использует.
-
Скрипты (Scripts):
scripts: Вот это, блядь, самое охуенное место! Тут ты пишешь свои команды, которые потомnpm run <имя>запускаешь. Всю рутину туда засунуть можно — запуск, тесты, сборку. Автоматизация, ёпта!
-
Разная хуйня:
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 создаёт, где всё точно зафиксировано, чтобы у всех одинаково встало. Без него — пидарас шерстяной, а не разработчик.