Что такое PNPM?

PNPM (Performant NPM) — это быстрый менеджер пакетов с эффективным использованием дискового пространства для узла в качестве замены NPM.

Кто использует PNPM?

  • Vue 3, SvelteKit, Prisma, Vite, Browserlist и другие.
  • Rush использует PNPM в качестве менеджера пакетов по умолчанию.
  • Он очень большой в экосистеме Vue (Vue 3, Vite и многие сайты и инструменты vue).
  • Широко используется Microsoft, ByteDance, Wix и другими компаниями.

Плюсы

Скорость и эффективность

  • Время установки заметно быстрее, иногда более чем на 50% быстрее, чем последний NPM!
  • После того, как вы установили пакет, он помещается в локальный кеш, поэтому в последующих других проектах на вашем компьютере или новых установках вашего проекта он будет извлекаться из локального, если он там есть, что снижает затраты на сеть по сравнению с NPM
    — И из-за символические ссылки, кеш и другие структурные различия, заметно меньший доступ к устройствам хранения и общий размер модулей node_modules на вашем компьютере.
  • Из-за неплоской структуры зависимости разрешаются из package.json параллельно и, таким образом, гораздо меньше блокируют.

CLI

  • Что наиболее важно, интерфейс командной строки почти идентичен интерфейсу NPM
    — поэтому, когда вы видите в документах использование npm, вы можете просто ввести pnpm.
  • Любой скрипт, определенный в разделе «Сценарии» package.json, можно вызвать, просто выполнив
    $ pnpm scriptName
    — это сделает $ pnpm run scriptName
    — это работает для любого скрипта, определенного, если имя не конфликтует с любыми специфическими командами PNPM, например. $ pnpm outdated
  • $ pnpm import
    — команда, которая берет файл блокировки package-lock, npm-shrinkwrap или yarn и создает действительный файл pnpm-lock.yaml. Это значительно упрощает миграцию!
  • Существует гораздо больше мелких вещей, таких как подразумеваемое использование exec, например, запуск сценария и другие способы сохранения символов, которые необходимо ввести.

Строгий и детерминированный

  • Неплоская папка node_modules помогает понять, насколько тяжелыми являются любые ваши явные зависимости из-за более древовидной структуры.
    — Эта структура также намного проще для понимания человеком.
  • NPM слишком свободен и имеет очень мало ограждений, что может затруднить отслеживание эзотерических проблем, связанных с зависимостями.
  • Структура и скорость PNPM зависят от того, является ли он более детерминированным и не допускает некоторого беспорядка, который допускает NPM. Таким образом, у кодовой базы, которая его использует, больше целостности.
    — Это в основном связано с плоской природой node_modules в NPM и другой стратегией разрешения одноранговых зависимостей.
  • Он устраняет проблему Phantom Dependency (отличный документ от команды Rush), поскольку не имеет плоской файловой структуры.

Безопасность

Вы можете использовать .pnpmfile.cjs, чтобы подключиться как к разрешению пакета, так и к мутации package.json в процессе установки.

  • Это может обеспечить более быстрый способ защиты от вредоносных пакетов, которые находятся на многих уровнях в дереве зависимостей.
  • Группы безопасности также могут создавать и поддерживать пакет, который подключается к ним и помогает предотвратить инциденты безопасности.

Минусы

Сложность

Немного сложнее то, что некоторые вещи, которые вы могли бы делать в NPM, невозможны в PNPM, например, использование фантомных зависимостей.

  • Это одновременно и недостаток, и преимущество PNPM, потому что фантомные зависимости, когда люди полностью их понимают, могут быть полезны, но имеют много подводных камней, а также усложняют статический анализ.

Также PNPM будет чаще «орать» на вас из-за таких вещей, как неустановка одноранговых зависимостей или несоответствие версий. И т. д. В этой строгости, как и в предыдущем, есть и плюсы, и минусы. Торговля!

Несовместимости

Некоторые несовместимости с пакетами, потому что они более строгие, а некоторые пакеты несовместимы из-за использования фантомных зависимостей или других проблем, из-за которых PNPM работает неправильно.

  • Есть некоторые команды PNPM cli, параметры конфигурации и т. д., которые помогают смягчить проблемные пакеты
    — но это также увеличивает стоимость сложности.
  • Эта проблема становится менее серьезной с течением времени, и пакеты разрабатываются для работы со структурой PNPM.
    — Сообщество для PNPM также очень активно и вносит свой вклад в другие пакеты, чтобы PNPM мог работать с ними.

Обеспокоенность

Хорошо ли он поддерживается и обслуживается?

Даже очень! Он хорошо финансируется и активно развивается со многими участниками.

Финансирование

Люди уже знакомы с npm, и в большинстве документов показано использование NPM

Это, конечно, верно, и именно поэтому PNPM спроектирован так, чтобы максимально приблизиться к замене NPM с точки зрения CLI и API. И со временем несовместимостей становится все меньше и больше.

Памятка по использованию PNPM

npm run serve:local = pnpm serve:local

npm install = pnpm install

npm outdated = pnpm outdated

npx eslint file_name = pnpm dlx eslint file_name

npm install eslint -D = pnpm add eslint -D

Сможет ли NPM наверстать упущенное?

Прошло более 7 лет с тех пор, как NPM перешел на свою структуру зависимостей Flat, а Node/NPM сейчас используются гораздо чаще, поэтому серьезные изменения, необходимые для того, чтобы победить PNPM, были бы слишком сложной задачей на данный момент.

  • Конечно, это все еще возможно, но если это когда-нибудь произойдет, миграция не будет самой сложной задачей, поскольку у нас будет очень чистое использование пакетов, позволяющее перейти на NPM или что-то еще проще.

Миграция требует времени

Конечно, серьезная проблема, но потраченное время определенно стоит того в долгосрочной перспективе для обеспечения производительности, безопасности и стабильности!

Почему не Yarn?

При обсуждении PNPM, конечно же, возникает вопрос, почему не Yarn? Это справедливый вопрос, поскольку это другая важная альтернатива NPM. Лучше всего рассматривать Yarn как 2 разных проекта: «классический» и «ягодный». Вроде как AngularJS против Angular 2+

Почему бы не Yarn Classic (1.x)

Он устарел и больше не поддерживается в пользу «ягоды».

  • Уже одно это делает его не стартовым в качестве опции.

Почему бы не пряжа «ягодка» (2.x+)

Сложность

  • Он не предназначен для замены NPM
    — это означает, что существует множество отличий интерфейса командной строки, API и конфигурации от NPM.
  • Может стать очень утомительным и сложным для правильной настройки с использованием пакетов в стиле «подключи и работай» (PnP)
    — PnP также требуется для обеспечения производительности, которая во многих случаях может конкурировать с последней версией PNPM.
  • Многие CLI и различные изменения требуют от вас изучения многих новых вещей, если вы используете Yarn 1.x или NPM.
    — Бремя производительности Yarn 2.x+ лежит как на авторах пакетов, так и на потребителях.

Машинопись

  • Пряжа написана в основном на TypeScript, но не так сильно, как на PNPM, что не обязательно имеет большое значение, но означает, что части, написанные на JS, более хрупкие и подвержены проблемам.
  • Использование языка по данным Github
    — Yarn — 78,5 % TS, 19,9 % Javascript, 1,6 % другое
    — PNPM — 99,3 % TS, 0,7 % другое

Сообщество

  • В Состоянии JS 2021 рабочие области Yarn ниже как рабочих областей NPM, так и PNPM для удовлетворенности инструментами Monorepo.
    — PNPM — 89%
    — рабочие области NPM — 84%
    — рабочие области Yarn — 80%

Гитхаб

  • PNPM
    — 17,6 тыс. звезд, 496 форков, 109 просмотров — 9 июня
    — 18,1 тыс. звезд, 510 форков, 113 просмотров — 7 июля
  • Yarn Berry
    — 5,2 тыс. звёзд, 785 форков, 58 просмотров — 9 июня
    — 5,3 тыс. звёзд, 804 форков, 60 просмотров — 7 июля

PNPM растет быстрее по звездам и по-прежнему имеет более чем в 3 раза больше ягод.

Теперь переносите все, над чем вы работаете, в PNPM ;)