npm dedupeは、インストール済みの依存関係ツリーの重複を解消するコマンドである。 同じバージョン範囲を満たせるパッケージが複数の場所に別々にインストールされている場合、それらをツリーの上位に集約して共有できるようにする。

基本的な使い方

引数なしで実行するだけでよい。

$ npm dedupe

対象は常にツリー全体であり、引数を指定しても無視される。 また、このコマンドは既存のインストール済みパッケージの配置を整理するだけであり、新しいパッケージがインストールされることはない。 package.jsonに記載した直接依存のバージョン範囲を変更することもない。

事前に重複を確認する

npm dedupe--dry-run付きで実行すると、実際には変更を加えずに重複の有無を確認できる。

$ npm dedupe --dry-run

npm dedupe--dry-runモードで実行する別コマンドとして、npm find-dupesも用意されている。

$ npm find-dupes

重複がない場合はup to dateのように表示される。

実際に重複が解消された例

このブログのリポジトリで実際にnpm dedupeを実行したところ、safe-bufferの重複が解消された。

実行前は、safe-bufferを要求するパッケージが2つあり、要求範囲の違いから2つのバージョンが別々にインストールされていた。

  • tunnel-agentが要求する^5.0.1を満たすため、ルートにsafe-buffer@5.2.1
  • convert-source-mapが要求する~5.1.1を満たすため、convert-source-map配下にネストされたsafe-buffer@5.1.2

5.1.2^5.0.1~5.1.1の両方を満たせるため、npm dedupeはルートのバージョンを5.1.2に変更し、不要になったネストされたコピーを削除して1本化した。 このように、既存のインストール済みバージョンの範囲内であれば、ルート側の解決バージョンが変わることもある。

活用例: 依存関係のメンテナンス

npm installを繰り返していると、インストールのタイミングによって同じパッケージが複数バージョンに分かれてインストールされることがある。 npm dedupeを定期的に実行すれば、node_modulesのサイズを抑えつつ依存関係ツリーを整理できる。

インストール時点から重複を作りにくくしたい場合は、--prefer-dedupeオプションを付けてnpm installを実行するか、npm config set prefer-dedupe trueで既定の挙動にできる。

$ npm install --prefer-dedupe

参考

npm-dedupe | npm Docs