npm und package.json verstehen

npm ist das Herzstück jedes Node.js-Projekts. Lerne, was die package.json bedeutet, wie Versionierung funktioniert und welche Befehle du täglich brauchst.

Teilen
npm und package.json verstehen

Sobald du mit Node.js arbeitest, begegnet dir npm auf Schritt und Tritt. npm steht für "Node Package Manager" und ist das Werkzeug, mit dem du Bibliotheken installierst, dein Projekt beschreibst und Skripte ausführst. Im Zentrum steht dabei eine einzige Datei: die package.json. In diesem Beitrag schauen wir uns beides genauer an.

Ein neues Projekt anlegen

Jedes Node.js-Projekt beginnt mit einer package.json. Du erzeugst sie mit einem einzigen Befehl im Projektordner:

# Interaktiv: stellt dir ein paar Fragen
npm init

# Schneller: nimmt überall die Standardwerte
npm init -y

Danach liegt eine package.json in deinem Ordner, die dein Projekt beschreibt. Sie ist sozusagen der Personalausweis deiner Anwendung.

Der Aufbau der package.json

Schauen wir uns eine typische package.json an. Sie ist eine ganz normale JSON-Datei mit klar definierten Feldern.

{
  "name": "mein-projekt",
  "version": "1.0.0",
  "description": "Ein Beispielprojekt",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Keine Tests\" && exit 1"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

Die wichtigsten Felder sind name und version zur Identifikation, scripts für eigene Befehle sowie dependencies und devDependencies für deine Abhängigkeiten.

Pakete installieren

Mit npm install holst du dir fremde Pakete ins Projekt. npm trägt sie automatisch in die package.json ein und legt sie im Ordner node_modules ab.

# Ein Paket als normale Abhängigkeit installieren
npm install express

# Ein Werkzeug nur für die Entwicklung
npm install --save-dev nodemon

# Ein Paket global auf dem System
npm install -g typescript

Der Unterschied: dependencies braucht deine App auch in der Produktion, devDependencies brauchst du nur beim Entwickeln und Testen.

Semantische Versionierung verstehen

Die Versionsnummern wie 4.18.2 folgen dem Schema Major.Minor.Patch. Eine Erhöhung der Patch-Zahl bedeutet Fehlerkorrekturen, Minor neue Funktionen ohne Bruch und Major potenziell inkompatible Änderungen. Die Zeichen vor der Nummer steuern, welche Updates npm erlauben darf:

  • ^4.18.2 erlaubt alle Updates bis vor die nächste Major-Version, also bis 4.x.x
  • ~4.18.2 erlaubt nur Patch-Updates innerhalb von 4.18.x
  • 4.18.2 ohne Zeichen pinnt exakt diese Version fest

Die Datei package-lock.json hält fest, welche exakten Versionen tatsächlich installiert wurden, damit dein Team überall identische Stände hat. Sie gehört unbedingt ins Repository.

Skripte ausführen

Im Abschnitt scripts definierst du eigene Kommandos, die du dann bequem über npm startest. Das spart dir lange Befehlszeilen.

{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "build": "tsc",
    "lint": "eslint ."
  }
}

Aufgerufen werden diese Skripte so:

# start und test sind Spezialfälle ohne run
npm start
npm test

# Alle anderen Skripte brauchen run
npm run dev
npm run build
npm run lint

Pakete aktualisieren und prüfen

npm hilft dir auch dabei, deine Abhängigkeiten aktuell und sicher zu halten. Diese Befehle gehören in jeden Workflow:

# Veraltete Pakete anzeigen
npm outdated

# Pakete im erlaubten Rahmen aktualisieren
npm update

# Sicherheitslücken prüfen
npm audit

# Lücken automatisch beheben
npm audit fix

Gerade npm audit ist Gold wert, weil es dich auf bekannte Schwachstellen in deinen Abhängigkeiten hinweist.

Fazit

npm und die package.json bilden das Fundament jedes Node.js-Projekts. Du legst Projekte mit npm init an, installierst Pakete mit npm install und unterscheidest dabei zwischen Produktions- und Entwicklungsabhängigkeiten. Die semantische Versionierung mit den Zeichen ^ und ~ steuert Updates, und die package-lock.json sorgt für reproduzierbare Installationen. Mit eigenen Skripten und regelmäßigen Audits hast du dein Projekt sauber im Griff.