← Назад к вопросам
Для чего нужен Package.json?
1.0 Junior🔥 301 комментариев
#JavaScript Core#Инструменты и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Для чего нужен Package.json
Package.json — это метаданные и конфигурация Node.js проекта. Это один из самых важных файлов в JavaScript/TypeScript экосистеме. Без него npm/yarn не может управлять зависимостями и скриптами проекта.
Основное назначение
Package.json описывает:
- Информацию о проекте (имя, версия, описание)
- Зависимости (dependencies и devDependencies)
- Scripts — команды для запуска проекта
- Конфигурацию инструментов (engines, browserslist, etc)
- Метаданные для публикации в npm (если это библиотека)
Структура package.json
{
"name": "my-app",
"version": "1.0.0",
"description": "A React application",
"main": "index.js",
"scripts": {
"dev": "vite",
"build": "vite build",
"test": "vitest",
"lint": "eslint src/"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.0.0",
"vite": "^4.0.0",
"eslint": "^8.0.0"
},
"engines": {
"node": ">=18.0.0"
},
"keywords": ["react", "app"],
"author": "John Doe",
"license": "MIT"
}
Основные разделы
1. Метаданные проекта
{
"name": "my-app", // Уникальное имя проекта
"version": "1.0.0", // Версия (семантическое версионирование)
"description": "Description",
"author": "John Doe",
"license": "MIT",
"homepage": "https://example.com",
"repository": {
"type": "git",
"url": "https://github.com/user/repo"
}
}
2. Scripts — команды для разработки
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"test": "jest --watch",
"test:ci": "jest --coverage",
"lint": "eslint . --fix",
"type-check": "tsc --noEmit"
}
}
Как использовать:
npm run dev # Запускает dev сервер
npm run build # Собирает проект
npm run test # Запускает тесты
npm run lint # Линтит код
Специальные скрипты (автоматические):
{
"pretest": "npm run lint", // Выполняется ДО npm test
"posttest": "npm run coverage", // Выполняется ПОСЛЕ npm test
"prepublish": "npm run build" // Выполняется перед публикацией
}
3. Dependencies vs DevDependencies
{
"dependencies": {
"react": "^18.0.0", // Нужно для production
"axios": "^1.0.0",
"lodash": "^4.17.0"
},
"devDependencies": {
"typescript": "^5.0.0", // Только для разработки
"@types/react": "^18.0.0",
"jest": "^29.0.0",
"eslint": "^8.0.0",
"prettier": "^3.0.0"
}
}
Разница:
- dependencies — библиотеки, которые нужны для работы приложения (bundle в production)
- devDependencies — инструменты разработки (не попадают в production bundle)
Установка:
npm install axios # Добавляет в dependencies
npm install --save-dev jest # Добавляет в devDependencies
npm install -D typescript # Короткая форма --save-dev
4. Версионирование пакетов
{
"dependencies": {
"react": "18.0.0", // Точная версия
"axios": "^1.4.0", // Минор и патч (1.x.x, совместимо)
"lodash": "~4.17.0", // Только патч (4.17.x)
"vue": "*", // Любая версия
"angular": ">=14.0.0", // 14.0.0 и выше
"svelte": ">=3.0.0 <5.0.0" // Диапазон версий
}
}
Semver (семантическое версионирование): MAJOR.MINOR.PATCH
- ^1.4.0 — можно 1.4.0, 1.5.0, но не 2.0.0 (^major)
- ~1.4.0 — можно 1.4.0, 1.4.1, но не 1.5.0 (~minor)
- 1.4.0 — ровно 1.4.0
5. Конфигурация инструментов
{
"engines": {
"node": ">=18.0.0", // Требуемая версия Node.js
"npm": ">=9.0.0"
},
"browserslist": [ // Для babel/postcss
"> 1%",
"last 2 versions"
],
"packageManager": "npm@9", // Рекомендуемый пакет-менеджер
"private": true, // Не публиковать на npm
"sideEffects": false // Для tree-shaking в webpack
}
6. Keywords и поиск
{
"keywords": [
"react",
"component",
"ui-library"
]
}
Используются для поиска на npm.js когда публикуешь пакет.
7. Точка входа
{
"main": "dist/index.js", // Для CommonJS
"module": "dist/index.esm.js", // Для ES modules
"types": "dist/index.d.ts", // TypeScript типы
"exports": {
".": {
"import": "./dist/index.esm.js",
"require": "./dist/index.js"
}
}
}
Практический пример: React приложение
{
"name": "my-react-app",
"version": "1.0.0",
"description": "A React application with TypeScript",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"test": "vitest run",
"test:watch": "vitest",
"lint": "eslint src --ext ts,tsx",
"type-check": "tsc --noEmit"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.0.0"
},
"devDependencies": {
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"typescript": "^5.0.0",
"vite": "^4.0.0",
"vitest": "^0.34.0",
"eslint": "^8.0.0",
"prettier": "^3.0.0"
},
"engines": {
"node": ">=18.0.0"
}
}
Что происходит при npm install
$ npm install
- Читает package.json — список зависимостей
- Скачивает пакеты с npm registry (https://registry.npmjs.org)
- Создаёт node_modules/ — папка со всеми пакетами
- Генерирует package-lock.json — точные версии установленных пакетов
- Устанавливает скрипты — в node_modules/.bin/
Зачем нужен package-lock.json
{
"dependencies": {
"react": "^18.0.0" // Может быть 18.0.0, 18.1.0, 18.2.0
}
}
package-lock.json гарантирует:
- Одинаковые версии у всех разработчиков
- Воспроизводимое состояние (reproducible builds)
- Безопасность (защита от неожиданных обновлений)
Вывод: Package.json — это контракт между разработчиком и npm. Это точка синхронизации для зависимостей, скриптов и конфигурации проекта. Без него современная JavaScript разработка невозможна.