初めに
現在、Next.js(TypeScript)でclient側のアプリ開発をしています。
私は今までnpmというパッケージマネージャーを利用していたのですが、今回pnpmという存在を知ったのでそれぞれの違いをまとめてみました。
あくまで初心者の見解ですので、もし間違っていたら指摘していただけると幸いです。
パッケージマネージャーとは
パッケージマネージャーとは、ソフトウェアのインストール、更新、削除、依存関係の管理などを行うことのできるツールであり、開発者がソフトウェアパッケージを効率的に管理し、特定のバージョンや依存関係を確保するのに役立ちます。
代表的なパッケージマネージャー
以下のものが挙げられます。(他にもたくさんあります。)
・npm : Node.jsのパッケージを管理する。
・pip : Pythonのパッケージを管理する。
・Homebrew : macOS用のパッケージマネージャー。
主な機能
- インストール
必要なソフトウェアパッケージを簡単にインストールできる。 - アップデート
インストールされているパッケージを最新バージョンに更新できる。 - アンインストール
パッケージを削除できる。 - 依存関係の管理
パッケージが他のパッケージに依存している場合、適切なバージョンを自動でインストールし、依存関係を解決する。 - リポジトリの管理
ソフトウェアパッケージのリポジトリ(ソース)を管理し、複数のリポジトリからパッケージを取得することができる。
npm vs pnpm
どちらもNode.jsのパッケージマネージャーですが、いくつかの違いがあります。
主な違い
-
ディスク使用量とインストール速度
・npmは各プロジェクトのnode_modulesフォルダーに直接パッケージをインストールします。これによって、同じパッケージが複数回インストールされ、ディスク使用量が増加する可能性があります。
・pnpmは、パッケージをグローバルストアに保存し、各プロジェクトにシンボリックリンクを作成します。これによって、同じパッケージをインストールすることはなくなり、ディスク使用量を節約することができます。また、この方法によりインストール速度も高速化されます。 -
依存関係の解決
・npmは依存関係をフラットにインストールしてしまうため、依存関係の競合を発生させる可能性があります。
・一方、pnpmはストリクトな依存関係を行います。各プロジェクトのnode_modulesフォルダにシンボリックリンクを使用して依存関係を配置するため、依存関係の競合やバージョンの不一致が発生しにくくなっています。 -
ワークスペースのサポート
・pnpmはモノレポ(単一のリポジトリに複数のプロジェクトを含む構成)を強力にサポートしています。ワークスペース機能を使用して、複数のパッケージ間で依存関係を簡単に管理することができます。 -
パフォーマンス
・npmは小規模なプロジェクトでは十分なパフォーマンスを発揮しますが、大規模なプロジェクトでは速度や効率の面がネックになってしまいます。
・pnpmは大規模なプロジェクトやモノレポで特に優れたパフォーマンスを発揮することができます。インストールやアップデートの速度が非常に早く、ディスク使用量も効率的です。
注意
多くの場合、npmでインストール可能なパッケージはpnpmでもインストールできるが、特定のパッケージやプロジェクトの設定によっては、できない場合があります。また、一部のビルドスクリプトやツールは、node_modulesのフラットな構造を前提としているため、pnpmのシンボリック方式では動作しないことがあります。
インストール
npm install
pnpm install
パッケージの追加
npm install
pnpm add
スクリプトの実行
npm run
pnpm run
コマンドの実行方法は多少違う部分がありますが、開発方法やコードの記述自体に大きな違いはありません。つまり、違いはパッケージの管理や依存関係の解決におけるパフォーマンスと効率的かという点です。
まとめ
pnpmは、高速で効率的なパッケージマネージャーである。
高速なインストール・効率的なディスク使用・依存関係の管理・モノレポのサポートという点において非常に特化しています。
大規模な開発をする際にはパッケージマネージャをpnpmにして、小規模な開発ではnpmを利用して使い分けるとそれぞれのメリットを享受することができると思いました。
私自身、今までnpmしか使ってこなかったのでこれからpnpmも視野に入れていきたいです。