npmとpnpmの違いとpnpmの良さについて

npm vs pnpm
  • URLをコピーしました!

この記事では、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はプロジェクトが正確にどのパッケージとバージョンに依存しているかを厳格に管理でき、他のパッケージマネージャーに比べて安全性とパフォーマンスを向上させています。

プロジェクトの構造

以下のプロジェクト構造を考えます。プロジェクトルートにはapp1app2という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を使って、安全で効率の良い開発をしましょう!

npm vs pnpm

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次