Галоўная / Артыкулы / Чаму pnpm інсталюе быстрэй, чым npm: хранэнне, звязкі і строгая структура node_modules

Чаму pnpm інсталюе быстрэй, чым npm: хранэнне, звязкі і строгая структура node_modules

PNPM працюе быстрэй за npm пад часы інсталляцыі завдзяк викорыстанню хранэння з адресавамі, жорсткіх сяючых паўзакоў заместо копій, а таксама строгага структурування падметаў node_modules, якае адмовляецца ад дорогіх процэсаў переносу коду.

774 слоў

Пасля перыявароўкі рэпазітарыю з npm на pnpm час інсталяцыі часта розкішна зменшваецца. Гэтыя разліки — не выдумка. pnpm быў створаны, каб рашыць проблемы з выконваўчасцю та ахованнем пакетаў, якія існуюць у класычным npm, а такім чынам гэтыя два інструменты зберагаюць пакеты настолькі разна, што разліка ў скорасці ёсць архітектурным зменам, а не простым падкорэктаваннем.

У наступных раздзелах будуць расказаны прычыны, чаму pnpm часта вяліць, асабліва калі прыкладнікі та манорэпазітарыі стаюць большымі.

1. Храненне на адной базе дадзенаў заместо дублікатаў файлаў

Галоўная перадчыннае прыходзіць ад таго, як пакеты зберагаюцца на дыску. У npm кожны проект атрымвае свой саўстанні вёрх дрэвы ўсіх залежнасцей пад node_modules. Дзесять прыкладнікаў, якім усім патрэбны lodash, таму зберагаюць дзесять аднальных копій гэтага выпуску на дыску.

pnpm падтрымлівае адзін глобальны хранальнік з адресавамаемым контэнтам для машыны. Кожная версія займае там адзін слот; проект, якому ёна патрэбная, отрымае жорсткія звязки (או кансэкты типу copy-on-write) з гэтага хранальніка у свой локальны каталог node_modules. Наследкі гэтага включаюць:

  • Адзінаковыя завантажэння не адбываюцца, калі хранальнік вялікі ўжо мае тую версію
  • Перазапісвы байтов, якія вялікі ўжо існуюць на дыске, не адбываюцца
  • Займаецца значна меншы прастор, калі многі проекты дзеляцца бібліятэкамі

Паколькі процес інсталяцыі значна залежыць ад роботы з дыскам, самэўсуненне павтаральных перазапісваў ёсць тым фактарам, які значна зменшае час адпаведзення.

2. Жорсткія звязки і сімвалічныя звязки заместо копіювання

Шлях інсталяцыі npm копіюе файлы пакетаў у каталог node_modules. Копіюванне тыяў тысяч файлаў у глыбокай структуре є крыхкім з точкі зору ресурсаў.

pnpm вяртаецца да жорсткіх супакоў з глобальнага хранільня ў проект, а таксама да сімвалічных супакоў, якіе формуюць вялізную структуру так, каб яна паспаўляла графу залежнасцяў. Супак ў практыцы є безкоштовным у пораўнанні з копіяй: операцыйная система фіксуе ўтварэнне іншага выказчыка да тых сабе блакоў, замест таго каб іх дуплікацаваць.

3. Эфектыўнае кэшаванне між проектамі

npm таксама кэшуе завантажаныя файлы, але ён усё равно расширвае і копіюе з гэтага кэшу ў кожны проект. За моделлю хранільня pnpm, калі версія вядома гдзе-небудзь у апараты, яе перанесенне ў абсалютна новы проект вядзецца практычна мгновенна — без дадатковага завантажэння і з мінімумам дапаможных процесаў.

Такая працэса выдзеляецца, калі:

  • Пераходзіце межа веткаў, якія выкарыстоўваюць разныя наборы залежнасцяў
  • Адмаўляеце кілька рэпозітарыяў, якія дзеляцца спаканамі
  • Заўодзіце задачы CI, якія вярнююць спакан усіх проектаў пасля кожнага запуску

4. Структура node_modules, яка не ў формате плоскага списку і запобегае дадзейнам пераканалізавання

Старэйшыя версіі npm выкарыстоўвалі метод плоскага размешчэння элементаў node_modules, каб усунуць дублікацыі, але такая стратэгія мела свае недзеяння: трэба было выканаць значны час на пераканалізаванне, каб выявіць, дзе самэўказаны пакеты можа знаходзіцца без конфліктавання.

pnpm падтрымляе строгі, сяродзвязаны лейаут node_modules, таму пакет бачыць толькі тыя залежнасці, якія ён сам указаў (без випадковых непатрэбных імпортаў). Безпечнейша процедура пераканалізавання — не ўсё прычыны выгоды: прамова таксама ускаладжвае дорогі процес планавання перемешчэння элементаў у npm, чым зменшуе навантажэння на CPU пад час інсталяцыі.

5. Паралельныя аперацыі

pnpm, калі толькі можа, плануе выкананне крокаў пераканалізавання, запрашэння дадзеных і стварэння сяродзвязаў адночасна, чым перавышае швайнецкі падход npm. Якщо да гэтага дадаць аперацыі типу link-instead-of-copy, час выканання ўсё больш зменшыцца, особліва у сістэмах з вялічзююцыміся графамі залежнасцей.

6. Рэальныя наследкі глыбейце з розмерам проекта

У простай прыёмнай аплікацыі з калькам пакетаў разлік можа здавацца незначным. Адрозненне вырастае ў меру:

  • Monorepos, у якіх многі пакеты викорыстоўваюць тыя ж бібліятэкі
  • Команд, якія керуюць калькама продуктав на спакульнай залежнасці
  • CI/CD паіплайнаў, якія разам з кожным будаваннем паўтараюць установку
  • Вялікіх дрэва залежнасцей, характарных для сучасных фронтэнд-суперкомплектаў

У такіх умовах час установкі з храненнем і павязуванням, який ранейш за дапамогою npm займаў хвіліны, можа скорачыцца да секунд.

7. Эканамія прастору на дыску — гэта парадукт, а не проста бонус

Скорасць ёсць галоўным прынтам, але той жа дизайн рашае і проблему зберагчэння. Пакеты не клонуюцца для кожнага проекту, таму групы часта заўтрачаюць гігабайты. На медленнейшых дысках меншы об’ём дадзеных таксама спрыяе падвышэнню праўільнасці обробкі як дзяйніку.

Короткая аналагія

Уявіце npm як бібліятэку, якая фотакопіюе той самы твор для кожнага чытача. pnpm — это бібліятэка, дзе всі дзеляцца адной полкай, а кожны чытач отрымае закладку на спільную копію. Фотакопіюванне коштае часу і паперу; адсылка на вялікі твор заўсёды майже безкоштовна.

Вывасць

Перадоўга pnpm над npm — гэта не проста косметычны факт. Ён перэосмысляе зберагчэнне і павязання: утрымліваеся ад дублюючыхся завантажэнняў, вялікай працы з копіюванням і неабавесных дзеянняў з перамешчанням файлоў. Інсталяцыі — якія часта ёсць наймедленнейшым этапам у роботе з фронтэндам — стаюць быстрейшымі і простыяйшымі.

Для команд, які маюць кальколь праектаў або монорепозітарый, вжыванне pnpm ўваходзіць у число найпростыях спосабаў пакращэння як часу інсталляцыі, так і выкарыстання дыска.