Чаму pnpm інсталюе быстрэй, чым npm: хранэнне, звязкі і строгая структура node_modules
PNPM працюе быстрэй за npm пад часы інсталляцыі завдзяк вікорыстанню хранэння з адрэсавамі, жорсткіх сяючых паўзакоў заместо копій, а таксама строгага структурування падметаў node_modules, якае адмовляецца ад дорогіх процэсаў перэносу коду.
Крыніцы: Why pnpm Is Faster Than npm
Пасля перыявароўкі рэпазітарыю з 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 ўваходзіць у чысло найпростыях спосабаў пакрашчэння як часу інсталляцыі, так і выкарыстання дыска.