Основное предназначение пакетов - удобный способ делиться общим кодом. Возьмем для примера библиотеку lodash, которая очень широко используется в JavaScript и добавляет много маленьких функций, решающих различные повседневные задачи. Посмотрите на список функций слева https://lodash.com/docs/4.17.11. Их там больше сотни! Ниже типичный пример использования:

// По общепринятому соглашению, lodash импортируется под именем _
import _ from 'lodash';

// capitalize делает первую букву заглавной
_.capitalize('hello'); // Hello

Как только мы добавили подобный код (с импортом кода из другой библиотеки, а не локального файла) в наш проект (или библиотеку), мы получили так называемую зависимость. Теперь наш проект зависит от пакета lodash. Обратите внимание на то, как написано слово lodash. Перед ним нет указания текущей директории ./, именно так NPM понимает, что это внешняя зависимость, а не файл, лежащий рядом.

Возникает закономерный вопрос, как начать использовать эту библиотеку в своем коде? Если мы попытаемся импортировать ее как в примере выше, то получим закономерную ошибку о том, что пакет не найден. Во время запуска кода, все что импортируется, должно быть установлено локально в директорию node_modules лежащую в корне проекта. Делается это уже знакомой нам командой npm install, но в этот раз без флага глобальной установки. Для добавления пакета lodash, перейдите в корневую директорию того пакета, который вы разрабатываете и выполните следующую команду:

# Имя пакета всегда совпадает с именем, которое указывается в части импорта, идущей после from
# from 'lodash';
$ npm install lodash

После завершения установки, вы увидите что файл package.json изменился. В него добавилась секция dependencies с таким содержимым:

"dependencies": {
  "lodash": "^4.2.1"
}

Отличие от глобальной установки состоит в том, что здесь нет флага -g и не нужно использовать sudo. При таком подходе зависимости ставятся в директорию node_modules, находящуюся в корне проекта. Кроме того, NPM создаст файл package-lock.json рядом с файлом package.json. Этот файл должен храниться в репозитории, а его значение я объясню в следующем уроке.

Теперь NPM знает о том что ваш проект (он же пакет) зависит от lodash.

Кроме обычных зависимостей, NPM отдельно обрабатывает зависимости необходимые только во время разработки. К таким пакетам относятся тестовые фреймворки и тому подобные вещи. Их установка немного отличается:

npm install --save-dev jest

Флаг --save-dev приводит к тому что зависимость добавляется в секцию devDependencies файла package.json. Эти зависимости никак не используются при публикации пакета, что позволяет экономить память. В остальном механизм работы тот же: они скачиваются и сохраняются в директорию node_modules и импортируются внутри кода как и любой другой код.

"devDependencies": {
  "jest": "^23.6.0",
  "jest-cli": "^23.6.0"
}

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

Сами зависимости не хранятся в git-репозитории и должны быть добавлены в .gitignore:

// .gitignore
node_modules

Если вы клонировали репозиторий с гитхаба, директория node_modules будет отсутствовать, как и пакеты в ней. Первое, что нужно сделать в этом случае — выполнить команду npm install. Эта команда, запущенная без аргументов, выполняет установку тех пакетов, которые указаны в файле package.json. Она запускается в разных случаях: если вы удалили папку node_modules и хотите снова ее восстановить или если вы только что клонировали репозиторий. Установка пакетов — идемпотентная операция, поэтому ее можно запускать сколько угодно раз, не боясь что-либо сломать.

Самостоятельная работа:

  • Изучите зависимости в репозитории nodejs-package. Попробуйте найдите репозитории зависимых пакетов.

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

  1. Зависимости

Для продолжения нужно перейти в курс и вступить в него.