Урок 24 из 49 · Месяц 3. JavaScript, часть 2
Пакетный менеджер npm и package.json
Содержание урока
- Что такое пакет и пакетный менеджер
- Создаём проект: npm init
- package.json — паспорт проекта
- Устанавливаем пакеты
- npm install
- Зависимости для разработки
- Основные команды npm
- Папка node_modules и package-lock.json
- node_modules
- package-lock.json
- Версии пакетов: что значит ^1.11.13
- Скрипты: npm run
- Собираем проект с Vite
- Шаг 1. Установка
- Шаг 2. Скрипты
- Шаг 3. Файлы проекта
- Шаг 4. Запуск
- Шаг 5. Сборка
- npx — запуск без установки
- Безопасность и здравый смысл
- Типичные ошибки
- Практика
- Итоги
Программисты редко пишут всё с нуля: для форматирования дат, красивых уведомлений или сборки проекта уже есть готовые библиотеки. В этом уроке познакомимся с npm — пакетным менеджером, который скачивает и обновляет такие библиотеки, разберём файл package.json — «паспорт» проекта, — и соберём первый проект с пакетами и сборщиком Vite.
Для работы нужен установленный Node.js — если вы ещё не поставили его, вернитесь к уроку про REST API и установку Node.js.
Что такое пакет и пакетный менеджер
Пакет (package, библиотека, зависимость) — это готовый код, который кто-то написал и опубликовал, чтобы другие могли им пользоваться. Например:
dayjs— работа с датами;lodash— полезные функции для массивов и объектов;vite— инструмент для запуска и сборки фронтенд-проектов;react— библиотека для интерфейсов, которую мы будем изучать в следующем месяце.
npm (Node Package Manager) — программа, которая:
- скачивает пакеты из общего хранилища — реестра npm (npmjs.com, там миллионы пакетов);
- запоминает, какие пакеты и каких версий нужны проекту;
- обновляет и удаляет их;
- запускает команды проекта (скрипты).
Аналогия — магазин приложений в телефоне. Вы не пишете калькулятор сами, а устанавливаете готовый одной кнопкой. npm — такой же «магазин», только для кода, и «кнопка» — это команда в терминале.
Создаём проект: npm init
Создайте папку и откройте её в терминале (в VS Code — меню Terminal → New Terminal):
mkdir my-first-npm
cd my-first-npm
npm init -y
npm initсоздаёт файлpackage.jsonи задаёт вопросы о проекте.- Флаг
-y(«yes») отвечает «да» на все вопросы и сразу создаёт файл с настройками по умолчанию.
Появится файл package.json.
package.json — паспорт проекта
Откройте package.json. После установки пакетов и небольшой настройки он будет выглядеть примерно так:
{
"name": "my-first-npm",
"version": "1.0.0",
"description": "Мой первый проект с npm",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"dayjs": "^1.11.13"
},
"devDependencies": {
"vite": "^7.1.0"
}
}
Разберём поля:
| Поле | Что значит |
|---|---|
name |
имя проекта: латиница, маленькие буквы, без пробелов |
version |
версия вашего проекта |
description |
короткое описание |
type |
"module" — файлы .js считаются ES-модулями, можно писать import/export |
scripts |
команды проекта, которые запускаются через npm run |
dependencies |
пакеты, нужные приложению для работы |
devDependencies |
пакеты, нужные только при разработке (сборщики, линтеры) |
Номера версий в вашем файле будут другими — npm всегда ставит актуальные.
Устанавливаем пакеты
npm install
npm install dayjs
Что произошло:
- npm скачал пакет
dayjsиз реестра. - Положил его в папку
node_modules/. - Добавил запись в раздел
dependenciesвpackage.json. - Создал (или обновил) файл
package-lock.json.
Короткая форма команды — npm i dayjs. Можно ставить несколько пакетов сразу: npm i dayjs lodash.
Зависимости для разработки
Инструменты, которые нужны только вам как разработчику, а не пользователю сайта, ставят с флагом -D (--save-dev):
npm install -D vite
Пакет попадёт в devDependencies. Например, Vite нужен, чтобы запускать и собирать проект, но в готовый сайт он не попадает.
Основные команды npm
| Команда | Что делает |
|---|---|
npm init -y |
создать package.json |
npm install (npm i) |
установить все зависимости из package.json |
npm i пакет |
установить пакет в dependencies |
npm i -D пакет |
установить пакет в devDependencies |
npm uninstall пакет |
удалить пакет |
npm update |
обновить пакеты в рамках разрешённых версий |
npm outdated |
показать, какие пакеты устарели |
npm run имя |
запустить скрипт из scripts |
npx команда |
запустить инструмент из пакета, не устанавливая его глобально |
Папка node_modules и package-lock.json
node_modules
В node_modules/ лежит код всех установленных пакетов — и их собственных зависимостей. Эта папка бывает огромной: сотни мегабайт и десятки тысяч файлов.
node_modules/
dist/
.env
Когда вы скачиваете чужой проект с GitHub (или свой на другом компьютере), папки node_modules там нет. Восстанавливается она одной командой:
npm install
package-lock.json
package-lock.json записывает точные версии всех установленных пакетов, включая вложенные. Благодаря ему у вас, у ментора и на сервере стоят одинаковые версии, и проект ведёт себя одинаково.
- Этот файл добавляют в Git.
- Руками его не редактируют — npm обновляет его сам.
Версии пакетов: что значит ^1.11.13
Версии пакетов записываются по правилам семантического версионирования (SemVer): МАЖОР.МИНОР.ПАТЧ.
1.11.13
│ │ └── ПАТЧ — исправили ошибки, ничего не сломали
│ └───── МИНОР — добавили новые возможности, старое работает
└──────── МАЖОР — большие изменения, старый код может сломаться
Символ перед версией говорит, какие обновления разрешены:
| Запись | Что разрешено | Пример |
|---|---|---|
^1.11.13 |
минорные и патч-обновления | 1.12.0 — да, 2.0.0 — нет |
~1.11.13 |
только патч-обновления | 1.11.20 — да, 1.12.0 — нет |
1.11.13 |
ровно эта версия | только 1.11.13 |
По умолчанию npm ставит ^ — это разумный компромисс между свежестью и стабильностью.
Скрипты: npm run
В разделе scripts хранятся команды проекта. Их запускают так:
npm run dev
npm run build
Зачем это нужно: вместо того чтобы помнить длинные команды, все в команде пишут одинаково npm run dev. Открыв любой проект, первым делом загляните в scripts — там видно, как его запускать.
Для скриптов start и test слово run можно опустить: npm start, npm test.
Собираем проект с Vite
Соединим всё вместе: страница, которая показывает дату через пакет dayjs и запускается через Vite.
Шаг 1. Установка
npm i dayjs
npm i -D vite
Шаг 2. Скрипты
Добавьте в package.json раздел scripts (и поле "type": "module"), как в примере выше.
Шаг 3. Файлы проекта
<!-- index.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>npm + Vite</title>
</head>
<body>
<h1 id="today"></h1>
<p id="deadline"></p>
<script type="module" src="/main.js"></script>
</body>
</html>
// main.js
import dayjs from "dayjs";
import "dayjs/locale/ru";
dayjs.locale("ru");
const today = dayjs();
document.querySelector("#today").textContent = today.format("D MMMM YYYY, dddd");
const deadline = today.add(30, "day");
document.querySelector("#deadline").textContent =
`Проект нужно сдать до ${deadline.format("D MMMM")}`;
Разбор:
import dayjs from "dayjs"— подключаем пакет по имени, без пути к файлу. Найти его вnode_modulesпоможет Vite.import "dayjs/locale/ru"— подключаем русский язык для названий месяцев и дней.today.format(...)— форматирует дату по шаблону;add(30, "day")— прибавляет 30 дней.type="module"в тегеscriptразрешает использоватьimport.
Шаг 4. Запуск
npm run dev
В терминале появится адрес вида http://localhost:5173. Откройте его — вы увидите сегодняшнюю дату по-русски. Vite следит за файлами: сохраните изменения в main.js, и страница обновится сама. Остановить сервер — Ctrl+C.
Шаг 5. Сборка
npm run build
Vite соберёт готовый к публикации сайт в папку dist/: склеит и сожмёт файлы, подключит код из пакетов. Именно содержимое dist/ выкладывают на хостинг — об этом в уроке про презентацию проектов. Посмотреть собранную версию локально можно через npm run preview.
npx — запуск без установки
npx запускает программу из npm-пакета, не устанавливая её навсегда:
npx cowsay "Привет, npm!"
npm скачает пакет во временную папку, выполнит его и всё. Так удобно запускать генераторы проектов и одноразовые утилиты.
Безопасность и здравый смысл
Типичные ошибки
npm ERR! enoent ... package.json— команда запущена не в той папке. Проверьте, что терминал открыт в корне проекта, где лежитpackage.json.Failed to resolve import "dayjs"— пакет не установлен. Выполнитеnpm install.Cannot use import statement outside a module— забылиtype="module"уscriptили"type": "module"вpackage.jsonдля Node.js.node_modulesв репозитории — забыли.gitignore.- Ставили пакет глобально (
npm i -g) вместо локального. Почти всегда пакеты ставят в проект.
Документация: docs.npmjs.com, Vite: начало работы.
Практика
- Первый package.json. Создайте папку, выполните
npm init -y, откройтеpackage.jsonи поменяйтеdescriptionна описание своего проекта. Добавьте поле"type": "module". - Установка и удаление. Установите
lodash, убедитесь, что он появился вdependenciesи вnode_modules. Затем удалите его командойnpm uninstall lodashи проверьте, что запись исчезла. - Восстановление. Удалите папку
node_modulesцеликом и выполнитеnpm install. Убедитесь, что всё вернулось. Создайте.gitignoreсnode_modules/. - Свой скрипт. Создайте файл
hello.jsсconsole.logи добавьте вscriptsкоманду"hello": "node hello.js". Запустите её черезnpm run hello. - Проект с Vite. Повторите проект из урока: Vite +
dayjs. Добавьте на страницу строку «До Нового года осталось N дней» (подсказка:dayjs("2027-01-01").diff(dayjs(), "day")). Соберите проект черезnpm run buildи найдите результат в папкеdist.
Итоги
- npm — пакетный менеджер: скачивает библиотеки из реестра и следит за их версиями.
package.json— паспорт проекта: имя, скрипты,dependenciesиdevDependencies.npm i пакет— для приложения,npm i -D пакет— для разработки.node_modulesне коммитим, восстанавливаем черезnpm install;package-lock.jsonкоммитим.- Версии — по SemVer
МАЖОР.МИНОР.ПАТЧ,^разрешает минорные обновления. - Команды проекта живут в
scriptsи запускаются черезnpm run имя.