NPM
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, тем самым инициализировав проект в текущей папке.
Вам будет предложено ввести название проекта, версию, описание и т. д. Можно просто нажимать Enter до тех пор, пока не будет создан package.json и размещен в папке проекта.
Чтобы не нажимать Enter, пропуская пустые поля, используется команда init с флагом --yes. Флаг — дополнительная настройка для команды.
Будет создан package.json со значениями по умолчанию. Чтобы установить эти значения, в терминале последовательно выполните следующие команды, подставив свое имя и почту.

Можно редактировать файл package.json вручную или запустив npm init еще раз. Если открыть package.json в редакторе, он будет выглядеть примерно так. Это всего лишь метаданные о проекте.
4. NPM-скрипты
Скрипты позволяют запускать на исполнение установленные пакеты. Используя npm-скрипты, можно создавать целые системы сборки проекта.
Автоматизируем запуск index.js. Для этого в файле package.json в поле scripts добавим скрипт запуска start.
Теперь мы можем запустить его в терминале командой npm start.

Если создать скрипт с любым другим именем, кроме start или test, он будет запускаться как npm run имя-скрипта — не забудьте run.
How npm handles the "scripts" field
5. Установка пакетов
Одна из возможностей, которые предоставляет npm — установка пакетов, которые извлекаются из реестра и распаковываются в папку node_modules в корне проекта.
После того как файл package.json создан, можно добавить зависимости в проект. Зависимостью называют npm-пакет, который используется при разработке. Это всевозможные утилиты и библиотеки.
Установим библиотеку validator.js для валидации строк, например ввода пользователя в поля формы.
NPM загрузил validator и поместил его в node_modules — папку, в которой будут находиться все внешние зависимости.
Не добавляйте папку node_modules в систему контроля версий, у всех разработчиков она будет своя. Если вы используете Git, не забывайте добавить папку node_modules в файл .gitignore
Обратите внимание на созданный файл package-lock.json — это журнал снимков дерева зависимостей проекта. Он гарантирует, что команда разработчиков использует одни и те же версии зависимостей. NPM автоматически обновляет его при добавлении, удалении и обновлении пакетов.
В package.json появилась новая зависимость в поле dependencies. Это означает, что validator версии 11.1.0 был установлен как зависимость и готов к работе. Пакеты постоянно обновляются, версия может отличаться.
Для того чтобы получить интерфейс пакета в коде, необходимо вызвать функцию require('имя-модуля'), аргументом передав ей имя модуля без определения пути - это называется абсолютный импорт. Путь не нужен, так как по умолчанию поиск модуля будет происходить в папке node_modules. Результатом своего выполнения функция вернет интерфейс модуля — объект с методами или просто функцию, зависит от пакета.
Выполнив в консоли npm start получим.
6. Удаление пакетов
Предположим, что установленная в предыдущем примере версия validator вызывает проблемы с совместимостью. Мы можем удалить этот пакет и поставить более старую версию.
7. Установка определенной версии пакета
Теперь установим нужную версию validator. В команде установки номер версии указывается после символа @.
Установка пакетов определенный версии используется в коммерческих проектах для того, чтобы гарантировать работу кодовой базы и возможность долгосрочной поддержки.
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 вашего домашнего каталога.
Эта папка со временем засоряется старыми пакетами и иногда ее полезно очищать, не слишком часто (пару раз в год), кеширование полезно, так как сокращает время установки уже использованных пакетов.
11. Дополнительные материалы
Last updated