最終更新:

npm・Yarn・pnpmの違い — 既存プロジェクトでまず見る3つのファイル


プロジェクトの「案内・道具・記録」を読む

① README導入・起動・ビルドの手順② package.json指定版・依存・scripts③ ロックファイル解決した依存関係の記録チームとCIの道具・版をそろえる
npm・Yarn・pnpmでロックと配置方式が違います。切り替える前に、今の手順とCIが使う設定を確認します。
ひよこ ひよこ
既存のプロジェクトでnpm・Yarn・pnpmのどれを使えばいいか、どこを見るの?
ペンギン先生 ペンギン先生
どれも「パッケージマネージャー」といって、JavaScriptのライブラリをダウンロード・管理してくれるツールだよ。npmはNode.jsをインストールすると最初から付いてくる標準ツールで、yarnとpnpmは後から登場した代替ツールなんだ。
ひよこ ひよこ
じゃあpnpmはどういう特徴があるの?
ペンギン先生 ペンギン先生
pnpmの最大の特徴は「コンテンツアドレッサブルストレージ」という仕組みだよ。普通はプロジェクトごとにnode_modulesにライブラリのコピーを置くんだけど、pnpmは共有ストアでファイルを再利用し、通常のnode_modules構成ではリンクで依存関係を組み立てるんだ。ストアの配置やファイルシステム、設定によって保存方法は変わるので、PC全体で必ず1か所という意味ではないよ。
ひよこ ひよこ
なるほど、同じライブラリを何回もダウンロードしなくていいんだね。速度はどれが一番速いの?
ペンギン先生 ペンギン先生
一律の順位は付けられないよ。ツールの版、依存関係、キャッシュ、ネットワーク、インストール方式で変わる。自分のプロジェクトで、キャッシュが空の初回と再インストールを分けて測定しよう。
ひよこ ひよこ
ロックファイルっていうのも種類が違うの?
ペンギン先生 ペンギン先生
そうだよ。npmはpackage-lock.json、yarnはyarn.lock、pnpmはpnpm-lock.yamlを使うんだ。どれも「このプロジェクトで使うライブラリの正確なバージョン」を記録するファイルで、チームメンバー全員が同じバージョンを使えるようにする役割があるよ。チームでは採用したツールのロックを共有し、CIも同じ版・設定に揃えよう。npmならnpm ciを使うと、package.jsonとロックが食い違った場合に失敗して気づけるよ。
ひよこ ひよこ
モノレポっていう大きなプロジェクト構成にも対応しているの?
ペンギン先生 ペンギン先生
3つともワークスペース機能でモノレポに対応しているよ。npmとyarnはpackage.jsonのworkspacesフィールドで設定して、pnpmはpnpm-workspace.yamlという専用ファイルで管理するんだ。対応ツールや依存解決の違いも確かめて選ぼう。
ひよこ ひよこ
最近「corepack」っていうのも聞くけど、あれは何なの?
ペンギン先生 ペンギン先生
Corepackはプロジェクトで使うパッケージマネージャーの版を管理するツールだよ。Node.js 25以降は同梱されないので、導入状況を確認しよう。packageManagerには「pnpm@10.0.0」のように具体的な版を指定する。この数字は書式の例で、推奨版ではないよ。
ひよこ ひよこ
へえ、便利だね。ところでpnpmの「厳格なnode_modules」って何がいいの?
ペンギン先生 ペンギン先生
依存を上位にまとめる構成では、未宣言のライブラリが偶然使える「幽霊依存」が起きやすい。pnpmの通常構成はこれを減らすけど、ホイスト設定などの例外もあるよ。YarnもClassicの構成と現行版の既定PnPを区別しよう。PnPはnode_modulesを作らず、未宣言依存も検出するんだ。
ひよこ ひよこ
結局、初心者はどれを使えばいいの?
ペンギン先生 ペンギン先生
迷ったらまずはnpmで始めるのが一番無難だよ。Node.jsに付いてくるから追加インストール不要だし、既存のプロジェクトなら、まずその手順に合わせよう。慣れてきてディスク容量や速度が気になったらpnpmを試してみるといいよ。チームで開発するなら、プロジェクトで統一されているものに合わせるのが大事だね。

既存プロジェクトなら、まず手順を見る

新しく参加したプロジェクトで、いきなり好みの道具へ切り替える必要はありません。まずREADME、package.json、ロックファイルを見て、チームとCIが使う手順に合わせます。

ファイル何を読む?
README導入・起動・ビルドのコマンド
package.json依存関係、scripts、packageManagerやenginesの指定
ロックファイル解決された依存関係や整合性の情報

通常、npmならpackage-lock.json、Yarnならyarn.lock、pnpmならpnpm-lock.yamlが目印です。複数あるときは、どれが有効かを管理者やCI設定で確認します。ロックだけでOS・Node.js・ツールの版やすべての実行結果が一致するわけではありません。

新しい練習なら、npmで小さく確認

Node.jsとnpmのある環境で、新しい空の練習用フォルダーを作って実行します。色付き文字を扱うpicocolorsを例に、依存関係を追加する流れを見ます。

npm init -y
npm install picocolors
npm ls picocolors --depth=0

package.jsonに依存が追加され、package-lock.jsonに解決した情報が残ります。その後npm ciを実行すると、ロックに基づいてクリーンインストールします。既存のnode_modulesは取り除かれるので、練習用で試しましょう。package.jsonとロックが食い違うと、更新せずに失敗します。

npm ci

これで「追加する操作」と「記録した依存をそろえる操作」を区別できます。実際のプロジェクトでは、必要な設定・Node.js・npmの版もCIと合わせます。

3つの違いは、配置と運用の条件から見る

項目npmYarnpnpm
導入通常Node.jsに付属指定版を入れる指定版を入れる
配置node_modules既定はPnP。方式を選べるストアとリンク
記録package-lock.jsonyarn.lockpnpm-lock.yaml
確認版・設定・CI版・設定・CI版・設定・CI

表のYarnは現行版です。Classicと区別し、PnP以外の配置方式や、pnpmのストア・ホイスト設定もプロジェクトに合わせて確認します。

現行YarnのPnPはローダーファイルで依存へアクセスし、通常node_modulesを作りません。pnpmの通常構成では共有ストアを使い、リンクで依存を組み立てます。設定やファイルシステムで変わるので、必ずPC全体に1コピーだけという保証ではありません。

未宣言の依存が偶然使える状態は避けたいものです。PnPやpnpmの通常構成は検出や削減に役立ちますが、設定と互換性も確認します。速度もキャッシュ・回線・依存の数などで変わるため、一律に順位を決めません。

切り替えるなら、ロックとCIまで一緒に

Corepackは使う道具の版を管理する選択肢で、Node.js 25以降には同梱されません。導入状況を確認し、packageManagerには具体的な版を指定します。

npmからpnpmへ移す場合は、既存ロックを保存した作業ブランチでpnpm importを使う方法があります。ワークスペースは先にpnpm-workspace.yamlへ宣言します。新しいロックでテスト・ビルドを確認し、CIと開発環境もそろえてから切り替えます。

最初の動く画面はJavaScript入門、ツールを含む型チェックの練習はTypeScript入門へ。

参考資料