Пакетные менеджеры

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

Время чтения: меньше 5 мин

Кратко

Секция статьи "Кратко"

Во многих приложениях есть однотипные задачи. Часто они уже решены, и это решение можно использовать в своём коде.

Например, многим программам нужно уметь форматировать даты. Когда мы будем писать новое приложение, то лучше взять готовую функцию форматирования дат, чем писать свою — писать своё решение дольше, его нужно тестировать и исправлять баги.

Кусочки кода, которые можно использовать в своём приложении, называют библиотеками или пакетами. Для удобной работы с ними существуют пакетные менеджеры (менеджеры зависимостей). Они помогают выбрать версию библиотеки и гарантируют безопасность.

В мире JavaScript есть три популярных менеджера зависимостей — npm, pnpm и Yarn. Они очень похожи по функциональности, но у каждого есть свои особенности.

npm — стандартный менеджер пакетов, поэтому будем смотреть на него.

Как пишется

Секция статьи "Как пишется"

Для работы с npm нужно установить Node.js.

npm хранит список установленных пакетов в файле package.json в корне проекта. Этот файл нужно создать командой:

        
          
          npm init
          npm init

        
        
          
        
      

После этого можно устанавливать библиотеки. Например, date-fns:

        
          
          npm install date-fns
          npm install date-fns

        
        
          
        
      

Установленные библиотеки можно использовать в своём коде. Если приложение предназначено для работы с Node.js, достаточно просто импортировать пакет в коде:

        
          
          // Этот код предназначен для Node.jsconst dateFns = require('date-fns')console.log(dateFns.format(new Date(), 'yyyy-MM-dd'))
          // Этот код предназначен для Node.js
const dateFns = require('date-fns')

console.log(dateFns.format(new Date(), 'yyyy-MM-dd'))

        
        
          
        
      

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

Как понять

Секция статьи "Как понять"

До появления пакетных менеджеров использование сторонних библиотек было сложным. Чтобы добавить такую библиотеку, нужно было найти сайт разработчика, перейти в раздел загрузок, скачать архив с библиотекой, распаковать и, наконец, скопировать к себе в проект. Кроме того, для обновления версий библиотек нужно было вновь пройтись по всем сайтам, понять, вышла ли новая версия библиотеки и что нового в ней появилось, и руками проделать заново весь путь копирования и подключения в проект. Ситуация усугублялась, когда одна библиотека использует код другой библиотеки, то есть «зависит» от неё. И здесь на помощь приходят менеджеры пакетов.

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

Лок-файл

Секция статьи "Лок-файл"

Как уже упоминалось, при установке и обновлении пакетов создаётся дерево зависимостей. Пакетный менеджер записывает его в специальный файл — лок-файл (от английского lock — зафиксировать). В этом файле содержатся абсолютно все установленные в проекте зависимости с их точными версиями. По этому файлу пакетный менеджер установит точь-в-точь те же пакеты, которые были на момент генерации лок-файла.

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

Разные пакетные менеджеры называют этот файл по-разному: в npm это package-lock.json, в pnpm это pnpm-lock.yaml а в Yarn — yarn.lock. Не рекомендуется использовать разные пакетные менеджеры в одном проекте — один пакетный менеджер может не понять другой лок-файл и установить другие версии библиотек, что может привести к ошибкам в вашем коде.

На практике

Секция статьи "На практике"

Игорь Камышев советует

Секция статьи "Игорь Камышев советует"

Зависимость — библиотека, которая необходима для работы приложения.

Зависимости для разработки

Секция статьи "Зависимости для разработки"

В JavaScript все зависимости делятся на dependency и devDependency.

Первая категория предназначена для использования библиотек во время работы приложения. Добавить такую зависимость можно командой:

        
          
          npm install lib_name
          npm install lib_name

        
        
          
        
      

А вторая категория зависимостей используется только при разработке приложения. Добавляют их командой:

        
          
          npm install lib_name --save-dev
          npm install lib_name --save-dev

        
        
          
        
      

Во вторую категорию обычно попадают библиотеки, которые полезны при разработке, но не нужны при работе программы. Например, системы сборки и статические анализаторы.

Хранение зависимостей

Секция статьи "Хранение зависимостей"

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