|

Der Wechsel von npm zu Yarn

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 auch yarn 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?