Пейджер

🌍 Привет мир! 👋

🌍 Привет мир! 👋

Каждый день сталкиваюсь с такими менеджерами пакетов как npm, yarn, но гораздо реже с pnpm. Если в проекте уже использовался pnpm, я просто гуглил команды и делал что нужно. Но что-то последнее время с каждого утюга слышится:
— Используй pnpm!
Он же такой крутой, быстрый, модный. Поэтому давайте разбираться в чем же крутость то?

🚀 Мотивация

Первое что я сделал, это зашел на State of JS, в котором совсем недавно были подведены итоги за 2️⃣0️⃣2️⃣4️⃣, где более 14 000 разработчиков приняли участие в опросе и поделились своим опытом. И посмотрев 👀 на статистку среди менеджеров пакетов, видно что PNPM явно обходит своих конкурентов.

Еще есть очень занятная статистика среди самых популярных менеджеров в официальной документации PNPM.

Ну что же, хватит мотивации, к делу!

👁️ Личные наблюдения

Решил потестить, для одного и того же проекта, пакеты ставились со скоростью 👇:

-------------------------------------
|        | with lock | without lock |
|--------|-----------|--------------|
| npm    |      11s  |       2m     |
| yarn   |      8s   |       86s    |
| pnpm   |      3.3s |       28s    |
-------------------------------------

🧠 Думаю комментарии будут лишними...

Какие проблемы могут возникнуть при использовании npm

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

node_modules
└─ express
   ├─ index.js
   ├─ package.json
└─ cookie
   ├─ index.js
   ├─ package.json


При использовании npm, каждый из проектов будет хранить зависимости в node_modules, и даже зависимости зависимостей будут лежать в корне node_modules (cookie это зависимость библиотеки express).

Из-за такого подхода есть явные минусы:

📌 съедается место на диске, так как каждый проект тянет все пакеты в node_modules.
📌 из-за того, что в корне node_modules находятся и зависимости зависимостей, есть вероятность заимпортировать пакет, который явно у вас в package.json не установлен.
📌 могут возникнуть проблемы при дублировании пакетов из-за Peer Dependencies. Не знали про Peer Dependencies? Cтавьте лайки ❤️, расскажу подробно.

В чем киллер фичи pnpm

📌 Система хранения пакетов: экономия дискового пространства и ускорение процесса установки. Реализуется за счет "hard links" and "symlinks"

📌 Эффективное использование дискового пространства: pnpm использует "hard links" и сохраняет каждую версию пакета в в глобал стор (global pnpm-store) на жестком диске (в кэше). Когда пакеты устанавливаются в проект, pnpm создает жесткую ссылку на эту копию, вместо того чтобы сохранять новый экземпляр в папке node_modules.

📌 Быстрая установка: За счёт того, что пакеты не копируются, а ссылаются на уже существующие в кэше, установка происходит быстрее, так как нет необходимости устанавливать уже существующие пакеты.

📌 Изоляция зависимостей: pnpm создает жесткую структуру node_modules, которая помогает избегать конфликтов зависимостей. Это позволяет каждому проекту иметь свои собственные зависимости без путаницы, которую может вызвать flattening дерева зависимостей в npm или yarn.

📌 Особенная структура: из-за особой структуры, исключается возможность импорта библиотеки, которая явна не указана в качестве зависимости в package.json.

Итог: как выглядит структура node_modules при использовании pnpm:

node_modules/
├── express -> .pnpm/express@4.17.1/node_modules/express
├── .pnpm/
│   ├── express@4.17.1/
│   │   └── node_modules/
│   │       ├── express/
│   │       │   ├── index.js
│   │       │   └── package.json
│   │       └── cookie@0.4.0/
│   │           ├── index.js
│   │           └── package.json
│   ├── cookie@0.4.0/
│   │   ├── index.js
│   │   └── package.json
│   └── ...


💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк! 👍

#CODINGTIPS
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram