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

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

Время чтения: меньше 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 можно полностью восстановить все зависимости, обычно их не добавляют в репозиторий, и каждый разработчик должен устанавливать их самостоятельно.