|
In der Vergangenheit haben wir in Projekten immer mehr Probleme mit npm festgestellt.
Einige der Probleme sind unter anderem:
npm ci
brach bei Infrastrukturproblemen bei npmjs.org oder bei instabiler Internetverbindung sehr oft ab- der npm-Cache enthielt oft korrupte / kaputte Dateien, z.B. durch solche fehlerhaften Installationen
- npm war nach Upgrades teilweise von den selben Problemen betroffen
- die Lockfiles haben sich fast immer nach einem
npm i
verändert und hatten neuere Abhängigkeiten geladen (npm ci
ist nur ein Kompromiss meiner Meinung nach) - es gibt aktuell konkret nur 2 aktive Entwickler hinter npm (sehr kleine Truck Number), die Bugs häufen sich
npm i
dauerte teilweise sehr lange- npm ist offline nur bedingt nutzbar
Alternative Lösungen wie Yarn und pnpm versuchen diese Probleme durch bessere Ansätze zu lösen.
Da uns eine stabile Entwicklungsumgebung und stabile CI-Builds wichtig sind, haben wir Projekte von npm zu Yarn migriert und konnten diese Probleme bislang nicht mehr feststellen.
Yarn bietet aktuell unter anderem folgende Vorteile im Vergleich zu npm:
- mehrere Downloads von Modulen werden parallel ausgeführt
- ein einzelner fehlgeschlagener Request bricht nicht unbedingt die ganze Installation ab
- Installationen mit der gleichen Yarn-Version und dem identischen Lockfile ergeben auch identische Installationen (per engines-Feld in package.json kann man die Version für alle zwingend festlegen)
- Offline-Modus funktioniert durch den sehr gut umgesetzten Cache wesentlich besser, bereits zuvor installierte Pakete können problemlos offline installiert werden
- mehr sinnvolle Features, z.B.
yarn licenses list
- doppelte Pakete werden nur ein Mal abgelegt und es wird dadurch Platz gespart
- Unterstützung für Monorepos (workspaces)
yarn publish
fragt nach der neuen Version, alternativ geht auchyarn version
Der Wechsel von npm ist relativ einfach und bietet eine Lösung mit besserer Sicherheit inklusive nützlicher Befehle. Oft reicht schon ein simples yarn import
, wenn ein bestehendes Projekt eine package-lock.json
Datei enthält.
Für bestehende Projekte kann man folgende Befehle ausführen:
npm ci
yarn import
rm package-lock.json
git add yarn.lock
git commit -m 'chore: migrate to yarn'
git push
Wie sind eure Erfahrungen mit npm und Yarn?