Intelligentere Paket-Updates mit npm-check-updates
Dependency Drift tötet Projekte langsam. Man überspringt ein paar Updates, dann noch ein paar mehr, und plötzlich starrt man auf 47 veraltete Pakete – die Hälfte mit Breaking Changes, einige mit Sicherheitslücken und kein klarer Weg nach vorne. npm update auszuführen fühlt sich an wie russisches Roulette. Massen-Upgrades bringen die CI zum Scheitern. Die sichere Wahl wird, nichts zu tun – was überhaupt nicht sicher ist.
npm-check-updates (ncu) bietet einen anderen Ansatz: die Trennung der Entscheidung, was aktualisiert werden soll, von der Installation und dem Testen. Diese Unterscheidung ist wichtiger, als die meisten Teams erkennen.
Wichtigste Erkenntnisse
- ncu modifiziert die Versionsbereiche in package.json, ohne node_modules oder Ihre Lockfile anzurühren, und gibt Ihnen die Kontrolle darüber, wann die Installation erfolgt
- Verwenden Sie
--target minoroder--target patch, um Updates auf nicht-breaking Changes zu beschränken - Das
--peer-Flag verhindert, dass Updates vorgeschlagen werden, die Peer-Dependency-Konflikte verursachen würden - Committen Sie package.json und package-lock.json immer gemeinsam nach dem Testen von Updates
- Verwenden Sie das
overrides-Feld von npm, um spezifische Versionen transitiver Abhängigkeiten zu erzwingen, wenn Sie Sicherheitslücken beheben
Warum blinde Upgrades Builds zum Scheitern bringen
Das Kernproblem beim JavaScript-Paketmanagement ist nicht das Auffinden veralteter Abhängigkeiten – das erledigt npm outdated. Das Problem ist, dass ein Upgrade auf „latest” Peer-Dependency-Einschränkungen, Semver-Grenzen und die Tatsache ignoriert, dass Ihre Lockfile aus gutem Grund existiert.
Wenn Sie npm update ausführen, respektiert npm die Versionsbereiche in Ihrer package.json. Es springt nicht von ^2.0.0 auf 3.0.0, selbst wenn Version 3 existiert. Das ist beabsichtigt. Aber es bedeutet auch, dass echte Updates, die Änderungen der Versionsbereiche erfordern, auf unbestimmte Zeit stecken bleiben.
ncu löst dies, indem es package.json direkt modifiziert – Versionsbereiche aktualisiert – ohne node_modules oder Ihre Lockfile anzurühren. Sie kontrollieren, wann die Installation erfolgt.
Moderne ncu-Workflows für Node.js Dependency Management
Globale Installationen sind nicht mehr das Standard-Denkmodell. Mit ncu v18+ führen Sie es direkt über Ihren Paketmanager aus:
npx npm-check-updates
# oder
pnpm dlx npm-check-updates
# oder
bunx npm-check-updates
Dies prüft auf Updates, ohne etwas zu modifizieren. Sie sehen, was verfügbar ist, farbcodiert nach Semver-Ebene: rot für Major, cyan für Minor, grün für Patch.
Das kritische Flag ist -u, das Änderungen in package.json schreibt. Aber hier ist, was zählt: Dies aktualisiert nur das Manifest. Ihre Lockfile bleibt unverändert, bis Sie explizit npm install ausführen.
Diese Trennung ermöglicht einen sichereren Workflow für Dependency-Updates:
- Führen Sie
ncu -u --target minoraus, um package.json mit nicht-breaking Changes zu aktualisieren - Führen Sie
npm installaus, um die Lockfile neu zu generieren - Führen Sie Ihre Test-Suite aus
- Wenn Tests erfolgreich sind, committen Sie package.json und package-lock.json gemeinsam
Für Major-Updates behandeln Sie diese einzeln mit ncu -u --filter package-name, überprüfen das Changelog und testen dann.
Discover how at OpenReplay.com.
Peer Dependencies und Kompatibilitätsprüfung
Peer-Dependency-Konflikte verursachen die meisten Upgrade-Fehler. Eine React-Komponentenbibliothek benötigt möglicherweise React 18, aber Ihr Projekt fixiert React 17. Ein blindes Upgrade der Bibliothek bringt den Build zum Scheitern.
Das --peer-Flag von ncu prüft die Peer-Dependency-Kompatibilität, bevor Updates vorgeschlagen werden. Dies verhindert, dass Upgrades vorgeschlagen werden, die sofort bei der Installation fehlschlagen würden.
Für strengere Kontrolle kombinieren Sie dies mit --target:
ncu --peer --target minor
Dies zeigt nur Updates, die keine Peer-Constraints verletzen und keine Major-Versionsgrenzen überschreiten.
Lockfiles und CI-Pipeline-Integration
Ihre Lockfile repräsentiert einen bekanntermaßen funktionierenden Zustand. Behandeln Sie sie entsprechend.
Verwenden Sie in der CI immer npm ci statt npm install. Der ci-Befehl schlägt fehl, wenn package.json und package-lock.json nicht synchron sind – genau das, was Sie wollen. Dies fängt Situationen ab, in denen jemand package.json aktualisiert, aber vergessen hat, die Lockfile neu zu generieren.
Für automatisierte Dependency-Update-Workflows in der CI sieht das Muster so aus:
ncu -u --target patch
npm install
npm test
Wenn Tests erfolgreich sind, committet die Pipeline die Änderungen. Wenn sie fehlschlagen, wird das Update zur manuellen Überprüfung markiert.
Kontrolle transitiver Abhängigkeiten mit Overrides
Manchmal liegt das Problem nicht bei Ihren direkten Abhängigkeiten – sondern bei deren Abhängigkeiten. Eine Sicherheitslücke drei Ebenen tief in Ihrem Dependency-Tree erfordert die Aktualisierung eines Pakets, das Sie nicht kontrollieren.
Das overrides-Feld von npm ermöglicht es Ihnen, spezifische Versionen transitiver Abhängigkeiten zu erzwingen:
{
"overrides": {
"vulnerable-package": "2.0.1"
}
}
Dies ist ein Standardbestandteil des JavaScript-Paketmanagements. Verwenden Sie es, wenn Sie einen Sicherheitspatch benötigen, bevor Upstream-Maintainer ihre Abhängigkeiten aktualisieren.
Fazit
Automatisierung von Dependency-Updates bedeutet nicht, ständig alles zu aktualisieren. Es bedeutet, einen wiederholbaren Prozess zu haben, der Entdeckung von Installation trennt, Semver-Grenzen respektiert und Ihre Lockfile mit Ihrem Manifest synchron hält.
ncu passt in diesen Workflow, weil es package.json-Updates als eigenständigen Schritt behandelt. Sie entscheiden, was aktualisiert, wann installiert und wann getestet wird. Das Tool übernimmt den mühsamen Teil – Registries prüfen und Versionsbereiche modifizieren – während es die Entscheidungen Ihnen überlässt.
Aktualisieren Sie Patches wöchentlich. Überprüfen Sie Minors monatlich. Behandeln Sie Majors bewusst. Halten Sie Ihre Lockfile committed. Ihre CI wird es Ihnen danken.
FAQs
npm update installiert neuere Versionen innerhalb Ihrer bestehenden package.json-Versionsbereiche, überschreitet aber keine Major-Versionsgrenzen. npm-check-updates modifiziert die Versionsbereiche in package.json selbst und ermöglicht es Ihnen, auf jede Version einschließlich Major-Releases zu aktualisieren. ncu ändert das Manifest, während npm update node_modules ändert.
Ja. ncu funktioniert mit jedem Paketmanager, da es nur package.json modifiziert. Führen Sie es mit pnpm dlx npm-check-updates oder npx npm-check-updates aus, unabhängig von Ihrem Paketmanager. Nachdem ncu Ihre package.json aktualisiert hat, verwenden Sie Ihren bevorzugten Paketmanager, um die aktualisierten Abhängigkeiten zu installieren.
Verwenden Sie das reject-Flag mit einem Paketnamen oder Muster. Zum Beispiel schließt ncu --reject typescript TypeScript von Updates aus. Sie können auch ncu --reject '/react.*/' verwenden, um mehrere Pakete auszuschließen, die einem Muster entsprechen. Dies ist nützlich für Pakete, die Sie manuell aktualisieren möchten.
Das Ausführen von ncu -u modifiziert nur package.json, ohne etwas zu installieren. Das Risiko entsteht durch das anschließende Ausführen von npm install ohne Tests. Führen Sie immer Ihre Test-Suite nach dem Aktualisieren und Installieren aus. Beginnen Sie mit Patch-Updates mit ncu -u --target patch für den sichersten Ansatz.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.