i moderne applikationsudvikling skriver vi ikke alt fra bunden. I stedet foretrækker vi at bruge eksisterende open source-pakker. Hver af disse pakker har sine egne vedligeholdere og samfund. Så ved hjælp af en pakke i vores projekter giver os nogle fordele som hurtigere udvikling, adgang til nye, regelmæssige opdateringer og bedre sikkerhed end brugerdefineret script.
det er almindeligt, at en pakke afhænger af, at mange andre pakker fungerer korrekt. Lodash kan også afhænge af noget som lodash, men lodash selv afhænger også af flere pakker. Med andre ord kan de indlejrede afhængigheder undertiden blive så komplekse, at de ikke er i stand til at håndtere afhængighedsstyring manuelt.
Her er når en pakkehåndtering er yderst nyttig. Pakkeadministratorer er værktøjer, der automatisk håndterer afhængigheder af et projekt.
for eksempel kan en pakkehåndtering installere nye — eller opdatere eksisterende — pakker med en enkelt kommando. Fordi alt er automatiseret, så der er ingen chance for menneskelige fejl. Som JavaScript-udviklere har vi adgang til flere pakkeadministratorer. Men i denne vejledning sammenligner vi de tre mest populære:
- npm
- garn
- pnpm
- oversigt over pakkeadministratorer
- funktioner i npm, Yarn og pnpm
- fordele ved npm:
- fordele ved garn:
- fordele ved pnpm:
- sammenligning af pakkehåndtering
- brugervenlighed
- hastighed
- sikkerhed
- stabilitet
- støtte til monorepos
- deterministisk — låsefilen
- konklusion
- LogRocket: Debug JavaScript-fejl lettere ved at forstå konteksten
oversigt over pakkeadministratorer
npm var den første pakkeadministrator, der introducerede begreberne registerprotokol og emballagestandarder. Det blev frigivet tilbage i 2010 og officielt vedtaget af noden.js team kort efter, hvilket var vendepunktet for npm.
efter den massive succes af Node.js, npm modtog også trækkraft fra udviklerens samfund. Det tilbyder et online register for JavaScript-pakker samt et kommandolinjeværktøj, der fungerer sammen med registreringsdatabasen for at installere og opdatere afhængigheder.
men der er få ulemper ved npm, der udløste udviklingen af garn og pnpm. For eksempel er npm betydeligt langsommere end sine modparter. Det har også en historie med alvorlige sikkerhedssårbarheder.
så store tech-virksomheder som Facebook og Google tøvede med at fortsætte med at bruge npm. Til gengæld sluttede de sig til bestræbelserne på at udvikle en bedre version af npm og kalde det garn. I mellemtiden udviklede den ukrainske Udvikler Soltan Kochan pnpm.
funktioner i npm, Yarn og pnpm
alle disse pakkeadministratorer er open source, hvilket betyder, at du har fuld adgang til at kontrollere hver enkelt indre funktion. Nogle gange er dette endda et krav i applikationsudvikling på virksomhedsniveau.
fordele ved npm:
- genererer automatisk en
package-lock.json
fil. Det er nyttigt at forpligte sig til et versionsstyringssystem. På denne måde kan andre udviklere nemt installere afhængigheder på deres lokale maskiner - Administrer lokale eller globale afhængigheder med lethed
- npm er veludstyret til at håndtere flere versioner af afhængigheder
- det har et officielt register, der har flere pakker end pypi, rubygems eller packagist
fordele ved garn:
- garn løser mange problemer, der vises i en Monorepo. For eksempel, hvis du vedligeholder flere pakker under det samme lager, og de alle har en separat
package.json
fil, kan du nemt opdatere alle pakker med garn takket være dets koncept med arbejdsområder, der kan installere afhængigheder af alle pakker i et lager, alt sammen på en gang. Med npm skal du køre kommandoennpm install
manuelt inden for hver pakkemappe. - garn gør brug af en offline cache-mekanisme, hvilket betyder, at når du installerer en pakke for første gang, tilføjer Yarn den til en cache-mappe under
~/.yarn-cache
. Så næste gang du har brug for denne pakke, vil Yarn hente den fra den lokale cache i stedet for at lave en HTTP-anmodning til serveren. Denne lille forbedring øger garnets ydeevne betydeligt sammenlignet med npm - garn bruger også en låsefil kaldet
yarn.lock
, så dine projekter fungerer korrekt for alle holdkammerater. Dette koncept kaldes også en deterministisk installationsalgoritme - det er fyldt med en indbygget licenschecker, der kan være praktisk i forskellige scenarier, når du udvikler applikationer
- i modsætning til npm bruger Yarn en tilgang kaldet parallelle overførsler. Det gør det muligt for garn at udnytte flere ressourcer til at fremskynde byggeprocessen
- det kan automatisk prøve HTTP-anmodningen igen i tilfælde af fejl. Denne funktion er især nyttig, når du står over for midlertidige internetproblemer
fordele ved pnpm:
- det er kompatibelt med npm, men tilbyder også betydeligt bedre brug af diskplads og hastighed
- pnpm installerer alle pakker på et enkelt sted og bruger derefter symlinks til at henvise til dem. Det introducerer et helt nyt koncept kaldet et indholdsadresserbart lagersystem, der gør det muligt for pnpm at registrere forskellen mellem filer. Til gengæld duplikerer den ikke uændrede filer i to forskellige versioner af en pakke
- dens seneste version, 5.8.0, introducerer en ny garn-bash-lignende indstilling kaldet shell-emulator, et shell-miljø på tværs af platforme
- pnpm har en streng adgangskontrolmekanisme, hvilket betyder, at en pakke kun kan få adgang til de afhængigheder, der er defineret i dens
package.json
file
sammenligning af pakkehåndtering
brugervenlighed
npm, garn og pnpm tilbyder næsten identiske kommandoer til deres forskellige operationer, og de er alle nemme at bruge. Her er et eksempel på deres almindeligt anvendte kommandoer:
npm | garn | pnpm |
---|---|---|
NPM install | yarn install | pnpm install |
npm update | pnpm update | pnpm update |
hastighed
der er ingen match til pnpm, når det kommer til hastigheden og ydeevnen for disse pakkeadministratorer. Ifølge et benchmark af forskellige brugssager har pnpm vist præstationshastigheder op til 3 gange hurtigere end npm.
hastigheden af garn og npm er sammenlignelig. I nogle tilfælde har garn en betydelig fordel i forhold til npm, men der er scenarier, hvor npm er et mere passende valg. For eksempel, hvis vi udfører en installation ved blot at bruge node_modules
og springe cache
og lock file
funktionalitet, så kunne npm tilbyde 5 gange bedre hastighed. Tilsvarende, hvis vi bruger alle tre funktionaliteter, kan Garn øge dens ydeevne og bliver 11 gange hurtigere end npm.
sikkerhed
den største fordel ved garn i forhold til npm er, at det verificerer integriteten af hver pakke ved hjælp af checksums. Verifikationsprocessen udføres, før der udføres en kode fra pakken, så den kasserer eventuelle chancer for sårbarhed ved kapring af pakker.
på den anden side er npm lidt mere tilgivende, når det kommer til at arbejde med dårlige pakker. Det udvikler sig stadig for at tilbyde den bedste praksis for sikkerhed. Men npm har generelt et dårligt ry med hensyn til sikkerhed.
tidligere var der nogle sikkerhedssårbarheder i npm, der direkte påvirkede mange projekter. For eksempel i npm version 5.7.0, når du udfører sudo npm
kommando på et operativsystem (OS), var der mulighed for at ændre ejerskabet af systemfiler, hvilket gjorde OS ubrugeligt.
tilsvarende skete en anden hændelse med at stjæle bitcoins i 2018. Dybest set den populære knude.JS pakke EventStream tilføjet en ondsindet afhængighed flatmap-stream
i sin version 3.3.6. Denne ondsindede pakke var pakket med en krypteret nyttelast, der forsøger at stjæle bitcoins fra udviklerens maskine.
pnpm kombinerer de positive egenskaber ved både npm og garn for at give endnu bedre sikkerhed. Det implementerer også en streng adgangskontrolmekanisme, der binder en pakke til kun at bruge sine egne afhængigheder, der er defineret i dens package.json
fil.
stabilitet
npm, garn og pnpm har gennemgået flere faser i løbet af de sidste par år. Over tid er deres kodebase modnet, fordi de har modtaget masser af bidrag fra open source-samfundet.
og med tiden går der nye koncepter og ideer, der kan introducere brudændringer. På tidspunktet for skrivningen af denne vejledning er alle disse pakkeadministratorer i god form, og du kan bruge dem i dine projekter uden problemer.garn bakkes op af Facebook og Google, npm bakkes op af Microsoft og Node.js og pnpm er for det meste udviklet af en person, selvom den nu har 75+ bidragydere — så du kan stole på disse pakkeadministratorer for at oprette dit næste projekt.
støtte til monorepos
Monorepos foretrækkes for det meste af store teknologivirksomheder til at gemme og styre deres massive kodebaser. npm var kun designet til at styre individuelle projekter. Fra nu af har den ingen funktionalitet til at understøtte monorepos. Men både garn og pnpm har fuldstændig støtte til monorepos takket være deres koncept for arbejdsområder.
deterministisk — låsefilen
alle tre pakkeadministratorer er fyldt med funktionaliteten af låsefilen. Det giver forskellige udviklere mulighed for at installere den nøjagtige samme kopi af projektet. npm bruger enpackage-lock.json
fil, garn brugeryarn.lock
, og pnpm brugerpnpm-lock.yaml
.
konklusion
Hvis du søger efter en løsning, der giver dig bedre hastighed og effektiv hukommelsesforbrug, bør du stærkt overveje at bruge pnpm.
Hvis du håndterer monorepos, kan du bruge pnpm eller garn til at gøre det. Husk dog, at Garn sender brugsdata til Facebook, hvilket muligvis ikke gør garn til et passende valg i nogle scenarier.
garn understøtter heller ikke version 5 af Node.js. I denne henseende er npm en foretrukken mulighed for Node.JS-baserede projekter, fordi det anbefales af noden.JS team. Disse dage, Node.js leveres som standard med npm.
med npm bør du overveje sin historie med sikkerhedsproblemer, som udløste udviklingen af garn, som også blev oprettet for at løse mange udstedere, der var til stede i npm. Så hvis du er bekymret for sikkerheden i dine projekter, kan du overveje at bruge Garn i stedet for npm.
LogRocket: Debug JavaScript-fejl lettere ved at forstå konteksten
Debugging kode er altid en kedelig opgave. Men jo mere du forstår dine fejl, jo lettere er det at rette dem.
LogRocket giver dig mulighed for at forstå disse fejl på nye og unikke måder. Vores frontend-overvågningsløsning sporer brugerengagement med dine JavaScript-frontender for at give dig muligheden for at finde ud af nøjagtigt, hvad brugeren gjorde, der førte til en fejl.
LogRocket registrerer konsollogfiler, sideindlæsningstider, stacktraces, langsomme netværksanmodninger / svar med overskrifter + organer, bro.ser metadata og brugerdefinerede logfiler. Forstå virkningen af din JavaScript-kode vil aldrig være nemmere!
prøv det gratis.