Как перенести проект JavaScript на pnpm (менеджер пакетов)

pnpm утверждает, что является «производительным менеджером пакетов для узлов». Он экономит дисковое пространство, сохраняя только одну копию версии пакета и используя жесткие ссылки для ссылок на пакет в проекте. Кроме того, это позволяет ему разрешать деревья зависимостей намного быстрее своих аналогов.

Итак, стоит ли переносить существующие проекты?

Стоит ли переносить существующие проекты?

Производительность заметно выше, чем у npm, и если вы будете использовать его постоянно, то будете использовать меньше дискового пространства.

Лично у меня слишком много проектов в системе, чтобы мигрировать их все. Если есть разумный способ автоматизировать этот процесс, я бы рассмотрел возможность сделать это более массово. Я мог бы выборочно перенести некоторые проекты, чтобы освободить место на диске.

Что касается публичных проектов, нужно ли заставлять пользователей использовать pnpm?

Я думаю, что по возможности нужно предоставить пользователям самим решать. В этом есть некоторые трудности, потому что вы должны включить файл блокировки, чтобы сделать установку более предсказуемым процессом для конкретного пакетного менеджера. Вы не собираетесь поддерживать несколько файлов блокировки.

Интерфейсы командной строки довольно схожи, поэтому у вас не возникнет сильной головной боли от переключения. Вам придется изучить различия. Например, чтобы добавить пакет для pnpm, нужно pnpm add <package>, тогда как для npm это npm install <package>.

Другой фактор, который следует учитывать — будет ли pnpm существовать в долгосрочной перспективе?

Это трудно предсказать! Это довольно популярный проект, с 18.6k звезд на GitHub. У него есть спонсоры. Я думаю, что будущее npm и yarn более гарантировано, потому что они хорошо финансируются. Это обычная проблема в JavaScript-стране! Я помню менеджер пакетов под названием tink, который был побит молью.

В чем разница между npm, yarn и pnpm?

Все они являются пакетными менеджерами, но отличаются подходами и набором функций. Хотя, похоже, со временем эти функции сближаются.

npm был разработан на заре Node.js и является менеджером пакетов по умолчанию в Node.js. npm был разработан на основе идеи семантического версионирования (semver). Зависимости проекта хранятся в package.json. npm устанавливает зависимости недетерминированным образом, что означает, что у двух разработчиков может быть разный каталог node_modules, что приводит к разному поведению.

Чтобы решить эти и другие проблемы, Facebook в 2016 году представил новый менеджер пакетов под названием Yarn . Yarn рекламировался как более быстрый, более безопасный и более надежный, чем npm. Yarn потребляет тот же package.json, что делает его более простым для миграции. Различия между npm и Yarn заключаются в следующем:

  1. Вы всегда знаете, что получаете одно и то же на каждой машине разработки,
  2. Yarn паралеллирует операции, чего не делает npm, и более эффективно использует сеть,
  3. Он может более эффективно использовать и другие системные ресурсы (например, оперативную память).

Однако npm значительно сократил разрыв. Начиная с версии 5, npm сделал следующее:

  • npm теперь генерирует «lockfile» под названием package-lock.json, который фиксирует все ваше дерево зависимостей точно так же, как это делает механизм блокировки yarn (или любой другой),
  • Улучшено использование сети и кэша.

Производительность Yarn все еще превосходит npm, но не так сильно во многих сценариях.

Основным мотивом создания pnpm была производительность. Он использует хранилище с адресацией содержимого для экономии дискового пространства и более быстрой установки.

Вот контрольные показатели производительности с сайта pnpm.io:

Вот наборы функций менеджеров пакетов:

Характеристика pnpm Yarn npm
Поддержка рабочего пространства ✔️ ✔️ ✔️
Изолированные node_modules ✔️
— По умолчанию
✔️
Поднятые node_modules ✔️ ✔️ ✔️
— По умолчанию
Автоустановка пиров ✔️
— Через auto-install-peers=true
✔️
Plug’n’Play ✔️ ✔️
— По умолчанию
Zero-Installs ✔️
Исправление зависимостей ✔️ ✔️
Управление версиями Node.js ✔️
Имеет lockfile ✔️
pnpm-lock.yaml
✔️
yarn.lock
✔️
package-lock.json.
Поддержка переопределений ✔️ ✔️
— Через разрешения
✔️
Хранилище с возможностью адресации содержимого ✔️
Динамическое выполнение пакетов ✔️
— Через pnpm dlx
✔️
— Через yarn dlx
✔️
— Через npx
Побочные эффекты кэша ✔️

Установка pnpm

Вы можете следовать инструкциям по установке на официальном сайте.

Я использовал их скрипт установки, как показано ниже:

 curl -fsSL https://get.pnpm.io/install.sh | sh -
==> Extracting pnpm binaries 7.6.0
Copying pnpm CLI from /tmp/tmp.iofxhAyyNc/pnpm to /home/rob/.local/share/pnpm/pnpm
No changes to the environment were made. Everything is already up-to-date.
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда все было готово, я не смог запустить pnpm как команду в командной строке, как ожидалось. Возникла проблема с конфигурацией оболочки Zsh. Я отправил сообщение об этом на GitHub.

Я исправил это сам, переместив файл pnpm в .local/bin:

mv /home/rob/.local/share/pnpm/pnpm /home/rob/.local/bin/pnpm
Вход в полноэкранный режим Выход из полноэкранного режима

Перенести проект

Важно! Необходимо помнить, что pnpm по умолчанию не использует поднятие зависимостей:

При установке зависимостей с помощью npm или Yarn Classic все пакеты поднимаются в корень каталога modules. В результате исходный код имеет доступ к зависимостям, которые не добавлены в проект как [прямые] зависимости.

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

источник: pnpm

Это означает, что если в package.json нет ссылки на зависимость, для которой в вашем коде есть require() или import, то она не будет разрешена. Это самое большое препятствие в миграции. Вы можете использовать настройку auto-install-peers, чтобы сделать это автоматически (по умолчанию отключена).

  1. Запустите pnpm import. Это сгенерирует pnpm-lock.yaml на основе файла блокировки npm/yarn в каталоге. Поддерживаемые файлы блокировки:
    • package-lock.json
    • npm-shrinkwrap.json
    • yarn.lock
  2. Очистите файлы:
    • Удалите папку node_modules в вашем проекте.
    • Удалите package-lock.json или yarn.lock.
  3. Запустите pnpm install (псевдоним pnpm i) для установки зависимостей в свежую папку node_modules.
  4. Если это монорепо, рабочее пространство должно иметь в корне файл pnpm-workspace.yaml. Вам потребуется перенести содержимое поля workspaces из вашего package.json.

    packages:
       - "apps/**"
       - 'packages/**'
    
  5. Необязательно: Если вы хотите убедиться, что pnpm должен использоваться с проектом, добавьте следующий скрипт в package.json:

    "scripts": {
      "preinstall": "npx only-allow pnpm", 
      ...
    }
    
  6. Необязательно: Вы можете заменить любое упоминание npm run на pnpm в разделе scripts в package.json. pnpm сам разберется, если вы этого не сделаете, так что это можно пропустить.

Оцените статью
devanswers.ru
Добавить комментарий