NPM

1. Введение

Чтобы использовать все богатство инструментов (или пакетов) Node.js нам нужна возможность устанавливать и управлять ими. Для этого создан NPM (node package manager) - пакетный менеджер Node.js. Он устанавливает нужные пакеты и предоставляет удобный интерфейс для работы с ними.

NPM состоит из трех основных компонентов:

  • Сайт npmjs.com — используется для поиска и ознакомления с документацией пакетов.

  • Интерфейс командной строки (CLI) — запускается из терминала и предоставляет набор команд для работы с реестром и пакетами. Позволяет создавать скрипты для запуска в терминале.

  • Реестр пакетов (registry) — большая общедоступная база данных инструментов разработки (пакетов).

Пакет (package) — небольшая JS-библиотека, решающая специфическую задачу.

Пакеты пишут сами разработчики и делятся с сообществом. Такой подход упрощает жизнь, потому что не нужно изобретать колесо, все колеса уже давно лежат на полках реестра и готовы к использованию.

2. Команды NPM

Сразу перечислим основные команды и будем последовательно использовать и рассматривать в деталях.

  • npm init — инициализирует npm и создает файл package.json

  • npm install — устанавливает все зависимости перечисленные в package.json

  • npm list --depth=0 - выведет в терминале список локально установленных пакетов с номерами их версий, без зависимостей

  • npm install [package-name] — установит пакет локально в папку node_modules

  • npm uninstall [package-name] — удалит пакет, установленный локально и обновит package.json

  • npm start и npm test — запустит скрипт start или test, расположенный в package.json

  • npm run [custom-script] — запустит кастомный скрипт, расположенный в package.json

  • npm outdated — используется для поиска обновлений, обнаружит совместимые версии программно и выведет список доступных обновлений

  • npm update — обновит все пакеты до максимально разрешенной версии

Документация NPM

3. Инициализация проекта

Каждый проект начинается с создания файла package.json — он отслеживает зависимости, содержит служебную информацию, позволяет писать npm-скрипты и служит инструкцией при создании нового проекта на основе уже готовых настроек.

Создать файл package.json можно npm-командой init, тем самым инициализировав проект в текущей папке.

npm init
Copy

Вам будет предложено ввести название проекта, версию, описание и т. д. Можно просто нажимать Enter до тех пор, пока не будет создан package.json и размещен в папке проекта.

Чтобы не нажимать Enter, пропуская пустые поля, используется команда init с флагом --yes. Флаг — дополнительная настройка для команды.

npm init --yes
Copy

Будет создан package.json со значениями по умолчанию. Чтобы установить эти значения, в терминале последовательно выполните следующие команды, подставив свое имя и почту.

npm config set init.author.name "YOUR_NAME"
npm config set init.author.email "YOUR_EMAIL"
Copy
npm init

Можно редактировать файл 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 <mycoolemail@mail.com>",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
Copy

4. NPM-скрипты

Скрипты позволяют запускать на исполнение установленные пакеты. Используя npm-скрипты, можно создавать целые системы сборки проекта.

Автоматизируем запуск index.js. Для этого в файле package.json в поле scripts добавим скрипт запуска start.

{
  "scripts": {
    "start": "node index.js"
  }
}
Copy

Теперь мы можем запустить его в терминале командой npm start.

script

How npm handles the "scripts" field

5. Установка пакетов

Одна из возможностей, которые предоставляет npm — установка пакетов, которые извлекаются из реестра и распаковываются в папку node_modules в корне проекта.

После того как файл package.json создан, можно добавить зависимости в проект. Зависимостью называют npm-пакет, который используется при разработке. Это всевозможные утилиты и библиотеки.

Установим библиотеку validator.js для валидации строк, например ввода пользователя в поля формы.

npm install validator
Copy

NPM загрузил validator и поместил его в node_modules — папку, в которой будут находиться все внешние зависимости.

Обратите внимание на созданный файл package-lock.json — это журнал снимков дерева зависимостей проекта. Он гарантирует, что команда разработчиков использует одни и те же версии зависимостей. NPM автоматически обновляет его при добавлении, удалении и обновлении пакетов.

В package.json появилась новая зависимость в поле dependencies. Это означает, что validator версии 11.1.0 был установлен как зависимость и готов к работе. Пакеты постоянно обновляются, версия может отличаться.

{
  "dependencies": {
    "validator": "^11.1.0"
  }
}
Copy

Для того чтобы получить интерфейс пакета в коде, необходимо вызвать функцию require('имя-модуля'), аргументом передав ей имя модуля без определения пути - это называется абсолютный импорт. Путь не нужен, так как по умолчанию поиск модуля будет происходить в папке node_modules. Результатом своего выполнения функция вернет интерфейс модуля — объект с методами или просто функцию, зависит от пакета.

// index.js
const validator = require('validator');

const validateEmail = email => {
  return validator.isEmail(email);
};

console.log(
  'Is mango@mail.com a valid email?: ',
  validateEmail('mango@mail.com'),
);

console.log(
  'Is Mangozedog.com a valid email?: ',
  validateEmail('Mangozedog.com'),
);
Copy

Выполнив в консоли npm start получим.

Is mango@mail.com a valid email?: true
Is Mangozedog.com a valid email?: false
Copy

6. Удаление пакетов

Предположим, что установленная в предыдущем примере версия validator вызывает проблемы с совместимостью. Мы можем удалить этот пакет и поставить более старую версию.

npm uninstall validator
Copy

7. Установка определенной версии пакета

Теперь установим нужную версию validator. В команде установки номер версии указывается после символа @.

npm install validator@1.0.0
Copy

Установка пакетов определенный версии используется в коммерческих проектах для того, чтобы гарантировать работу кодовой базы и возможность долгосрочной поддержки.

8. Типы зависимостей

Представьте торт, для его приготовления шефу нужны продукты, именно они войдут в состав торта. Но для приготовления понадобятся и инструменты вроде мисок, ложек, лопаток и т. п. А еще на кухне есть столы и печи, холодильники и т. д. - то, что используется для приготовления любого блюда, общие инструменты которые есть на кухне.

То же самое и с зависимостями проекта — некоторые будут использованы в результирующем продукте, другие необходимы только на стадии разработки, а есть такие, что необходимо использовать вне зависимости от проекта.

Именно для этого у команд npm install и npm uninstall существуют 3 флага.

  • --save — указывает, что добавляется зависимость, которая войдет в финальный продукт. Пакет будет установлен локально, в папку node_modules и будет добавлена запись в поле dependencies в package.json.

  • --save-dev — указывает, что добавляется зависимость разработки. Пакет будет установлен локально, в папку node_modules, и будет добавлена запись в поле devDependencies в package.json.

  • --global — указывает, что добавляется глобальная зависимость, то есть инструмент, который доступен для любого проекта. Пакет будет установлен глобально (в систему).

9. Управление версиями пакетов

Пакеты имеют связанный с ними номер версии. Номера версий соответствуют стандарту SemVer.

  • npm outdated — используется для поиска обновлений, обнаружит совместимые версии программно.

  • npm update — обновит все пакеты до максимально разрешенной версии.

  • npm update [имя-пакета] - обновит указанный пакет

10. Управление кэшем

После установки пакета npm сохраняет его копию в кэше, поэтому при следующей его установке вам не нужно опять скачивать его из интернета. Кэш хранится в папке .npm вашего домашнего каталога.

Эта папка со временем засоряется старыми пакетами и иногда ее полезно очищать, не слишком часто (пару раз в год), кеширование полезно, так как сокращает время установки уже использованных пакетов.

npm cache clean
Copy

11. Дополнительные материалы

Last updated