1. Введение
Чтобы использовать все богатство инструментов (или пакетов) Node.js нам нужна возможность устанавливать и управлять ими. Для этого создан NPM (node package manager) - пакетный менеджер Node.js. Он устанавливает нужные пакеты и предоставляет удобный интерфейс для работы с ними.
NPM состоит из трех основных компонентов:
- Сайт npmjs.com — используется для поиска и ознакомления с документацией пакетов.
- Интерфейс командной строки (CLI) — запускается из терминала и предоставляет набор команд для работы с реестром и пакетами. Позволяет создавать скрипты для запуска в терминале.
- Реестр пакетов (registry) — большая общедоступная база данных инструментов разработки (пакетов).
Пакет (package) — небольшая JS-библиотека, решающая специфическую задачу.
Пакеты пишут сами разработчики и делятся с сообществом. Такой подход упрощает жизнь, потому что не нужно изобретать колесо, все колеса уже давно лежат на полках реестра и готовы к использованию.
Пакеты абстрагируют реализацию функционала, предоставляя разработчику удобный интерфейс. Это делает код чище, читабельнее и позволяет легче его поддерживать.
2. Команды NPM
Сразу перечислим основные команды и будем последовательно использовать и рассматривать в деталях.
npm init— инициализируетnpmи создает файлpackage.jsonnpm install— устанавливает все зависимости перечисленные вpackage.jsonnpm list --depth=0- выведет в терминале список локально установленных пакетов с номерами их версий, без зависимостейnpm install [package-name]— установит пакет локально в папкуnode_modulesnpm uninstall [package-name]— удалит пакет, установленный локально и обновитpackage.jsonnpm startиnpm test— запустит скриптstartилиtest, расположенный вpackage.jsonnpm run [custom-script]— запустит кастомный скрипт, расположенный вpackage.jsonnpm outdated— используется для поиска обновлений, обнаружит совместимые версии программно и выведет список доступных обновленийnpm update— обновит все пакеты до максимально разрешенной версии
3. Инициализация проекта
Каждый проект начинается с создания файла package.json — он отслеживает
зависимости, содержит служебную информацию, позволяет писать npm-скрипты и
служит инструкцией при создании нового проекта на основе уже готовых настроек.
Создать файл package.json можно npm-командой init, тем самым инициализировав
проект в текущей папке.
npm init
Вам будет предложено ввести название проекта, версию, описание и т. д. Можно
просто нажимать Enter до тех пор, пока не будет создан package.json и
размещен в папке проекта.
Чтобы не нажимать Enter, пропуская пустые поля, используется команда init с
флагом --yes. Флаг — дополнительная настройка для команды.
npm init --yes
Будет создан package.json со значениями по умолчанию. Чтобы установить эти
значения, в терминале последовательно выполните следующие команды, подставив
свое имя и почту.
npm config set init.author.name "YOUR_NAME"
npm config set init.author.email "YOUR_EMAIL"

Можно редактировать файл package.json вручную или запустив npm init еще раз.
Если открыть package.json в редакторе, он будет выглядеть примерно так. Это
всего лишь метаданные о проекте.
{
"name": "node-tut",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Alexander Repeta <[email protected]>",
"license": "ISC",
"keywords": [],
"description": ""
}
4. NPM-скрипты
Скрипты позволяют запускать на исполнение установленные пакеты. Используя npm-скрипты, можно создавать целые системы сборки проекта.
Автоматизируем запуск index.js. Для этого в файле package.json в поле
scripts добавим скрипт запуска start.
{
"scripts": {
"start": "node index.js"
}
}
Теперь мы можем запустить его в терминале командой npm start.

Если создать скрипт с любым другим именем, кроме start
или test, он будет запускаться как npm run имя-скрипта — не забудьте
run.
How npm handles the "scripts" field
5. Установка пакетов
Одна из возможностей, которые предоставляет npm — установка пакетов, которые
извлекаются из реестра и распаковываются в папку node_modules в корне проекта.
После того как файл package.json создан, можно добавить зависимости в проект.
Зависимостью называют npm-пакет, который используется при разработке. Это
всевозможные утилиты и библиотеки.
Установим библиотеку validator.js для валидации строк, например ввода пользователя в поля формы.
npm install validator
NPM загрузил validator и поместил его в node_modules — папку, в которой
будут находиться все внешние зависимости.
Не добавляйте папку node_modules в систему контроля
версий, у всех разработчиков она будет своя. Если вы используете Git, не
забывайте добавить папку node_modules в файл .gitignore
Обратите внимание на созданный файл package-lock.json — это журнал снимков
дерева зависимостей проекта. Он гарантирует, что команда разработчиков
использует одни и те же версии зависимостей. NPM автоматически обновляет его при
добавлении, удалении и обновлении пакетов.
В package.json появилась новая зависимость в поле dependencies. Это
означает, что validator версии 11.1.0 был установлен как зависимость и готов
к работе. Пакеты постоянно обновляются, версия может отличаться.
{
"dependencies": {
"validator": "^11.1.0"
}
}
Для того чтобы получить интерфейс пакета в коде, необходимо вызвать функцию
require('имя-модуля'), аргументом передав ей имя модуля без определения пути -
это называется абсолютный импорт. Путь не нужен, так как по умолчанию поиск
модуля будет происходить в папке node_modules. Результатом своего выполнения
функция вернет интерфейс модуля — объект с методами или просто функцию, зависит
от пакета.
// index.js
const validator = require('validator');
const validateEmail = email => {
return validator.isEmail(email);
};
console.log(
'Is [email protected] a valid email?: ',
validateEmail('[email protected]'),
);
console.log(
'Is Mangozedog.com a valid email?: ',
validateEmail('Mangozedog.com'),
);
Выполнив в консоли npm start получим.
Is [email protected] a valid email?: true
Is Mangozedog.com a valid email?: false
6. Удаление пакетов
Предположим, что установленная в предыдущем примере версия validator вызывает
проблемы с совместимостью. Мы можем удалить этот пакет и поставить более старую
версию.
npm uninstall validator
7. Установка определенной версии пакета
Теперь установим нужную версию validator. В команде установки номер версии
указывается после символа @.
npm install [email protected]
Установка пакетов определенный версии используется в коммерческих проектах для того, чтобы гарантировать работу кодовой базы и возможность долгосрочной поддержки.
8. Типы зависимостей
Представьте торт, для его приготовления шефу нужны продукты, именно они войдут в состав торта. Но для приготовления понадобятся и инструменты вроде мисок, ложек, лопаток и т. п. А еще на кухне есть столы и печи, холодильники и т. д. - то, что используется для приготовления любого блюда, общие инструменты которые есть на кухне.
То же самое и с зависимостями проекта — некоторые будут использованы в результирующем продукте, другие необходимы только на стадии разработки, а есть такие, что необходимо использовать вне зависимости от проекта.
Именно для этого у команд npm install и npm uninstall существуют 3 флага.
--save— указывает, что добавляется зависимость, которая войдет в финальный продукт. Пакет будет установлен локально, в папкуnode_modulesи будет добавлена запись в полеdependenciesвpackage.json.--save-dev— указывает, что добавляется зависимость разработки. Пакет будет установлен локально, в папкуnode_modules, и будет добавлена запись в полеdevDependenciesвpackage.json.--global— указывает, что добавляется глобальная зависимость, то есть инструмент, который доступен для любого проекта. Пакет будет установлен глобально (в систему).
Если не указывать флаг, по умолчанию будет использован
--save.
9. Управление версиями пакетов
Пакеты имеют связанный с ними номер версии. Номера версий соответствуют стандарту SemVer.
npm outdated— используется для поиска обновлений, обнаружит совместимые версии программно.npm update— обновит все пакеты до максимально разрешенной версии.npm update [имя-пакета]- обновит указанный пакет
Если вы не доверяете машинам 🤖, можно открыть
package.json и вручную поменять версии пакетов, после чего выполнить
npm install.
10. Управление кэшем
После установки пакета npm сохраняет его копию в кэше, поэтому при следующей его
установке вам не нужно опять скачивать его из интернета. Кэш хранится в папке
.npm вашего домашнего каталога.
Эта папка со временем засоряется старыми пакетами и иногда ее полезно очищать, не слишком часто (пару раз в год), кеширование полезно, так как сокращает время установки уже использованных пакетов.
npm cache clean