
npm-Cache
Der npm-Cache ist ein lokaler Zwischenspeicher auf dem Rechner eines Entwicklers, in dem einmal heruntergeladene Programmbausteine für JavaScript-Projekte abgelegt werden. Er sorgt dafür, dass dieselben Bausteine beim nächsten Mal nicht erneut aus dem Internet geladen werden müssen.
Wer heute Software schreibt, baut nicht alles selbst. Man lädt fertige Codebausteine anderer Leute herunter und setzt sie in das eigene Programm ein. Für die Programmiersprache JavaScript geschieht das meist über ein Werkzeug namens npm, das solche Bausteine aus einem riesigen Online-Archiv holt. Jeder heruntergeladene Baustein wird dabei zusätzlich in einem Ordner auf der eigenen Festplatte abgelegt. Dieser Ordner ist der npm-Cache. Braucht ein Projekt später denselben Baustein noch einmal, nimmt npm die Kopie von der Platte statt sie erneut aus dem Netz zu laden.
Warum Entwickler nicht zehnmal dasselbe herunterladen wollen
Ein einziges mittelgroßes JavaScript-Projekt zieht schnell mehrere hundert bis über tausend solcher Bausteine nach. Denn jeder Baustein bringt wieder eigene Bausteine mit, die er selbst benötigt. Ohne Zwischenspeicher müsste jede Installation all das komplett neu aus dem Internet holen. Das kostet Minuten, Datenvolumen und belastet die Server des Archivs unnötig.
Besonders deutlich wird der Effekt bei automatisierten Testsystemen. Große Firmen lassen ihre Software mehrere hundert Mal am Tag automatisch neu bauen und testen. Jeder dieser Durchläufe installiert die Bausteine erneut. Ein funktionierender Zwischenspeicher kann so einen Durchlauf von mehreren Minuten auf wenige Sekunden verkürzen. Über einen Monat gerechnet sind das eingesparte Rechenstunden, für die sonst jemand bezahlen müsste.
Dazu kommt die Unabhängigkeit vom Netz. Wer im Zug oder in einem Café ohne stabile Verbindung arbeitet, kann dank des Caches trotzdem an einem Projekt weiterbauen. Voraussetzung ist, dass die benötigten Bausteine schon einmal geladen wurden.
Prüfsummen und der Ordner _cacache
Der Cache liegt als versteckter Ordner im persönlichen Benutzerverzeichnis, unter dem Namen _cacache. Darin liegen die heruntergeladenen Pakete nicht nach Namen sortiert, sondern nach einem Fingerabdruck ihres Inhalts. Diesen Fingerabdruck nennt man Prüfsumme: eine lange Zeichenkette, die aus dem Inhalt der Datei berechnet wird. Ändert sich auch nur ein einziges Zeichen im Paket, ergibt sich eine völlig andere Prüfsumme.
Das hat einen praktischen Vorteil. npm kann so prüfen, ob eine Datei aus dem Cache wirklich unverändert ist, bevor es sie einbaut. Stimmt die Prüfsumme nicht, wird der Eintrag verworfen und neu geladen. Man kann sich das wie eine Bibliothek vorstellen, in der jedes Buch nicht nach Titel, sondern nach einer Nummer einsortiert ist, die aus dem gesamten Text errechnet wurde.
Ein häufiger Irrtum: Der Cache ist nicht dasselbe wie der Ordner node_modules im Projekt. In node_modules liegen die Bausteine, die dieses eine Projekt gerade benutzt. Der Cache ist der gemeinsame Vorrat für alle Projekte auf dem Rechner. Löscht man node_modules, ist die Neuinstallation trotzdem schnell, weil der Vorrat noch da ist.
Vom Fehlerforum bis zur Lieferketten-Debatte
Am häufigsten begegnet einem der Begriff in Fehlermeldungen und Anleitungen. Wenn eine Installation ohne erkennbaren Grund scheitert, lautet ein Standardrat: den Cache leeren. Der Befehl dafür heißt npm cache clean --force. Er ist so bekannt, dass er in Entwicklerforen fast zum Running Gag geworden ist, obwohl er die eigentliche Ursache selten behebt.
In Fachnachrichten taucht das Thema in einem größeren Zusammenhang auf. Wenn jemand ein beliebtes Paket mit Schadcode manipuliert, spricht man von einem Angriff auf die Software-Lieferkette. Zwischenspeicher spielen dabei eine doppelte Rolle: Prüfsummen erschweren unbemerkte Manipulationen, gleichzeitig kann eine bereits verseuchte Kopie länger im System bleiben als gedacht. Unternehmen betreiben deshalb oft eigene Zwischenspeicher-Server für ihr gesamtes Team.
Wer selbst mit JavaScript zu programmieren beginnt, merkt den Cache vor allem an einem Detail. Die erste Installation eines Projekts dauert spürbar lange, die zweite geht auffällig schnell. Genau das ist der Zwischenspeicher bei der Arbeit.