pnpm を使う

● pnpm の特徴

  • ハードリンクを使うので使用するディスク容量が圧倒的に少なくなる
  • node.js のバージョン管理もできる(volta , nodenv 不要です)
  • npmパッケージインストールが速い(ただし最速を求めるなら bun の方が圧倒的に速いです)
  • セキュリティに配慮したオプションがある
・--ignore-scripts(デフォルトでオン になっています)
・minimumReleaseAge

● pnpm をインストールする

npmを使う

npm install -g pnpm

volta を使っている場合はこちら

volta install pnpm

// バージョン指定、例えばバージョン12をインストールする場合はこちら
volta install pnpm@12

brewを使う(めっちゃ遅いです)

brew install pnpm

● pnpm のバージョンを確認する

pnpm -v
11.0.7

コマンド名を p にしておく

.bash_profile や .zshrc

alias p='pnpm '

とすると

p i 

で pnpm install できます!

● pnpmの設定を確認する

# 1. デフォルト場所の確認
ls -la ~/.local/share/pnpm/store

# 2. pnpmのバージョン確認
pnpm --version

# 3. 実際のストア場所を確認
pnpm store path

# 4. すべての設定を確認
pnpm config list

● pnpm , npm でローカルパッケージの扱いの違い

pnpm , npm でローカルパッケージのリンク構造の違いがおきます

例えば ../../にローカルパッケージ *my-local-package** がある場合

メインのアプリの node_modules では以下のようなリンクとなります

npm の場合 : my-local-package -> ../../my-local-package
pnpmの場合 : my-local-package -> .pnpm/my-local-package@file+..+my-local-package_...

pnpmでローカルパッケージにエラーが出る場合は

https://www.reddit.com/r/node/comments/1db000r/unable_to_install_local_package_in_pnpm_workspace/?tl=ja

.npmrc

link-workspace-packages = true
prefer-workspace-packages = true
recursive-install = true

各設定の効果

link-workspace-packages = true ワークスペース内に存在するパッケージがあれば、レジストリからダウンロードせずにローカルのものをnode_modulesにリンクします。

prefer-workspace-packages = true レジストリ上に同名パッケージがあっても、ワークスペースローカルのものを優先的に使います。

recursive-install = true ワークスペース配下の全てのパッケージの依存を再帰的にインストールします。pnpm install実行時、全体的に依存追加・更新が反映されます。

● プロジェクトを pnpm で強制させる設定

  "engines": {
    "node": ">=24",
    "pnpm": ">=11",
    "npm": "please-use-pnpm. このプロジェクトでは pnpm を使用してください"
  }

実行例( npmコマンドでインストールを実行しようとすると以下のエラーが出ます)

npm install xxxxx

npm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: p_test@1.0.0
npm error notsup Not compatible with your version of node/npm: p_test@1.0.0
npm error notsup Required: {"node":">=24","pnpm":">=11","npm":"please-use-pnpm. このプロジェクトでは pnpm を使用してください"}
npm error notsup Actual:   {"npm":"10.8.1","node":"v24.14.1"}

● npm ci 相当のコマンド

npm ci に相当する pnpm のコマンドは pnpm version 11 から 同じ pnpm ci というコマンドが追加されましたのでこれを使いましょう

pnpm ci

● pnpm自身でバージョンを自動的に変更する

volta , mise , Proto などを使ってない場合に以下のようにして バージョンを自動的に設定することができます (pnpmによる独自拡張)

"devEngines": {  
  "packageManager": {  
    "name": "pnpm",  
    "version": "^12",  // 範囲指定OK 。ただし Corepack を使っている場合はエラーになることがあるのでその時は 12.0.0 などと指定する
    "onFail": "download"  
  }  
} 

● pnpm運用のプロジェクトで npm install を禁止する

pnpmを使うプロジェクトで、誤ってnpm installを実行してしまうとnode_modulesが壊れることがあります。lifecycle script(preinstallなど)に頼らず、.npmrcの設定だけで防げます。

## やること

package.jsonに非semver文字列のengines.npmを書く。

`json {

"engines": {
  "npm": "このプロジェクトでは pnpm を使用しています",
  "pnpm": "11"
}

} `

.npmrcに1行追加する。

`ini engine-strict=true `

## 仕組み

  • npmはenginesフィールドをチェックする際、値が正しいsemver範囲でなければ不一致として扱う
  • engine-strict=trueがあると、不一致時にnpmは即座にエラー終了する
  • pnpm(v11以降)は.npmrcのauth/registry以外の設定を読まないため、engine-strictの影響を受けない

## 結果

$ npm i npm error code EBADENGINE npm error engine Unsupported engine npm error notsup Required: {"npm":"このプロジェクトでは pnpm を使用しています","pnpm":"11"} npm error notsup Actual: {"node":"v26.5.1","npm":"11.17.0"}

$ pnpm i Done in 5.2s using pnpm v11.17.0

npmだけがブロックされ、pnpmは通常どおり動く。

No.2644
08/28 12:01

edit