この記事では、JavaScriptの世界で広く使われているパッケージマネージャーであるnpmと、近年人気が高まっているpnpmの違いに焦点を当て、pnpmの厳格なパッケージ管理についても詳しく解説します。
僕もpnpmを使っていますが、インストールは早いし、バージョン管理や依存関係の管理が厳しくて、非常に使いやすくて、安全でめっちゃ良いです!
npmとは
npmはNode.jsのデフォルトパッケージマネージャーで、Node.jsと共にインストールされます。npmは、モジュールのインストール、バージョン管理、依存関係の解決など、JavaScriptプロジェクトの管理に必要な機能を提供します。npmは、パッケージをネストされた方式でインストールします。これは、異なるパッケージで同じ依存関係がある場合、それぞれのパッケージフォルダに同じ依存関係がコピーされることを意味します。
pnpmとは
pnpmは、パフォーマンスの向上とディスクスペースの節約を目的として作られたパッケージマネージャーです。pnpmは、シンボリックリンクと呼ばれる方法を使用して、一度ダウンロードしたパッケージを共有します。これにより、異なるプロジェクト間で同じパッケージの複数のコピーを保存する必要がなくなり、インストール速度が向上し、ディスクスペースが節約されます。また、pnpmは「厳格なパッケージ管理」を提供することで知られており、プロジェクトが明示的に宣言していないパッケージを使用することを防ぎます。
pnpmの厳格なパッケージ管理
pnpmの厳格なパッケージ管理は、プロジェクトが依存しているパッケージだけを使用できるように制限することによって実現されます。これは、node_modules
の構造とシンボリックリンクを用いた独自の方法により行われます。たとえば、あるパッケージが他のパッケージに依存している場合、その依存関係はプロジェクトのnode_modules
フォルダ内に直接配置されず、代わりにシンボリックリンクが作成されます。これにより、依存関係の木がより明確になり、不要なパッケージの混入を防ぎます。
プロジェクトルート/
├── node_modules/
│ ├── .pnpm/
│ │ └── 依存関係の実体
│ └── 依存関係へのシンボリックリンク
└── pnpm-lock.yaml
この構造により、pnpmはプロジェクトが正確にどのパッケージとバージョンに依存しているかを厳格に管理でき、他のパッケージマネージャーに比べて安全性とパフォーマンスを向上させています。
プロジェクトの構造
以下のプロジェクト構造を考えます。プロジェクトルートにはapp1
とapp2
という2つのディレクトリがあり、それぞれが独自のパッケージを持っています。
プロジェクトルート/
├── app1/
│ ├── node_modules/
│ │ └── パッケージA
│ └── package.json
└── app2/
├── node_modules/
│ └── パッケージB
└── package.json
app1
内のコードは、app1/node_modules
内にインストールされたパッケージAを参照できますが、app2/node_modules
内のパッケージBを直接参照することはできません。- 同様に、
app2
内のコードは、app2/node_modules
内にインストールされたパッケージBを参照できますが、app1/node_modules
内のパッケージAを直接参照することはできません。
例えば、app1
内のファイルでパッケージBをインポートしようとすると、以下のようなコードになりますが、これは失敗します。
// app1内のファイルからapp2のパッケージBをインポートしようとする
const packageB = require('パッケージB'); // これはエラーを引き起こします
このコードは、app1/node_modules
にはパッケージB
が存在しないため、モジュールが見つからないというエラーを引き起こします。
各サブプロジェクトは、それぞれが必要とする依存関係を自身のpackage.json
に明記し、自身のnode_modules
にインストールする必要があります。共有が必要な場合は、共通のライブラリを別のパッケージとして抽出し、それを両方のプロジェクトで依存関係として追加することを検討する必要があります。これにより、各サブプロジェクトは独立して動作し、依存関係の衝突や混乱を避けることができます。
まとめ
npmとpnpmは、JavaScriptのパッケージ管理に広く使われていますが、pnpmは、特に大きなプロジェクトや多数のプロジェクトを扱う場合に、そのパフォーマンスの高さとディスクスペースの節約が優れているので新しいプロジェクトを作成するときはpnpmを使うべきでしょう!また、pnpmの厳格なパッケージ管理は、より安全で信頼性の高い開発環境を提供します。pnpmを使って、安全で効率の良い開発をしましょう!