package.json-Abhängigkeiten diff
Vergleichen Sie zwei Abhängigkeitslisten aus package.json und sehen Sie, was sich wirklich bewegt hat: react geht von ^17.0.2 auf ^18.2.0, axios kommt hinzu, moment fällt weg, lodash bleibt gleich. Formatierung und Schlüsselreihenfolge zählen nicht. Kostenlos in Ihrem Browser.
- Kostenlos
- Läuft in Ihrem Browser
- Ohne Anmeldung
- Ihre Daten bleiben auf Ihrem Gerät
Im Browser ausführen – kostenlos
Läuft direkt in Ihrem Browser – kostenlos. Ihre Datei verlässt Ihren Browser nicht und wird an keinen Server übertragen.
Abhängigkeitsblöcke zwischen zwei package.json-Snapshots zu vergleichen ist Alltag bei Release-Reviews, Upgrades und Pull-Request-Audits. Ein roher Text- oder Zeilendiff vermischt Rauschen aus Formatierung, Schlüsselreihenfolge und fremden Feldern mit dem Signal, das zählt: welche Pakete hinzukamen, welche wegfielen und welche Versionsbereiche sich bewegten. Dieser package.json-Abhängigkeitsdiff akzeptiert zwei flache Objekte — jeweils eine Map von Paketname zu Versionsbereichs-String, genau wie unter dependencies, devDependencies, peerDependencies oder optionalDependencies — und liefert strukturierte Listen hinzugefügter, entfernter und geänderter Pakete plus unveränderte Einträge und Zähler.
Was ein semantischer Abhängigkeitsdiff meldet
Ein semantischer Abhängigkeitsdiff behandelt jeden Paketnamen als Mengenelement und jedes Versionsfeld als an diesen Namen geklebtes String-Label. Jeder Name, der nur in after vorkommt, wird unter added mit dem neuen Versionsbereich gemeldet. Jeder Name, der nur in before vorkommt, wird unter removed mit der damaligen Version gemeldet.
Namen in beiden Maps mit ungleichen Versionsstrings erscheinen unter changed mit from- und to-Feldern. Namen mit identischen Versionsstrings erscheinen unter unchanged, damit Sie den stabilen Anteil der deklarierten Oberfläche inventarisieren können. Zähler je Eimer und Summen beider Maps erlauben Dashboards Badges ohne erneutes Array-Zählen.
Der Vergleich ist bewusst flach: er expandiert keine Caret-Bereiche, löst das npm-Registry nicht auf und prüft nicht, ob ^17.0.0 und 17.0.2 denselben Baum installieren würden. So bleibt das Werkzeug deterministisch, offline und geeignet für CI-Gates, die nur wissen müssen, ob das deklarierte Abhängigkeitsobjekt sich bewegt hat. Fügen Sie dependencies, devDependencies oder eine selbst erstellte Zusammenführung ein — der Endpunkt braucht nur zwei Objekte mit stringwertigen Versionsspezifikationen.
Wo ein package.json-Abhängigkeitsdiff sich lohnt
Pull-Request-Bots können Abhängigkeiten aus base- und head-package.json extrahieren, diesen Endpunkt aufrufen und einen kurzen Kommentar posten, der nur echte Paketbewegungen listet statt eines lauten Unified Diffs. Release-Manager frieren ein bekannt gutes Abhängigkeitsobjekt vor einer Upgrade-Welle ein und diffen nach automatisierten Dependabot- oder Renovate-Batches erneut, um die beabsichtigten Bumps zu bestätigen. Security-Review-Pipelines koppeln diese strukturierte Ausgabe mit Advisory-Abfragen: nur die Vereinigung hinzugefügter und geänderter Paketnamen braucht CVE-Scans, wenn der Rest des Baums unverändert ist.
Halten Sie Maps bescheiden, pinnen Sie die sortierten Arrays in Tests, und Sie erhalten reproduzierbare Berichte über Abhängigkeitsänderungen für CI, Code-Review und Migrationschecklisten ohne einen vollen Lockfile-Analysator.
Anwendungsfälle
Abhängigkeitszusammenfassungen in Pull Requests
Vergleichen Sie base- und head-package.json-Abhängigkeitsobjekte und posten Sie im PR nur hinzugefügte, entfernte oder versionsgeänderte Pakete.
Review von Upgrade- und Renovate-Batches
Vergleichen Sie die Abhängigkeitsmap vor und nach einem automatisierten Upgrade-Batch, um beabsichtigte Bumps zu prüfen und überraschende Entfernungen zu finden.
Fokussierte Security-Rescan-Listen
Füttern Sie Advisory-Scanner mit hinzugefügten und geänderten Paketnamen, damit unveränderte Pakete nicht bei jedem Commit erneut geprüft werden.
Häufige Fragen
Löst dies Semver-Bereiche gegen die Registry auf?
Nein. Versionsspezifikationen werden als exakte Strings verglichen. ^1.0.0 und 1.0.0 gelten als Änderung, auch wenn beide denselben Release installieren könnten.
Kann ich devDependencies oder peerDependencies übergeben?
Ja. Jede Name→Version-Map funktioniert — dependencies, devDependencies, peerDependencies, optionalDependencies oder ein von Ihnen zusammengeführtes Objekt.
Warum nicht einfach Zeile für Zeile vergleichen?
Ein Zeilendiff vermischt Rauschen aus Formatierung, Schlüsselreihenfolge und fremden Abschnitten mit dem, was zählt. Hier wird jeder Paketname mit seinem Versionstext verglichen, sodass Sie nur Pakete sehen, die hinzukamen, wegfielen oder die Version wechselten.
Werden unveränderte Pakete auch aufgeführt?
Ja. Pakete mit identischem Versionstext stehen in einer eigenen Liste, damit Sie den stabilen Bestand weiter erfassen können. Alle Listen sind alphabetisch sortiert und mit ihrer Anzahl versehen.
Wie hilft das bei einer Sicherheitsprüfung?
Bleibt fast der ganze Baum gleich, brauchen nur hinzugefügte und geänderte Pakete eine neue Prüfung auf Sicherheitshinweise. Geben Sie diese Namen an Ihren Scanner, statt bei jedem Commit alle Pakete erneut zu prüfen.
Verwandte Tools
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/dev/semantic-diff-package-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}'const res = await fetch("https://api.kit.forhosting.com/dev/semantic-diff-package-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/semantic-diff-package-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/semantic-diff-package-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/semantic-diff-package-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.semantic_diff_package_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |
Technische Hinweise
Eingaben, die keine Objekte sind, scheitern mit invalid_input und werden nicht berechnet.
Was ein semantischer Abhängigkeitsdiff meldet
Die Basismap ist before; die Kandidatenmap ist after.
Eingabevertrag, Antwortform und Fehler
Jedes muss ein flaches Objekt sein, kein Array, nicht null und kein Primitiv. Paketnamen werden Objektschlüssel; Versionsbereiche müssen Strings oder einfache Skalare sein, die sauber zu Strings werden — verschachtelte Objekte als Versionswerte werden abgelehnt. Leere Objekte sind gültig und bedeuten eine leere Abhängigkeitsmenge. Bei Erfolg enthält der Body alphabetisch nach Paketname sortierte Arrays added, removed, changed und unchanged; jedes hinzugefügte oder entfernte Element hat name und version, jedes geänderte name, from und to, und jedes unveränderte name und version. Senden Sie einen JSON-Body mit zwei Pflicht-Objektfeldern: before (Aliasse left, old, previous) und after (Aliasse right, new, next). Numerische Zähler added_count, removed_count, changed_count, unchanged_count, total_before und total_after spiegeln die Arrays. Der boolesche Wert has_changes ist true, wenn ein Paket hinzugefügt, entfernt oder versionsgeändert wurde. Fehlt before oder after, ist es ein Array, ein String oder sonst kein Objekt, schlägt die Aufgabe mit invalid_input und Feldnamen fehl; solche Fehler werden nicht berechnet. Beispiel: before mit react ^17.0.2, lodash ^4.17.21, moment ^2.29.4 gegen after mit react ^18.2.0, lodash ^4.17.21, axios ^1.6.0 ergibt moment entfernt, axios hinzugefügt, react von ^17.0.2 auf ^18.2.0 geändert und lodash unverändert.
Wo ein package.json-Abhängigkeitsdiff sich lohnt
Weil die Implementierung reines Parse-Tier-A ist, kostet jeder erfolgreiche Aufruf den veröffentlichten Basispreis $0.002 ohne Modell-Tokens und ohne ausgehendes Netz.
Technische Fragen
Wie vergleiche ich zwei package.json-Abhängigkeitsobjekte?
Senden Sie before und after als flache Objekte, die Paketnamen auf Versionsbereichs-Strings abbilden. Die API liefert sortierte Listen added, removed, changed und unchanged plus Zähler.
Was passiert, wenn before oder after kein Objekt ist?
Die Aufgabe scheitert mit invalid_input. Arrays, null, Strings und fehlende Felder werden abgelehnt und nicht berechnet.
Was kostet der package.json-Abhängigkeitsdiff?
Das Browser-Tool ist kostenlos. API-Anfragen nutzen vorab bezahltes KIT-Guthaben zu $0.002 pro erfolgreichem Aufruf; ungültige Eingabe wird nicht berechnet.