package.json 差分比較
開発ツール
読み込み中
ツールを読み込んでいます
ツールのコードは開いたときにのみ読み込まれます。
このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。
このツールについて
2 つの package.json を構造化された宣言として比較します。dependencies、devDependencies、optionalDependencies、peerDependencies をパッケージ名でまとめ、scripts、engines、その他のトップレベルのメタデータは別の分類で表示します。各差分には変更前後の値と、追加・削除・変更・移動のいずれかを付けます。パッケージマネージャーの起動やスクリプトの実行なしで、編集内容を確認できます。解析と比較は現在のブラウザーページ内で完結します。
主な用途
- ビルドツールを開発依存から実行時依存へ移し、宣言範囲も変えるプルリクエストを確認する。
- コミット前にビルド・テストスクリプト、Node.js の実行環境宣言、packageManager、overrides、エントリーポイントのメタデータを確認する。
- 確認中の分類だけを画面に表示しながら、宣言の全変更を再現可能な順序の JSON レポートにまとめる。
使い方
- 1.変更前後の package.json を貼り付けるか、例を読み込みます。両側とも厳密な JSON オブジェクトが必要です。コメント、末尾カンマ、展開後に重複するキーは拒否します。
- 2.比較を実行して件数と前後の値を確認し、変更種類やフィールド分類で絞り込みます。多い場合は 1 ページ 100 件です。移動の行には指定文字列の変更も含まれる場合があります。
- 3.秘密情報の注意書きを確認してから、全変更の JSON をコピーまたはダウンロードします。フィルターは出力行を除外しません。入力の編集や表示言語の変更で前の結果を消去します。
再現できるマニフェスト比較の例
書式と通常のキー順
{
"before": "{\n \"config\": {\n \"b\": 2,\n \"a\": 1\n },\n \"dependencies\": {\n \"beta\": \"2.0.0\",\n \"alpha\": \"1.0.0\"\n }\n}",
"after": "{\n \"dependencies\": {\n \"alpha\": \"1.0.0\",\n \"beta\": \"2.0.0\"\n },\n \"config\": {\n \"a\": 1,\n \"b\": 2\n }\n}"
}{
"error": null,
"counts": {
"added": 0,
"removed": 0,
"changed": 0,
"moved": 0
}
}両方のマニフェストは同じ宣言です。通常のキー順だけでは変更になりません。ここではエラーと件数の要約を出力例にしています。
依存関係の追加・削除・変更
{
"before": "{\n \"dependencies\": {\n \"demo\": \"^1.0.0\"\n },\n \"devDependencies\": {\n \"old\": \"1.0.0\"\n }\n}",
"after": "{\n \"dependencies\": {\n \"demo\": \"^2.0.0\"\n },\n \"optionalDependencies\": {\n \"extra\": \"~1.2.0\"\n }\n}"
}{
"error": null,
"counts": {
"added": 1,
"removed": 1,
"changed": 1,
"moved": 0
}
}extra を追加し、old を削除し、demo の SemVer 範囲の文字列を変更します。宣言だけの比較で、インストール済みの版は推測しません。
移動と指定変更を同時に行う
{
"before": "{\n \"devDependencies\": {\n \"demo\": \"^1.0.0\"\n }\n}",
"after": "{\n \"dependencies\": {\n \"demo\": \"^2.0.0\"\n }\n}"
}{
"error": null,
"counts": {
"added": 0,
"removed": 0,
"changed": 0,
"moved": 1
}
}demo は存在したまま devDependencies から dependencies に移り、範囲も変わります。移動 1 件と数え、完全なレポートには両側のセクション別の値を保持します。
スクリプト・実行環境・パッケージマネージャー
{
"before": "{\n \"scripts\": {\n \"build\": \"vite build\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"packageManager\": \"npm@10.8.0\"\n}",
"after": "{\n \"scripts\": {\n \"build\": \"tsc && vite build\",\n \"test\": \"node --test\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"npm@11.0.0\"\n}"
}{
"error": null,
"counts": {
"added": 1,
"removed": 0,
"changed": 3,
"moved": 0
}
}test スクリプトを 1 件追加し、build コマンド、Node.js の実行環境宣言、packageManager をそれぞれ変更します。コマンドは実行しません。
条件キーの優先順位と配列順
{
"before": "{\n \"exports\": {\n \".\": {\n \"import\": \"./a.js\",\n \"default\": \"./b.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ]\n}",
"after": "{\n \"exports\": {\n \".\": {\n \"default\": \"./b.js\",\n \"import\": \"./a.js\"\n }\n },\n \"files\": [\n \"README.md\",\n \"dist\"\n ]\n}"
}{
"error": null,
"counts": {
"added": 0,
"removed": 0,
"changed": 2,
"moved": 0
}
}exports の条件順と files の配列順が変わるため、メタデータの変更は 2 件です。この保守的な構造比較は、実行時の動作が本当に変わるかは判断しません。
非レジストリの指定とエイリアス
{
"before": "{\n \"dependencies\": {\n \"demo\": \"^1.0.0\"\n }\n}",
"after": "{\n \"dependencies\": {\n \"demo\": \"file:../demo\",\n \"alias\": \"npm:demo@^2.0.0\",\n \"local\": \"workspace:*\",\n \"source\": \"github:example/demo#main\"\n }\n}"
}{
"error": null,
"counts": {
"added": 3,
"removed": 0,
"changed": 1,
"moved": 0
}
}エイリアス、ワークスペース、Git の項目を追加し、demo をローカルファイルの指定に変えます。構文ラベルによるダウンロード、ファイル読み取り、パッケージ解決はありません。
展開後に重複するキーを拒否
{
"before": "{\"name\":\"demo\",\"na\\u006de\":\"other\"}",
"after": "{}"
}{
"error": {
"side": "before",
"code": "duplicateKey"
},
"counts": {
"added": 0,
"removed": 0,
"changed": 0,
"moved": 0
}
}name と na\u006de は同じキーに展開されます。変更前の入力で比較全体を停止し、上書きされた値や部分結果は使いません。
マニフェスト確認でよくある誤り
- 厳密な package.json JSON の代わりに、ロックファイル、JavaScript オブジェクト、JSONC コメントや末尾カンマ付きの内容を貼り付ける。
- 指定の分類や範囲変更を、インストール済みバージョン、更新推奨、安全性の判定と考える。
- 移動数をセクション編集の数だと考える。影響を受けるパッケージ名ごとに 1 件です。
- 画面のフィルターで出力も秘匿・除外されると思い込む。全変更のレポートには秘密情報も含む元の値が残ります。
- exports/imports の条件順を無視する、または差分に表示したスクリプトが実行されたと考える。
制限と注意事項
- 上限を設けた宣言の比較であり、npm スキーマ検証、依存解決、インストール済みバージョンの比較ではありません。ロックファイルの読み取り、パッケージ取得、レジストリ検索、スクリプト実行は行わず、互換性・脆弱性・アップグレードやダウングレードも判断しません。意味が同じ範囲でも文字列が異なれば変更になります。
- 各入力は UTF-8 で 262,144 バイト、深さ 32、JSON 値 20,000 個までです。全階層の重複キー、不正な JSON、オブジェクト以外のルート、非有限数、安全でない整数、往復変換で十進値が変わる数値を拒否します。依存セクション・scripts・engines の値は文字列に限定し、name・version・packageManager は文字列、overrides はオブジェクトとします。エラー時は部分的な差分を返さず停止します。
- 依存関係は対応する 4 セクションで集約します。片側だけにある名前は追加または削除です。両側にあり所属セクションが違う場合は、指定値も変わったり別セクションに残ったりしていても 1 件の移動です。所属が同じで字面の値が違えば変更です。空の依存・スクリプト・実行環境セクションは省略と同じ扱いです。overrides と peerDependenciesMeta はメタデータとして比較し、依存関係に展開しません。
- 通常のオブジェクトのキー順と JSON 書式は無視し、文字列の内容と配列順は保ちます。条件の優先度に影響しうるため、exports と imports 内のすべての入れ子オブジェクトのキー順も保ちます。その他のメタデータはトップレベルのフィールド単位で比較し、入れ子の編集でもそのフィールド全体の前後値を表示します。指定の分類は参考情報であり、不明な構文も保持し、対象の検証や解決はしません。 JavaScript の並べ替えで条件順の変化が隠れないよう、exports/imports 内のどの階層でも整数インデックスのオブジェクトキーを拒否します。
- このツールは入力をアップロードせず永続保存もしません。JSON 出力は非公開 URL、スクリプトのコマンド、秘密情報を含む変更フィールドの値を伏せずに保持します。フィルターや表示ページに関係なく全変更を出力します。コピー、保存、共有後のレポートはページで管理できません。
よくある質問
依存関係の変更はアップグレードを意味しますか?
いいえ。比較するのは宣言の文字列です。^1.0.0 から ~1.5.0、latest から next、レジストリの範囲からローカルパスへの変更だけでは、実際のインストール済みバージョンは分かりません。ロックファイルとパッケージマネージャーによる解決は対象外です。
依存関係の移動と削除・追加は何が違いますか?
同じパッケージ名を 4 つの依存セクションにまたがってまとめます。両側にあり所属が変わると、移動 1 件として扱います。前後のセクション別の値で指定文字列の変更も確認できます。複数セクションに存在するパッケージを、暗黙に 1 つの値へ縮約しません。
JSON の順序を変えただけで差分が出るのはなぜですか?
書式と普通のオブジェクトのキー順は無視します。一方、配列順と exports/imports 内の入れ子のキー順は保持します。条件照合の優先順位がキー順に依存する場合があるため、値が同じでも条件の並べ替えを表示します。
workspace、エイリアス、Git、ローカルパスは扱えますか?
文字列のまま保持し、ワークスペース、npm エイリアス、Git、ローカルファイルやパスに分類します。完全なバージョン、SemVer 範囲、URL、配布タグ、不明な構文も表示します。対象へのアクセス、実行、解決は行わず、ラベルは有効性や安全性の保証ではありません。