Q. npm, pnpm, yarn, npxの違いを一ミリも理解していない
npm、pnpm、yarn、npxの違いを一ミリも理解していないと相談を受けた際のメモ。
Table of Contents
- # npmとnpxの違い
- # npxの歴史
- # npm、yarn、pnpmの比較
npmとnpxの違い
- npm : node package manager
- yarn
- pnpm
- npx : node package executer
- yarn dlx
- pnpm dlx
- npxと打った方がはやいのでnpxが使われがち
npxの歴史
- npm v5: npxが同梱されるようになった
- 独立したパッケージであった
- ローカルにインストールされているパッケージを実行できた
- npm v7: npm execのエイリアスに変更
- ローカルにないパッケージを実行しようとした場合、インストールを促すようになった
npm、yarn、pnpmの比較
コマンド:ほぼ同じか、代替方法があるのでなんとなくで問題ない
インストール速度:npm ≤ yarn v1 << yarn v2 (berry) < pnpm ≤ yarn v3 (berry)
インストール方法:
-
npmとyarn v1はほぼ同じ
-
yarn v2~とpnpmは早いが、エッジケースがある
-
npm
- 公式
-
yarn v1
- npmにあった問題を解決するために作られた
- インストールの再現性
- インストール速度
- セキュリティ
- npmにない独自機能が追加されていた
- Monorepoサポート
- ライセンスの確認
- インタラクティブアップデート
- …
- 現在は、yarnの多くの機能がnpmに取り込まれ、最新のnpmではほぼ差はない
- yarnで生成されたlockファイルも扱える
- npmにあった問題を解決するために作られた
-
yarn v2,v3~(berry)
- node_modulesにパッケージをインストールしないZero installsや、PnPを利用できるようになったバージョン
- デフォルトはPnP
- PnP嫌いな人がそこそこいるので不人気
- yarn的にはZero installsが理想
- git clone後にインストールしなくて良い
- 従来のようにnode_modulesにインストールすることも出来るが設定が必要で面倒なのでv1が使われがち
- デフォルトはPnP
- v2時点では、ツールやライブラリがPnPをサポートしておらず、うまく動かないパッケージがたくさんあったが最近は落ちついている(が稀にあるので、あまり気軽に採用できない)
- Yarn v2自身だけでなくBabelやJestが採用している
- ただしYarn v2自身以外は、node_modulesモード
- PnPによるインストールの効率化
- node_modulesに展開せず、再圧縮してyarn/cacheへフラットに並べる
- .yarn/cacheをgitにコミットするのがZero-installs
- フラットに並べることでパッケージの重複、再展開を防ぎ、圧縮によって容量も軽減できる。
- node_modulesに展開せず、再圧縮してyarn/cacheへフラットに並べる
- node_modulesにパッケージをインストールしないZero installsや、PnPを利用できるようになったバージョン
-
pnpm
- performant npmの略
- シンボリックリンクとハードリンクを駆使している
- インストールが高速、1〜2倍
- ディスク容量の軽減
- パッケージの実態は、グローバルに管理される
- node_modulsの中身はシンボリックリンクであるため、node_modules内に実態のあるファイルがあることを前提にしているパッケージ類は動かない。
- 割とあった
- 有名どころは対応済み
- nodenv的な機能が内蔵されていたりする