Package Manager

npm

npm ist der Standard-Package-Manager und die größte Software-Registry der Welt. Erfahren Sie, wie Abhängigkeiten installiert, Versionen aufgelöst und Projekt-Scripts ausgeführt werden.

beginner13 min readUpdated 15. Sept. 2026
package.json
json
// package.json
{
  "name": "my-app",
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "vitest run",
    "lint": "eslint ."
  },
  "dependencies": {
    "react": "^19.0.0"
  },
  "devDependencies": {
    "vite": "^6.0.0"
  }
}
Wird ausgeliefert mit
Node.js
Registry
Die größte der Welt
Manifest
package.json
Lockfile
package-lock.json
Versionierung
Semantic Versioning
Runner
npm scripts

Warum es wichtig ist

Warum npm immer noch wichtig ist

Riesiges Ökosystem

Über zwei Millionen Packages decken alles ab, von Frameworks bis hin zu winzigen Utilities – alle mit einem einzigen Befehl installierbar.

Reproduzierbarkeit durch Lockfiles

Die Lockfile zeichnet den exakten Dependency-Tree auf, sodass jede Maschine und jeder CI-Run dieselben Versionen installiert.

Integrierter Task-Runner

Scripts in der package.json bieten Ihrem Team einen konsistenten Satz an Befehlen, ohne dass zusätzliches Tooling erforderlich ist.

Das Gesamtbild

Die drei Kernkonzepte von npm

Ein Manifest beschreibt Ihr Projekt, eine Lockfile fixiert den exakten Dependency-Tree und Scripts bieten einen gemeinsamen Task-Runner.

Das Manifest

Beschreiben

Die package.json speichert den Namen Ihres Projekts, Abhängigkeiten, Scripts und Metadaten.

Der Resolver

Installieren

npm löst Versionsbereiche auf, lädt Packages herunter und erstellt den node_modules-Ordner.

Die Registry

Verteilen

Eine öffentliche Registry, in der Packages veröffentlicht und gefunden werden.

npm auf einen Blick

Der Kern von npm

package.json

Das Projektmanifest und die Single Source of Truth für Abhängigkeiten.

Dependencies

Runtime- und Development-Packages, die in separaten Feldern verwaltet werden.

Semver-Bereiche

Caret- und Tilde-Bereiche steuern, welche Updates zulässig sind.

Lockfile

Die package-lock.json fixiert den exakt aufgelösten Dependency-Tree.

Scripts

Benannte Befehle, die mit npm run ausgeführt werden, lokal und in der CI.

npx

Führt ein Package-Binary aus, ohne es global installieren zu müssen.

Eine kurze Geschichte

Die Registry, die JavaScript modular machte

  1. 2010

    npm veröffentlicht

    Isaac Schlueter erstellt einen Package-Manager als Ergänzung zu Node.js.

    10
  2. 2013

    Die Registry explodiert

    npm wird zur größten Package-Registry der Welt.

    13
  3. 2017

    package-lock.json

    Lockfiles werden eingeführt, um Installationen reproduzierbar zu machen.

    17
  4. 2020

    Workspaces

    npm erhält integrierte Unterstützung für Monorepos.

    20
  5. Heute

    Der Standard

    In Node.js integriert und täglich von Millionen von Projekten genutzt.

    Heute

Der vollständige Leitfaden

npm: Alles was Sie wissen müssen

Was ist npm?

npm ist der Standard-Package-Manager für JavaScript und die größte Software-Registry der Welt. Es wird zusammen mit Node.js ausgeliefert, installiert die von deinem Projekt deklarierten Abhängigkeiten, löst deren Versionen auf und bietet dir über Skripte einen konsistenten Task-Runner.

Fast jedes JavaScript-Projekt ist auf npm angewiesen, selbst wenn im Hintergrund ein anderer Client verwendet wird. Zu verstehen, was es tatsächlich macht – wie Versionen aufgelöst werden, wofür die Lockfile da ist und warum CI einen anderen Befehl nutzt – beseitigt eine ganze Kategorie von verwirrenden Fehlern.

package.json

Das Manifest beschreibt dein Projekt. Es enthält Metadaten, Abhängigkeiten und Skripte.

{
  "name": "my-app",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "vitest run",
    "lint": "eslint ."
  },
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "vite": "^6.0.0",
    "vitest": "^3.0.0"
  }
}

dependencies werden zur Laufzeit benötigt; devDependencies sind Tools, die für die Entwicklung und den Build-Prozess verwendet werden. Das private Flag verhindert ein versehentliches Veröffentlichen, und type: "module" aktiviert ES-Module.

Versionsbereiche

npm verwendet Semantic Versioning: major.minor.patch. Ein Bereich in package.json beschreibt, welche Updates akzeptiert werden.

Bereich Bedeutung Erlaubt
1.2.3 exakt nichts
~1.2.3 Patch-Updates 1.2.4, 1.2.5
^1.2.3 Minor- und Patch-Updates 1.3.0, 1.4.2
* beliebig jede Version

Das Caret-Symbol ist der Standard und für die meisten Abhängigkeiten die sinnvollste Wahl. Exakte Versionen blockieren Bugfixes und Sicherheitspatches, während die Lockfile bereits die Reproduzierbarkeit garantiert.

Die Lockfile

package-lock.json zeichnet die exakte Version und den Integrity-Hash jedes Pakets im Tree auf, einschließlich transitiver Abhängigkeiten.

  • Checken Sie die Datei in die Versionsverwaltung ein.
  • Bearbeiten Sie sie niemals manuell.
  • Generieren Sie sie bewusst neu, wenn Sie ein Update beabsichtigen.
  • Nutzen Sie sie als einzige Source of Truth für die installierten Versionen.

Ohne eine Lockfile können zwei Installationen desselben package.json unterschiedliche Trees erzeugen, wodurch ein Bug, der nur in der Produktion auftritt, nahezu unmöglich zu reproduzieren ist.

Abhängigkeiten installieren

Die beiden wichtigsten Installationsbefehle haben unterschiedliche Zwecke.

# development: resolve ranges, may update the lockfile
npm install

# CI and clean environments: exact install from the lockfile
npm ci

# add a runtime dependency
npm install zod

# add a development tool
npm install -D vitest

npm ci löscht node_modules, installiert strikt aus der Lockfile und bricht ab, wenn package.json und die Lockfile nicht übereinstimmen. Das macht den Vorgang in der CI sowohl schneller als auch sicherer. Verwende npm install lokal, wenn du Abhängigkeiten änderst.

Scripts

Scripts sind benannte Befehle, die über npm run ausgeführt werden. Sie ermöglichen es einem Projekt, eine konsistente Schnittstelle für alle Beteiligten bereitzustellen, einschließlich der CI.

npm run dev
npm run build
npm test        # shorthand for npm run test

Scripts können lokale Binaries direkt aufrufen, sodass "dev": "vite" ohne eine globale Installation funktioniert. Sie lassen sich zudem kombinieren: ein ci-Script kann beispielsweise Linting, Tests und den Build-Prozess nacheinander ausführen. Wenn diese Befehle in package.json hinterlegt sind, muss sich niemand mehr an den exakten Aufruf erinnern.

npx und Workspaces

npx führt eine Package-Binary aus, ohne dass eine globale Installation erforderlich ist, was ideal für Tools ist, die man nur einmalig benötigt.

npx create-vite@latest my-app
npx eslint .

Workspaces ermöglichen es, mehrere Packages in einem einzigen Repository zu verwalten, die sich eine gemeinsame node_modules und Lockfile teilen.

{
  "workspaces": ["packages/*", "apps/*"]
}

npm verknüpft die Packages miteinander, sodass ein Workspace von einem benachbarten Package abhängen kann, ohne dass dieses veröffentlicht werden muss. Für größere Monorepos ergänzen Tools wie Turborepo zusätzliche Funktionen wie Caching und Task-Orchestrierung.

Sicherheit und Wartung

npm enthält einen Audit-Befehl, mit dem dein Dependency-Tree auf bekannte Sicherheitslücken überprüft werden kann.

npm audit
npm audit fix
npm outdated

Führe Audits regelmäßig durch und lies die Ergebnisse sorgfältig, anstatt blind fix auszuführen, da dies zu Breaking Changes führen kann. npm outdated zeigt dir, für welche Abhängigkeiten neuere Versionen verfügbar sind, was dir hilft, Upgrades geplant anzugehen, anstatt sie aufstauen zu lassen.

Best Practices

  • Committe package-lock.json und bearbeite es niemals manuell.
  • Nutze npm ci in der CI und npm install nur bei Änderungen an den Dependencies.
  • Halte dependencies und devDependencies strikt getrennt.
  • Bevorzuge Caret-Ranges und überlasse das Fixieren exakter Versionen der Lockfile.
  • Definiere Scripts für jede gängige Aufgabe.
  • Führe npm audit und npm outdated regelmäßig nach einem Zeitplan aus.
  • Nutze Workspaces für Monorepos anstelle von separaten Repositories.

Häufige Fehler

  • Das Löschen der Lockfile, um Installationsprobleme zu “beheben”.
  • Das Ausführen von npm install in der CI, was zu nicht reproduzierbaren Builds führt.
  • Das Platzieren von Build-Tools in dependencies, was die Runtime-Installationen aufbläht.
  • Das Ignorieren von Audit-Warnungen, bis sie kritisch werden.
  • Das globale Installieren von Paketen, obwohl npx oder eine devDependency ausreichen würden.
  • Das Bearbeiten von node_modules in der Erwartung, dass die Änderungen dauerhaft gespeichert bleiben.

Wie geht es weiter?

npm ist das Fundament der JavaScript-Toolchain. Vergleiche es mit pnpm in Bezug auf Geschwindigkeit und Speicherplatzeffizienz, verstehe die Node.js-Runtime, mit der es ausgeliefert wird, und ergänze Turborepo, wenn dein Repository zu einem Monorepo anwächst. Bereinige anschließend die Skripte eines Projekts, sodass das gesamte Team einen einheitlichen Satz an Befehlen nutzt.

Installation in der CI

npm ci installiert exakt das, was in der Lockfile spezifiziert ist, und bricht ab, wenn diese nicht synchron sind, was Builds reproduzierbar macht.

Bevorzugt
npm ci
npm run build
Vermeiden
# may update the lockfile
# and install different
# versions than local
npm install
npm run build

Versionen fixieren

Die Lockfile garantiert bereits die Reproduzierbarkeit. Exakte Versionen in der package.json blockieren Sicherheitsupdates und Bugfixes.

Bevorzugt
{
  "dependencies": {
    "react": "^19.0.0"
  }
}
Vermeiden
{
  "dependencies": {
    "react": "19.0.0"
  }
}

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, npm zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch npm — mit Quizzen und echtem Code, den Sie im Browser ausführen können.