Что такое package.json и его основные поля?
Что такое package.json
package.json — это манифест Node.js-проекта в формате JSON, который лежит в корне проекта. Он описывает метаданные пакета (имя, версию, автора), список зависимостей, скрипты для запуска задач и другие настройки, которые использует npm (или yarn/pnpm) для установки пакетов и работы с проектом.
Файл создаётся командой npm init (или npm init -y для значений по умолчанию) и обязателен для любого пакета, который публикуется в npm-реестр. Он полезен и для приложений, которые никуда не публикуются — как единая точка конфигурации проекта.
Основные поля
- name — имя пакета, уникальное в npm-реестре (нижний регистр, без пробелов)
- version — версия пакета по SemVer (major.minor.patch)
- description — краткое описание пакета
- main — точка входа (файл, который импортируется через
require('package')) - type — система модулей:
"commonjs"(по умолчанию) или"module"(ES-модули) - scripts — команды, запускаемые через
npm run <name>(напримерstart,test,build) - dependencies — зависимости, нужные приложению в продакшене
- devDependencies — зависимости только для разработки (линтеры, тестовые фреймворки, сборщики)
- peerDependencies — зависимости, которые должен предоставить сам потребитель пакета
- keywords — массив ключевых слов для поиска пакета в npm
- author и license — автор и лицензия
- repository — ссылка на репозиторий с исходным кодом
- engines — требования к версии Node.js/npm
- private — флаг
trueзащищает пакет от случайной публикации в npm
Версионирование зависимостей
В dependencies версии обычно указываются с префиксами:
^1.2.3— разрешает обновления minor и patch версий (1.x.x, но не 2.0.0)~1.2.3— разрешает только patch-обновления (1.2.x)1.2.3— жёстко фиксированная версия без обновлений
package.json vs package-lock.json
package.json описывает допустимые диапазоны версий зависимостей, а package-lock.json фиксирует точные версии всего дерева зависимостей (включая транзитивные), чтобы установка была детерминированной на разных машинах и в CI.
Зачем нужны scripts
Поле scripts позволяет описать любые команды проекта одним словом: npm run dev, npm test, npm run build. Это удобная точка входа для CI/CD и для новых разработчиков в команде — не нужно помнить длинные команды сборщиков или тестовых раннеров.
Что хочет услышать интервьюер
Понимание, что package.json — манифест проекта, а не просто список зависимостей
Знание ключевых полей: name, version, scripts, dependencies, devDependencies
Понимание разницы между dependencies и devDependencies
Знание разницы между package.json и package-lock.json
Понимание семантики версий SemVer и префиксов ^ и ~
Пример: Пример package.json
{
"name": "my-app",
"version": "1.0.0",
"description": "Пример приложения на Node.js",
"main": "index.js",
"type": "commonjs",
"private": true,
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest"
},
"dependencies": {
"express": "^4.19.2"
},
"devDependencies": {
"nodemon": "^3.1.0",
"jest": "^29.7.0"
},
"engines": {
"node": ">=18.0.0"
}
}
Типичные ошибки
Путают dependencies и devDependencies, кладут линтеры и тестовые фреймворки в dependencies
Не знают, что package-lock.json нужен для детерминированной установки версий
Считают, что main всегда указывает на index.js, не зная про поле exports/type
Не понимают разницы между ^ и ~ в версиях зависимостей
Забывают, что scripts можно использовать для любых команд, а не только start/test


