🏄‍♂️

もう迷わない!npm, pnpm, yarn の違いを理解しよう!

に公開

npm、pnpm、yarn それぞれ何が違うの?

はじめに

こんにちは!もっくんと申します 🖐️!個人開発やチームでの開発を進めていると、npm install や yarn add といったコマンドを何気なく使っている場面は多いのではないでしょうか。
私自身も、 「pnpm は速いらしい」と聞いてから、特に深く考えずに pnpm を使ってきました。 しかし、ふと「yarn add ってよく見るけど、あれって何なんだろう?」という疑問が湧き、それぞれのパッケージマネージャーが持つ思想や仕組みの違いを調べてみることにしました。

これらは Node.js のパッケージマネージャーと呼ばれるツールですが、「npm」「pnpm」「yarn」といった複数の選択肢があり、それぞれに特徴があることはご存知でしたか?

この記事では、それぞれのパッケージマネージャーが持つ思想や仕組みの違いを、初心者の方にも分かりやすく解説します。この記事を読めば、あなたの次のプロジェクトに最適なツールを選ぶ手助けになるはずです。

対象読者

  • プログラミング初学者の方
  • 個人開発を始めたばかりの方
  • npm しか使ったことがなく、他のパッケージマネージャーとの違いがよくわからない方
  • 何気なく pnpm を使っている方

パッケージマネージャーとは?

ソフトウェア開発、特に現代の Web 開発では、車輪の再発明を避けるために、他の人が作成した便利な機能(「パッケージ」や「ライブラリ」と呼ばれます)を組み合わせてアプリケーションを構築するのが一般的です。

例えば、「日付をフォーマットする機能」や「複雑な計算をしてくれる機能」などがパッケージとして公開されています。

パッケージマネージャーは、これらのパッケージを効率的に管理するためのツールです。具体的には、以下のような役割を担います。

  • インストール: 必要なパッケージをインターネット上からダウンロードして、プロジェクトで使えるように配置します。
  • アンインストール: 不要になったパッケージをプロジェクトから削除します。
  • バージョン管理: 「A というパッケージのバージョン 1.2.3 を使う」といったように、パッケージのバージョンを正確に管理し、チームメンバー全員が同じバージョンのパッケージを使えるようにします。
  • 依存関係の解決: パッケージ A がパッケージ B に依存している場合(A を使うためには B が必要)、B も自動的にインストールしてくれます。この依存関係は非常に複雑になることがあり、パッケージマネージャーがこれを解決してくれるおかげで、開発者は本来の作業に集中できます。

npm, pnpm, yarn は、このパッケージマネージャーの一種で、主に Node.js で書かれた JavaScript のパッケージを管理するために利用されます。


各パッケージマネージャーの特徴

それでは、3 つのツールそれぞれの特徴を見ていきましょう。

npm (Node Package Manager)

npmは、Node.js をインストールした際に一緒にインストールされる、いわば「公式」のパッケージマネージャーです。最も歴史が古く、多くの開発者に利用されてきた実績があります。

  • Node.js に標準で付属: 追加のインストール作業が不要で、Node.js 環境があればすぐに使い始められます。
  • 巨大なエコシステム: 世界最大のソフトウェアレジストリ(パッケージ置き場)である npm レジストリと直結しており、利用できるパッケージの数は圧倒的です。
  • package.jsonpackage-lock.json:
    • package.json: プロジェクトで利用するパッケージの名前とバージョンの範囲(例:「バージョン 1.2 以上」)を記録します。
    • package-lock.json: インストールされたパッケージの正確なバージョンと、そのパッケージが依存する他のパッケージのバージョン情報をすべて記録します。これにより、他の環境でも全く同じバージョンのパッケージを再現できます。

node_modules の構造

npm は、インストールしたパッケージをプロジェクトルートの node_modules というディレクトリに格納します。初期の npm では、パッケージの依存関係がネスト(入れ子)構造になっており、同じパッケージが複数箇所にダウンロードされることで、ディスク容量を圧迫したり、ファイルパスが長くなりすぎるといった問題がありました。

現在ではこの問題は改善されていますが、後述する pnpm は、この node_modules の仕組みに根本的な違いを持ち込むことで、さらなる効率化を実現しています。

yarn

yarnは、2016 年に Facebook(現 Meta)によって開発されました。当時の npm が抱えていたパフォーマンスやセキュリティ、一貫性の問題を解決することを目的として登場しました。

  • パフォーマンスと安定性の向上: npm よりも高速なパッケージのインストールを実現しました。複数のパッケージを並列でダウンロード・インストールすることで、待ち時間を短縮します。
  • yarn.lock ファイル: npm の package-lock.json と同様に、パッケージの正確なバージョンを記録するためのファイルです。これにより、開発者間でのバージョンのズレを防ぎ、依存関係の一貫性を保ちます。
  • オフラインインストール: 一度インストールしたパッケージはキャッシュに保存され、次回以降はオフライン環境でも(キャッシュから)インストールが可能です。

登場時、yarn は npm に比べて多くのメリットがありましたが、その後 npm 自身もバージョンアップを重ね、yarn の優れた機能(lock ファイルや高速化など)を取り込んできました。そのため、現在では両者の機能的な差は小さくなっています。

pnpm (performant npm)

pnpmは、「performant npm(高性能な npm)」の略で、特にディスク容量の節約インストール速度の向上に焦点を当てたパッケージマネージャーです。

  • ディスク容量の効率化: pnpm の最大の特徴は、パッケージの管理方法にあります。マシン上のグローバルなストア(保管場所)にパッケージを一度だけ保存し、プロジェクトではそのパッケージへのシンボリックリンク(ショートカットのようなもの)を node_modules 内に配置します。これにより、複数のプロジェクトで同じパッケージを利用していても、ディスク上には一つのパッケージしか存在しないため、大幅なディスク容量の節約になります。

  • 高速なインストール: 上記の仕組みにより、既に他のプロジェクトで使ったことのあるパッケージは、新たにダウンロードする必要がなく、ストアからリンクを作成するだけなので、インストールが非常に高速です。

  • 厳格な依存関係管理: pnpm は、package.jsonに明示的に記載されていないパッケージへのアクセスを許可しません。これは「幽霊依存(Phantom Dependencies)」と呼ばれる問題を解決し、コードが意図しないパッケージに依存してしまうことを防ぎます。これにより、より信頼性の高いアプリケーションを構築できます。

node_modules の構造が npm や yarn とは異なるため、一部の古いツールでは問題が発生する可能性がありましたが、現在ではエコシステムの対応も進み、多くのプロジェクトで採用されるようになっています。


比較まとめ

特徴 npm yarn pnpm
インストール速度 普通(改善されている) 速い 非常に速い(特に 2 回目以降)
ディスク使用量 多い 多い 非常に少ない
依存関係の解決 フラットに近い構造 フラットに近い構造 シンボリックリンクを利用した厳格な構造
標準搭載 ◎ (Node.js に同梱)
歴史と安定性

なぜ pnpm はディスクに優しく、速いのか?

もう少しだけ pnpm の仕組みを深掘りしてみましょう。

  • npm/yarn の場合: プロジェクト A とプロジェクト B で同じパッケージ(例: lodash)を使う場合、それぞれのプロジェクト内の node_moduleslodash がコピーされます。PC 全体で見ると、同じ内容のファイルが 2 つ存在することになります。
  • pnpm の場合: lodash は PC 内の一箇所(グローバルストア)にだけ保存されます。プロジェクト A と B の node_modules には、その lodash へのリンクが置かれるだけです。ファイルの実体は 1 つなので、ディスク容量を節約できます。また、2 回目以降のインストールでは、ダウンロードせずにリンクを貼るだけなので高速です。

この仕組みは、ハードディスクの容量が限られている環境や、多くのプロジェクトを同時に管理する開発者にとって、大きなメリットとなります。

結論:どれを選ぶべきか

結局のところ、どのパッケージマネージャーを選ぶべきでしょうか?
2025 年現在、それぞれのツールは成熟しており、決定的な優劣があるわけではありません。しかし、それぞれの特徴を踏まえると、以下のような選択が考えられます。

  • 個人開発や小規模なプロジェクト、学習目的の場合:

    • pnpm を第一候補として推奨します。ディスクスペースの節約とインストール速度は、開発体験を大きく向上させます。特にこだわりがなければ、pnpm から始めてみるのが良いでしょう。
    • npm も依然として良い選択肢です。Node.js に標準で付属しているため、環境構築が最も簡単です。
  • チーム開発や既存のプロジェクトに参加する場合:

    • プロジェクトで使われているツールに従うのが鉄則です。package-lock.json があれば npm、yarn.lock があれば yarn、pnpm-lock.yaml があれば pnpm を使います。これにより、チーム内での環境の差異をなくし、予期せぬ不具合を防ぎます。
  • yarn を選ぶケース:

    • yarn v2 以降で導入された「Plug'n'Play (PnP)」という node_modules を使わない先進的な機能に魅力を感じる場合は、yarn を選択する価値があります。ただし、これは従来の node_modules の仕組みとは大きく異なるため、学習コストやエコシステムとの互換性を考慮する必要があります。

最終的には、個人の好みやプロジェクトの要件によって最適なツールは異なります。この記事を参考に、ぜひ一度それぞれのツールを試してみてください。

おまけ 1:npx とは?

npm の話をするときに、npx というコマンドもよく登場します。これはパッケージマネージャーそのものではありませんが、非常に便利なツールなのでここで紹介します。

npx は、npm version 5.2 から同梱されるようになったパッケージ実行ツールです。

主な役割は、パッケージを一時的にインストールして、そのコマンドを実行し、実行後にはクリーンアップしてくれることです。

npx を使うメリット

例えば、create-react-app という React のプロジェクトをセットアップするパッケージを使いたいとします。

npx を使わない場合:

  1. npm install -g create-react-app で、PC のグローバル領域にパッケージをインストールする。
  2. create-react-app my-app を実行する。
  3. (使い終わったら) npm uninstall -g create-react-app でグローバルから削除する。(削除し忘れると古いバージョンが残り続ける可能性がある)

npx を使う場合:

  1. npx create-react-app my-app を実行するだけ。

npx は、create-react-app がローカルやグローバルにインストールされているかを確認し、なければ最新版を一時的にダウンロードしてコマンドを実行、終わればそのパッケージを破棄します。

これにより、以下のようなメリットが生まれます。

  • 常に最新版を利用できる: グローバルにインストールしたままだと、次に使うときにバージョンが古くなっている可能性があります。npxなら毎回最新版を使うことができます。
  • PC 環境を汚さない: 一度しか使わないかもしれないコマンドのために、グローバル領域を汚す必要がありません。

yarn には yarn dlxpnpm には pnpm dlx という同様の機能があります。

プロジェクトの初期設定や、たまにしか使わない CLI ツール(コマンドラインで操作するツール)を実行する際に、非常に強力な助けとなります。

おまけ 2: よく使うコマンド対応表

最後に、基本的なコマンドの対応表を載せておきます。どのツールを使うにしても、基本的な操作は似ています。

タスク npm yarn pnpm
パッケージのインストール npm install <pkg> yarn add <pkg> pnpm add <pkg>
開発用パッケージのインストール npm install -D <pkg> yarn add -D <pkg> pnpm add -D <pkg>
パッケージのアンインストール npm uninstall <pkg> yarn remove <pkg> pnpm remove <pkg>
依存関係のインストール npm install yarn install pnpm install
スクリプトの実行 npm run <script> yarn <script> pnpm <script>

Discussion