2026/05/08(金)npmからpnpmに切り替えた
今までNode.jsのパッケージ管理は標準であるnpmを使っていたが、脆弱性の指摘や、高速性の観点からpnpmに切り替えることにした。
Yarnはなんかいけ好かない感じだったが、pnpmはnpmとコマンドの互換性があり、打ち辛いことを除いては使いやすい。公式ではエイリアスの設定を推奨しているが、エイリアスを前提とすると運用が辛いのとpnと言われても何のことやらわからないので私はそのまま使っている。ただただ打ち辛い。
互換性のあったコマンド
確認した限り次のコマンドは互換性があったため、基本的にnpmの頭にpを生やしてpnpmとするだけで問題ないのが便利だ。
npm startnpm tnpm inpm i <pkg名>npm i -D <pkg名>npm un <pkg名>npm version minornpm version patchnpm publishnpxpnpxで同じことができる
pnpm公式によるとパッケージの追加はpnpm add <pkg名>ないしpnpm add -D <pkg名>の様だが、npmの互換性のためなのかaddでなくiでも機能するようになっている。打鍵回数が減るのでありがたい。
便利なところ
インストールが爆速。グローバルインストールにエイリアスを持っているので極めて速い。
npm runのrunが不要になった。Yarnもそうだがrunなしでscriptを走らせることができる。便利だ。
パッケージのアップデートがpnpm upで一括でできるようになった。npmの時はnpm-check-updatesでpackage.jsonを更新したのちnpmを走らせる必要があり面倒だったが、これは便利だ。
セキュリティについて
セキュリティが強いらしいが、今のところ実感はない。
拙作の@lycolia/ts-boilerplate-generator-cliではグローバルインストール時に一回警告が出たがpnpm approve-builds -gというコマンドを叩いてパッケージを選択したら以後は出なくなった。恐らくpostinstall関連だと思われるが、よくわかっていない。
このコマンドを叩かないとパスが通らず実行できないようだったが、パッケージをアップデートしても再度は出なかったため、特別な設定をしない限り何かしらの攻撃を受ける可能性はありそうだなと思った。
やったこと
自分が使っているリポジトリでは以下の対応を行った。
- CIなどのスクリプト(シェルスクリプトや
package.jsonのscripts、GitHub Actions Workflow)にあるnpmをpnpmに、npm run xxxとしている箇所をpnpm xxxに、npxをpnpxに置き換えた - GitHub ActionsのWorkflowでpnpmを使えるようにした
actions/setup-nodeの手前にpnpm/action-setupを追加し、actions/setup-nodeでcacheの指定をpnpmとpnpm-lock.yamlに変更steps: - - uses: actions/setup-node@v6 + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 + with: + version: 10 + - uses: actions/setup-node@v6 with: node-version-file: .nvmrc - cache: npm - cache-dependency-path: package-lock.json + cache: pnpm + cache-dependency-path: pnpm-lock.yaml registry-url: 'https://registry.npmjs.org'npmをpnpmに、npxをpnpxに置き換え
- 不要になった
package-lock.jsonの削除
あとがき
結果としては打ち辛いこと以外満足している。
正直pnpmも登場した当初はYarn同様に、いけ好かないツールだなと思っていたが使ってみるとインストール速度が明らかに早く、npmの比較にならないこと(比べてないけど、たぶんYarnより早いと思う)や、なんかpnpmの勢いが強いので、流石にもうnpmは使えないなと判断して移行することにした。
pnpmが流行っている背景としては、恐らくYarn v3が酷評されているのと、連日のnpmパッケージの脆弱性騒動が背景にあるのだと思う。実際打ち辛いこと以外使いやすいし、勢いが出るのも納得という感じ。
ただpnpmが打ちづらすぎるのは何とかなってほしい。typoを狙ったpnmpみたいな悪意のあるパッケージが絶対にありそう。
てかv10のドキュメントではエイリアスの設定を推奨しているのに、v11からは削除されてて部分的にpnの記述が残ってるのはどうなのか…。ドキュメントの整備が追い付いていないのだろうか?
英語版でも同じなので何故削除したのかよくわからない。まぁエイリアス前提だとCIとかだるいし、そこが前提でないほうがドキュメント的にはよいと思うが…。