Галоўная / Артыкулы / npm протып pnpm: Порэванаўленне хранення, скорасці і практычных наследкаваў

npm протып pnpm: Порэванаўленне хранення, скорасці і практычных наследкаваў

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

2380 слоў

Якщо вы витрачалі час на стварэнне проектаў з аднойчы React, Next.js, Node.js чы проста будь-якай сучаснай базай коду на JavaScript, то, шанцы великі, вы пісалі гэтыя команды больш разоў, ніж можаце памеркнуць:

npm install

Ён проста работае. Усі яго ведаюць. Практычна кожны онлайн-туторіяль на яго спынаецца.

А потым, зрэшты, хтось кажа вам ўдзецо такое:

"Чаму вы ўсё яшчэ вжываеце npm? Проста вжывайце pnpm."

Тады вы пробуеце pnpm.

І незабоў жа пачынаеце спытвалі сябе:

Чы пnpm дзейсна ўдосконаленне, чы гэта проста ўсё тая ж дыскусія пра інструменты JavaScript, якая згасне за калькі месцацоў?

Гэта справядлівы вопыт.

NPM або які-небудзь іншы інструмент ніяк не зламаны. Ён звычны, надзеяны і ўключаецца автаматычна з Node.js. Ёго адміністрацыя выклікае патрэбу ў рэальных праблемах.

Калі вы розберетеся, як фактычна працюе кожны з інструментаў, вы разумееце, што справжня прычына не ў тым проста npm versus pnpm.

Усё зводзіцца да таго, як вони керуюць залежнасцямі, сколькі дысковага прастору вони займаюць, як адбываецца інсталляцыя пад разнымі умовамі, а таксама до таго, які тип проекту вы ствараеце.

І найважлівейшы вопыт:

Калькі з іх двух мае сэнс выкарыстоўваць?

npm і pnpm рашаюць тую ж самую основную проблему

Пачнём з чагось бясперашаннага.

І npm, і pnpm — это менеджеры пакетаў, створаныя для сэрэўысу Node.js.

Оба запошчаюць пакеты з реестру npm і выкарыстоўваюць тыя ж правілы package.json.

Сказаўм, ваш проект патрэбуе React. Вы можете яго інсталаваць за дапамогою npm:

npm install react

Але вы таксама можете выбраць pnpm:

pnpm add react

У будзь-якім случае React будзе інсталаваны.

Вы не перейшлі на абсалютна іншую экасистему JavaScript.

Тое, што на самай працо зміняецца, — гэта тое, што відбываецца ўнутршна пасля таго, як пакеты ўстановлены і зберажаны на вашам комп’ютере.

Самэўсёлі тут дизайн pnpm пачынае выдзеляцца.

Дзе яны справа прыменшваюцца: як зберагаюцца залежнасці

Уявіце сабе, што на вашам комп’ютере знаходзяцца пяць аддзельных проектаў на JavaScript.

Кожны з іх завісіць ад React.

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

Якща такое прабавіце з многама проектамі, вы атрымаеце вельмі многа дублюючыхся файлоў, якія займаюць прастор.

pnpm выбірае іншы падход.

Ён зберагае пакеты ў адным хранілышчы з адресаваннем кантэнту, а пасля стварае звязкі з гэтага хранілышча да кожнага проекта, які іх патрэбуе.

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

Уявіце сабе так:

Project A ──┐
Project B ──┤
Project C ──┼── Shared package store
Project D ──┤
Project E ──┘

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

pnpm створаны для мінімізацыі зайвых копій.

А якщо вы адночасова працуе з калькама проектаў, такі падход можа значна зменшыць викорыстоўванне дыска.

Чы пnpm справды інсталюе рэшткі быстрей?

Гэта зазвычай перша рачунка, якую хочуць знать разработчыкі.

Чыстая адказ:

Часта — так, але не ў всіх случаях.

Больш заўсёды тэстаў паказваюць, што pnpm значна прыграе npm па швальнасці.

Але ёсць умова: швальнасць інсталляцыі залежыць ад вельмі большай колькасці фактараў.

Ваша супрацоўка з Інтэрнетам таксама мае значэнне.

Так сама як і апаратна частка вашага дыска.

Колькість пакетаў, на якіх залежыць ваш проект, таксама мае значэнне.

Тое, чыі этыя пакеты вже знаходзяцца у локальнай кэш-памяці, таксама важліва.

Размах проекта таксама вплывае на рэзультаты.

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

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

Самэ гэта є сценарыем, дзе яго прынадзі часта становяцца ўвесьма відчутнымі.

Холадныя установкі проты тэплых установакі — вельмі значны разлік

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

Спадзяймося, вы установляеце пакет першы раз.

У вас няма іншага выбору, кроме як завантажыць ўсё з нуля.

Это, по суты, сцэнарій пачатку роботы з чыстага стану.

Тепер уявіце, што той самы пакет вже знаходзится ў іншам проекте на вашай машыне.

Это зусім іншая вачэйка для роботы.

Самэлькі тут і прагучае значэнне спяльнага хранілня pnpm.

У працы замест таго, каб тратаваць кожны проект як абсалютна ізольаваную структуру, pnpm можа выкарыстоўваць пакеты, якія вже зберагліся локальна.

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

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

Самэлькі таму я бы утримаўся ад таких тверджэнняў:

«pnpm — гэта завжды быстрейшы варыянт.»

Болей точны выказванне будзе такім:

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

npm добра развіўся, перарадзіўшы свою колышню репутацыю

Є ўсё ж адна тэма, якую варта паведаміць.

У багатох дыскусіях пра npm і pnpm npm апісваецца як стары інструмент, ад каторага развіццёўцы ўжо давно должны былі адмовіцца.

Такое параджэнне на самай справе не ўсё такое точнае.

npm праехаў вялікі шлях.

Чырвоныя версіі падтрымліваюць такія функцыі, як працовыя прасторы, файлы блокавання і npm ci для стварэння воспамінаемых інсталяцыяў у пайплайнах CI.

Як прыклад:

npm ci

Его рэгулярна выкарыстоўваюць, калі хочаце чыстай інсталяцыі, керованай файлам блокавання.

Таму называць npm адзінаклым, застарэлым чы проста паспрацоўна спроектаваным не мае сэнсу.

Ён застаецца абсалютна надзейным выборам для вялікай часткі проектаў.

Тое, што выделяе pnpm, — гэта тое, што ён зробіў спецыяльныя рашэнні ў дизайне, спрямаваныя на эфектыўнасць, і гэтыя рашэнні становяцца ўсё бол пометнымі, калі ваш проект расте.

Іншая адраснасць, з якой сталкаюцца разработчыкі: ізоляцыя залежнасцей

Гэта не ўсё така зрозумела з першага погляду, асобліва якщо вы новачак у гэтым екасистеме.

Уявіце такую ситуацыю: ваша аплікацыя залежыць ад пакета A. Пакет A, у свою чаргу, залежыць ад пакета B. Вы самі ніколи не інсталавалі B — вы нават не заносілі яго ў свой сабскрипцыянт. Але заводзячыся з тым, як node_modules флэтенуецца, ваш код можа ўсё ж такі магчыма require чы import B безпосередна, і ён будзе працаваць.

Некалькі часоў нічога не здаецца некоректным.

Тады пакет A апдейтаваецца і заменяе своія залежнасці. Пакет B больш не знаходзится там, дзе ваш код яго чакаў, і раптам ваша аплікацыя выдае паказанню, якога вы не чакалі.

У такой ситуацыі ёсць назва: фантамная залежнасць. Вы пакладаецеся на ўсё тое, на што на самай працэ нельзя пакладацца.

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

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

Сцэнарый, дзе pnpm практычна выдзейнае: манорепазы

Гэта, верагчыма, найбольшая прычына для выбору pnpm.

Уявіце кодавую базу компаніі, структураваную прыблізна так:

my-project/
│
├── apps/
│   ├── web/
│   └── admin/
│
├── packages/
│   ├── ui/
│   ├── utils/
│   └── config/
│
└── package.json

Є калькі прыкладоў дапрацоўкаў і калькі спяльных внутрашняых пакетаў, якія всы разам знаходзяцца ў аднай базе дадзеных. Такую структуру люди называюць манорепо.

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

Якщо вы піклуецеся пра маленькі персональны проект, гэта ўсё не мае для вас значэння.

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

Пераход з npm на pnpm — гэта незначны крок

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

Аднак на самай працэ так не ёсць. Большасць повсякдзенных каманд адпавядае практычна одназначна.

Інсталяванне залежнасцяў за дапамогою npm выглядае так:

npm install

За дапамогою pnpm — так:

pnpm install

Дадаць пакет у npm:

npm install axios

у pnpm ператвараецца на гэта:

pnpm add axios

Дадаць dev-залежнасць у npm:

npm install -D typescript

стае:

pnpm add -D typescript

Анінсталяванне пакету у npm:

npm uninstall axios

стае:

pnpm remove axios

Запуск скрыпту у npm:

npm run dev

можа быць скорачаны да:

pnpm dev

Якщо вы вже знайомы з npx, у pnpm таксама ёсць свой эквівалент:

pnpm dlx

Таму практычна крывая навыкання тут мінімальная.

Случаі, калі npm заступаецца найбольш падходячым варыянтом

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

Якщо у навучальным матэрыяле працуецца з рэчымаю, каб запусціць:

npm install express

вы должны магчымае проста запісаць яе і продаважыцца да вивучэння самай сутнасці, якая выкладваецца.

NPM таксама є правым выборам, калі вы праходзіце через кодавую базу, якая вже побудована навакола яго. Немае сэнсу настаіць:

«Команда завжоды выкарыстоўвала npm, але тут вяршыць прадпрыёмство pnpm, таму давайце пераканвертуем усю наладку».

У команднай средзе важна дапамагаць адным стандартам, якія выкарыстоўваюць усе, а не оптымізаваць всё пад індывідуальныя прыязні».

Случаў, калі pnpm становіцца болей прыемным выборам

pnpm становіцца прыемнейшым выборам, калі проект або рабочы працэс вырастае за масштабамі».

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

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

Проста кажучы: чым больш і хаотычней становіцца настройкі JavaScript, тым более прываблівым стае pnpm.

Тады, калі ж выграе за швальнасцю?

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

Пры тым не будзе правдападобнае стверджваць на кшталт:

"pnpm працюе роўна ўдвое швэйчэй, чым npm."

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

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

Што я бы выбраў

Для маленькага проекту на React npm выпрацоўвае сваю роботу без жадных прыблуд.

То ж самае стосуецца і проекта для навучэння — npm падходзіць.

Якщо вы прыўяжаецеся да існуючага кодавога базы команды, вжывайце тое, што ўжо стандартызавана ў команде.

Але для вялікага монорепо pnpm становіць серйознага кандыдата.

Якщо вы працюўеце на апаратзе, дзе постаўляецеся між багатымі проектамі на JavaScript, то pnpm часта ўтварае болей практычны выбор.

Самэ гэтая прычына змушвае ствараць, што тут няма ўніверсальнага пераможця.

Не меняйце інструмент толькі таму, што pnpm ў модзе

Гэта можа быць найважлівейшым моментам у всім гэтым порэванні.

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

І вам абавязкова не трэба меняць інструмент таму, што хтось настаівае:

"npm мертвы."

Гэта не так. Оба інструмента актываўна падтрымваныя, у обох є зрэлыя екосістэмы, і оба абоўсюдзе падходяць для роботы з сучаснымі проектамі на JavaScript.

Асалідны вопыт не ў тым, «каторы менеджер пакетаў аб’ектываўна найкращы». Ён у тым, «каторы менеджер пакетаў падходзіць да майго рэальнага спосабу работы».

Якщо вы ствараеце маленькія прыемнікі, вучыце язык або працуеце ў командзе, якая вже выкорыстоўвае npm, то застацца з npm — гэта абсалютна разумны выбар.

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

Заключныя мыслі

Калі я пачынаў гэта супароўненне npm і pnpm, здавалася, што будзе чыстае, простае рашэнне — npm як застарелы варыянт і pnpm як быстрое апдэйтаванне.

Рэальнасць выявілася болей нюансаванай, чым гэта.

Асновная сіла npm — ў яго простасцы і тым, што майже всі восьмае ўжо знаюць яго. Ён ёсць стандартным варыянтом не без прычыны.

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

Таму, якщо вы новачак у JavaScript, не перадумвайцеся з прыемкай гэтага рашэння — проста вжывайце npm і пачніце ствараць.

Якщо вы вже добра разумеете Node.js, а вашы проекты растуць у масштабах, спробуйце pnpm і паказвайце, чы не павяршыць ён вашу повсякдзенную роботу.

У канцы канцоў, саме выбраны вам менеджер пакетаў не ёсць тым, што робіць прыемным прыеманне програмы.

Гэта робіць ваш код.

Спаднёе чытанне

  • Node.js Streams Beyond the Basics: Memory, Backpressure, and Real Failures — Дазвольце дазнацца, як стрымы Node.js взаімаюцца з Web Streams, як вырахоўваецца заўсёдышча памяці на адной прыкладзе, а таксама якія прычыны неудач у рэальных заданнях выклікаюцца толькі пад навантажэнням. —