O hirunewani blog

Q. npm, pnpm, yarn, npxの違いを一ミリも理解していない

Created at

npm、pnpm、yarn、npxの違いを一ミリも理解していないと相談を受けた際のメモ。

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ファイルも扱える
  • yarn v2,v3~(berry)

    • node_modulesにパッケージをインストールしないZero installsや、PnPを利用できるようになったバージョン
      • デフォルトはPnP
        • PnP嫌いな人がそこそこいるので不人気
      • yarn的にはZero installsが理想
        • git clone後にインストールしなくて良い
      • 従来のようにnode_modulesにインストールすることも出来るが設定が必要で面倒なのでv1が使われがち
    • v2時点では、ツールやライブラリがPnPをサポートしておらず、うまく動かないパッケージがたくさんあったが最近は落ちついている(が稀にあるので、あまり気軽に採用できない)
    • Yarn v2自身だけでなくBabelやJestが採用している
      • ただしYarn v2自身以外は、node_modulesモード
    • PnPによるインストールの効率化
      • node_modulesに展開せず、再圧縮してyarn/cacheへフラットに並べる
        • .yarn/cacheをgitにコミットするのがZero-installs
        • フラットに並べることでパッケージの重複、再展開を防ぎ、圧縮によって容量も軽減できる。
  • pnpm

    • performant npmの略
    • シンボリックリンクとハードリンクを駆使している
      • インストールが高速、1〜2倍
      • ディスク容量の軽減
      • パッケージの実態は、グローバルに管理される
      • node_modulsの中身はシンボリックリンクであるため、node_modules内に実態のあるファイルがあることを前提にしているパッケージ類は動かない。
        • 割とあった
        • 有名どころは対応済み
    • nodenv的な機能が内蔵されていたりする