JavaScript-pakethanterare jämförde: garn, npm eller pnpm?

i modern applikationsutveckling skriver vi inte allt från början. Istället föredrar vi att använda befintliga open source-paket. Var och en av dessa paket har sina egna underhållare och gemenskap. Så att använda ett paket i våra projekt ger oss några fördelar som snabbare utveckling, tillgång till nya, regelbundna uppdateringar och bättre säkerhet än specialskapat skript.

det är vanligt att ett paket beror på att många andra paket fungerar korrekt. Lodash kan också bero på något som lodash, men lodash själv beror också på flera paket. Med andra ord kan de kapslade beroenden ibland bli så komplexa att de inte kan hantera beroendehantering manuellt.

Här är när en pakethanterare är extremt användbar. Pakethanterare är verktyg som automatiskt hanterar beroenden i ett projekt.

till exempel kan en pakethanterare installera nya — eller uppdatera befintliga — paket med ett enda kommando. Eftersom allt är automatiserat, så det finns ingen chans för mänskliga misstag. Som JavaScript-utvecklare har vi tillgång till flera pakethanterare. Men i den här guiden jämför vi de tre mest populära:

  • npm
  • garn
  • pnpm

översikt över pakethanterare

npm var den första pakethanteraren som introducerade begreppen registerprotokoll och förpackningsstandarder. Det släpptes tillbaka 2010 och antogs officiellt av noden.js team strax efteråt, vilket var vändpunkten för npm.

Efter den massiva framgången med Node.js, npm fick också dragkraft från utvecklarens samhälle. Det erbjuder ett online-register för JavaScript-paket samt ett kommandoradsverktyg som fungerar med registret för att installera och uppdatera beroenden.

men det finns få nackdelar med npm som utlöste utvecklingen av garn och pnpm. Till exempel är npm betydligt långsammare än dess motsvarigheter. Det har också en historia av allvarliga säkerhetsproblem.

så, stora teknikföretag som Facebook och Google tvekade att fortsätta använda npm. I sin tur gick de med för att utveckla en bättre version av npm och kalla det garn. Under tiden utvecklade den ukrainska utvecklaren Zoltan Kochan pnpm.

funktioner i npm, garn och pnpm

alla dessa pakethanterare är öppen källkod, vilket innebär att du har full tillgång till att kontrollera var och en av dem. Ibland är detta till och med ett krav på applikationsutveckling på företagsnivå.

fördelar med npm:

  1. genererar automatiskt enpackage-lock.json fil. Det är användbart att engagera sig i ett versionskontrollsystem. På så sätt kan andra utvecklare enkelt installera beroenden på sina lokala maskiner
  2. hantera lokala eller globala beroenden med lätthet
  3. npm är välutrustad för att hantera flera versioner av beroenden
  4. den har ett officiellt register som har fler paket än pypi, rubygems eller packagist

fördelar med garn:

  1. garn fixar många problem som visas i en Monorepo. Om du till exempel underhåller flera paket under samma arkiv och alla har en separat package.json – fil kan du enkelt uppdatera alla paket med garn tack vare konceptet arbetsytor som kan installera beroenden för alla paket i ett arkiv, allt på en gång. Med npm måste du köra kommandot npm install manuellt i varje paketmapp.
  2. garn använder sig av en offline cache-mekanism, vilket innebär att när du installerar ett paket för första gången lägger garn till det i en cachemapp under ~/.yarn-cache. Så nästa gång du behöver det här paketet kommer garn att hämta det från den lokala cachen istället för att göra en HTTP-begäran till servern. Denna lilla förbättring ökar signifikant garnets prestanda jämfört med npm
  3. garn använder också en låsfil som heter yarn.lock, så dina projekt fungerar korrekt för alla lagkamrater. Detta koncept kallas också en deterministisk installationsalgoritm
  4. den är packad med en inbyggd licenskontroll som kan vara praktisk i olika scenarier när du utvecklar applikationer
  5. till skillnad från npm använder garn ett tillvägagångssätt som kallas parallella nedladdningar. Det gör det möjligt för garn att utnyttja mer resurser för att påskynda byggprocessen
  6. Det kan automatiskt försöka HTTP-begäran om fel. Den här funktionen är särskilt användbar när du står inför tillfälliga internetproblem

fördelar med pnpm:

  1. den är kompatibel med npm men erbjuder också betydligt bättre diskutrymme och hastighet
  2. pnpm installerar alla paket på en enda plats och använder sedan symlinks för att referera till dem. Det introducerar ett helt nytt koncept som kallas ett innehållsadresserbart lagringssystem som gör det möjligt för pnpm att upptäcka skillnaden mellan filer. I sin tur duplicerar den inte oförändrade filer i två olika versioner av ett paket
  3. dess senaste version, 5.8.0, introducerar en ny garn-bash-liknande inställning som heter shell-emulator, en plattformsoberoende skalmiljö
  4. pnpm har en strikt åtkomstkontrollmekanism, vilket innebär att ett paket bara kan komma åt de beroenden som definieras i dess package.json file

Package manager jämförelse

användarvänlighet

npm, garn och pnpm erbjuder nästan identiska kommandon för sina olika operationer, och de är alla lätta att använda. Här är ett exempel på deras vanliga kommandon:

pnpm

npm garn
npm installera garn installera pnpm installera
npm uppdatering garn uppgradering pnpm uppdatering

hastighet

det finns ingen matchning till pnpm när det gäller hastighet och prestanda för dessa pakethanterare. Enligt ett riktmärke för olika användningsfall har pnpm visat prestandahastigheter upp till 3x snabbare än npm.

hastigheten på garn och npm är jämförbara. I vissa fall har garn en betydande fördel jämfört med npm, men det finns scenarier där npm är ett mer lämpligt val. Om vi till exempel utför en installationsoperation genom att bara använda node_modules och hoppa över cache och lock file funktionalitet, kan npm erbjuda 5x bättre hastighet. På samma sätt, om vi använder alla tre funktionerna, kan garn öka dess prestanda och blir 11x snabbare än npm.

säkerhet

den största fördelen med garn över npm är att det verifierar integriteten för varje paket med hjälp av kontrollsummor. Verifieringsprocessen görs innan du kör någon kod från paketet, så det kasserar eventuella risker för paketkapning sårbarhet.

å andra sidan är npm lite mer förlåtande när det gäller att arbeta med dåliga paket. Det utvecklas fortfarande för att erbjuda bästa praxis för säkerhet. Men, npm har i allmänhet ett dåligt rykte när det gäller säkerhet.

tidigare fanns det några säkerhetsproblem i npm som direkt påverkade många projekt. Till exempel, i npm version 5.7.0, när du kör sudo npm kommando på ett Linux-baserat operativsystem (OS), var det möjligt att ändra ägandet av systemfiler, vilket gör operativsystemet oanvändbart.

På samma sätt hände en annan incident att stjäla bitcoins 2018. I grund och botten den populära noden.JS-paketet EventStream lade till ett skadligt beroende flatmap-stream I sin version 3.3.6. Detta skadliga paket var packat med en krypterad nyttolast som försöker stjäla bitcoins från utvecklarens maskin.

pnpm kombinerar de positiva egenskaperna hos både npm och garn för att ge ännu bättre säkerhet. Det implementerar också en strikt åtkomstkontrollmekanism som binder ett paket för att bara använda sina egna beroenden som definieras i dess package.json – fil.

stabilitet

npm, garn och pnpm har gått igenom flera faser under de senaste åren. Med tiden har deras kodbas mognat eftersom de har fått massor av bidrag från öppen källkod.

och med tiden går nya begrepp och ideer fram som kan införa Brytande förändringar. När du skriver den här guiden är alla dessa pakethanterare i god form och du kan använda dem i dina projekt utan problem.

garn stöds av Facebook och Google, npm stöds av Microsoft och Node.js och pnpm utvecklas mestadels av en individ, även om det nu har 75+ bidragsgivare — så du kan lita på dessa pakethanterare för att skapa ditt nästa projekt.

stöd för monorepos

Monorepos föredras mestadels av stora teknikföretag att lagra och hantera sina massiva kodbaser. npm utformades endast för att hantera enskilda projekt. Från och med nu har den ingen funktionalitet för att stödja monorepos. Men både garn och pnpm har fullständigt stöd för monorepos tack vare deras koncept med arbetsytor.

Deterministic — låsfilen

alla tre pakethanterare är packade med låsfilens funktionalitet. Det gör att olika utvecklare kan installera exakt samma kopia av projektet. npm använder en package-lock.json fil, garn använder yarn.lock och pnpm använder pnpm-lock.yaml.

slutsats

om du letar efter en lösning som ger dig bättre hastighet och effektiv minnesanvändning, bör du starkt överväga att använda pnpm.

om du hanterar monorepos kan du använda pnpm eller garn för att göra det. Tänk dock på att garn skickar användningsdata till Facebook, vilket kanske inte gör garn till ett lämpligt val i vissa scenarier.

garn stöder inte heller Version 5 av Node.js. I detta avseende är npm ett föredraget alternativ för nod.js – baserade projekt eftersom det rekommenderas av noden.js team. Dessa dagar, Node.js levereras med npm som standard.

med npm bör du överväga dess historia med säkerhetsproblem, vilket utlöste utvecklingen av garn, som också skapades för att lösa många emittenter som var närvarande i npm. Så, om du är bekymrad över säkerheten för dina projekt, överväga att använda garn istället för npm.

LogRocket: felsöka JavaScript-fel lättare genom att förstå sammanhanget

Felsökningskod är alltid en tråkig uppgift. Men ju mer du förstår dina fel desto lättare är det att fixa dem.

LogRocket låter dig förstå dessa fel på nya och unika sätt. Vår frontend övervakningslösning spårar användarengagemang med JavaScript frontends för att ge dig möjlighet att ta reda på exakt vad användaren gjorde som ledde till ett fel.

LogRocket Dashboard Free Trial Banner

LogRocket registrerar konsolloggar, sidladdningstider, stacktraces, långsamma nätverksförfrågningar / svar med rubriker + kroppar, webbläsarmetadata och anpassade loggar. Att förstå effekten av din JavaScript-kod kommer aldrig att bli enklare!

prova det gratis.

Related Posts

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *