Перейти до основного вмісту

Пакетний менеджер npm

Щоб використовувати все різноманіття інструментів (або пакетів) Node.js, нам необхідна можливість встановлювати і керувати ними. Для цього створений NPM (node ​​package manager) - пакетний менеджер Node.js. Він встановлює потрібні пакети і забезпечує зручний інтерфейс для роботи з ними.

NPM складається з трьох основних компонентів:

  • Сайт npmjs.com - використовується для пошуку та ознайомлення з документацією пакетів.
  • Інтерфейс командного рядка (CLI) - запускається з терміналу і надає набір команд для роботи з реєстром і пакетами. Дозволяє створювати скрипти для запуску в терміналі.
  • Реєстр пакетів (registry) - велика загальнодоступна база даних інструментів розробки (пакетів).

Пакет (package) - невелика JavaScript бібліотека, що вирішує специфічне завдання. Пакети пишуть самі розробники і діляться зі спільнотою. Такий підхід спрощує життя, тому що не потрібно винаходити колесо, всі колеса вже давно лежать на полицях реєстру і готові до використання.

Цікаво

Пакети абстрагують реалізацію функціоналу, надаючи розробнику зручний інтерфейс. Це робить код чистішим, читабельнішим і дозволяє простіше його підтримувати.

Команди 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

Ініціалізація проекту

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

npm init

Вам буде запропоновано ввести назву проекту, версію, опис тощо. Можна просто натискати Enter доти, доки не буде створений package.json і розміщений в папці проекту. Щоб не натискати Enter, пропускаючи порожні поля, використовується команда init з прапорцем --yes. Прапорець - додаткове налаштування для команди.

npm init --yes
Цікаво

У кожного прапорця є псевдонім - його скорочений запис. Псевдонім прапорця --yes - -y, тому команди npm init --yes і npm init -y роблять одне і те ж.

Буде створено package.json зі значеннями за замовчуванням. Щоб встановити ці значення, виконайте в терміналі послідовно наступні команди, підставивши своє ім'я та пошту.

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

Файл package.json можна редагувати вручну або виконати npm init ще раз. Якщо відкрити package.json в редакторі, він буде виглядати приблизно так. Це всього лише метадані про проект.

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": ""
}

npm-скрипти

Скрипти дозволяють запускати для виконання встановлені пакети. Використовуючи npm-скрипти, можна створювати цілі системи збирання проекту. Автоматизуємо запуск index.js. Для цього у файлі package.json в полі scripts додамо скрипт запуску start.

package.json
{
"scripts": {
"start": "node index.js"
}
}

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

npm start
Увага

Якщо створити скрипт з будь-яким іншим ім'ям, крім start або test, він буде запускатися як npm run ім'я-скрипта - не забудьте run. Ознайомтесь з документацією - How npm handles the "scripts" field.

Встановлення пакетів

Одна з можливостей, які надає 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 був встановлений як залежність і готовий до роботи. Пакети постійно оновлюються, ваша версія може відрізнятися.

package.json
{
"dependencies": {
"validator": "^11.1.0"
}
}

Щоб отримати інтерфейс пакета в Node.js-коді, необхідно викликати функцію 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")
);

Виконавши в терміналі npm start, отримаємо.

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

Видалення пакетів

Припустимо, що версія validator, встановлена в попередньому прикладі, викликає проблеми з сумісністю. Ми можемо видалити цей пакет і поставити старішу версію.

npm uninstall validator

Встановлення певної версії пакета

Тепер встановимо потрібну версію validator. У команді встановлення номер версії вказується після символу @.

npm install validator@1.0.0
Цікаво

Встановлення пакетів певної версії використовується в комерційних проектах для того, щоб гарантувати роботу кодової бази і можливість довгострокової підтримки. Ви можете встановлювати найостанніші версії.

Типи залежностей

Уявіть торт. Для його приготування шефу потрібні продукти, саме вони увійдуть до складу торта. Але для приготування потрібні будуть також інструменти на зразок мисок, ложок, лопаток тощо. А ще на кухні є столи і печі, холодильники тощо - те, що використовується для приготування будь-якої страви, загальні інструменти, які є на кухні.

Те ж саме і з залежностями проекту - деякі будуть використані у фінальному продукті, інші необхідні тільки на стадії розробки, а є й такі, які необхідно використовувати, незалежно від проекту.

Саме для цього команди npm install і npm uninstall мають три прапорці.

  • --save - вказує, що додається залежність, яка увійде до фінального продукту. Пакет буде встановлений локально, в папку node_modules і буде доданий запис в поле dependencies в package.json.
  • --save-dev - вказує, що додається залежність розробки. Пакет буде встановлений локально в папку node_modules, і буде доданий запис в поле devDependencies в package.json.
  • --global - вказує, що додається глобальна залежність, тобто інструмент, який доступний для будь-якого проекту. Пакет буде встановлений глобально (в систему).
Цікаво
  • Якщо не вказувати прапорець, буде використаний --save за замовчуванням.
  • Видаляючи пакет, необхідно вказувати правильний прапорець, такий самий, що й для встановлення.
  • Не встановлюйте пакети глобально, якщо ви працюєте на проекті з іншими розробниками.

Управління версіями пакетів

Пакети мають пов'язаний з ними номер версії. Номери версій відповідають стандарту SemVer.

  • npm outdated - використовується для пошуку оновлень, виявить сумісні версії програмно.
  • npm update - оновить всі пакети до максимально дозволеної версії.
  • npm update [ім'я-пакета] - оновить зазначений пакет.
Цікаво

Якщо ви не довіряєте машинам або вам потрібна певна версія пакету, можна відкрити package.json і вручну поміняти версії пакетів, після чого виконати npm install.

Управління кешем

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

Ця папка з часом засмічується старими пакетами і її корисно іноді очищати, не дуже часто (декілька разів на рік). Кешування корисне, тому що скорочує час встановлення вже використаних пакетів.

npm cache clean