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.1convert-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
