戻る

package.json 差分比較

開発ツール

読み込み中

ツールを読み込んでいます

ツールのコードは開いたときにのみ読み込まれます。

このツールの処理はすべてブラウザー内で行われ、入力内容はサーバーへ送信されません。

このツールについて

2 つの package.json を構造化された宣言として比較します。dependencies、devDependencies、optionalDependencies、peerDependencies をパッケージ名でまとめ、scripts、engines、その他のトップレベルのメタデータは別の分類で表示します。各差分には変更前後の値と、追加・削除・変更・移動のいずれかを付けます。パッケージマネージャーの起動やスクリプトの実行なしで、編集内容を確認できます。解析と比較は現在のブラウザーページ内で完結します。

主な用途

  • ビルドツールを開発依存から実行時依存へ移し、宣言範囲も変えるプルリクエストを確認する。
  • コミット前にビルド・テストスクリプト、Node.js の実行環境宣言、packageManager、overrides、エントリーポイントのメタデータを確認する。
  • 確認中の分類だけを画面に表示しながら、宣言の全変更を再現可能な順序の JSON レポートにまとめる。

使い方

  1. 1.変更前後の package.json を貼り付けるか、例を読み込みます。両側とも厳密な JSON オブジェクトが必要です。コメント、末尾カンマ、展開後に重複するキーは拒否します。
  2. 2.比較を実行して件数と前後の値を確認し、変更種類やフィールド分類で絞り込みます。多い場合は 1 ページ 100 件です。移動の行には指定文字列の変更も含まれる場合があります。
  3. 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、配布タグ、不明な構文も表示します。対象へのアクセス、実行、解決は行わず、ラベルは有効性や安全性の保証ではありません。

関連ツール