Closed2

npm vs yarn: yarn が 優れてる点を考える

devalondevalon

1. 速度

  • パッケージのインストール速度:
    • yarnはパッケージのインストールを並列で行い、これが速度向上に寄与している。
    • npmも現在は並列インストールをサポートしているものの、yarnは特にこの面での最適化が進んでいる。
  • キャッシュ処理:
    • yarnはキャッシュの読み書きを高速化しており、これが全体のパフォーマンスを向上させている。
    • 一部のベンチマークでは、この差は微小であるとも言われているが、CI/CDを頻繁に実行する大規模プロジェクトでは、累積すると顕著な差になる可能性がある。
    • 参照: https://zenn.dev/yukinissie/articles/84d83edab883ce
  • 依存関係の解決アルゴリズム:
    • yarnはnpmとは異なるパッケージ依存関係の解決ロジックを採用しており、これが効率的な処理につながっている。
  • パッケージサーバへのリクエスト方法:
    • yarnはRTT(ラウンドトリップタイム)を短縮するためのリクエスト方法を採用しており、これがインストール速度の向上に寄与している。

2. ロックファイルの存在

  • yarnは初期からロックファイルを採用しており、これによりパッケージのバージョン固定が可能になった。
  • ただし、npm v7以降、npmもロックファイルを導入しており、この点での優位性は薄れている。

3. モノリポ対応

  • yarnはワークスペース機能を通じてモノリポの運用をサポート。
  • しかし、一般的にはnxやlernaなどの他のツールを使用することが多く、yarn独自の価値は限定的。

4. 脆弱性セキュリティ対応

  • npmとyarnのセキュリティ対策の比較:
    • npmはnpm auditを提供しており、セキュリティ脆弱性が見つかった場合、関連する依存パッケージを最新のバージョンに更新する必要がある。これは、特に大規模なプロジェクトにおいて、リグレッションテストの負担増加につながることがある。
    • yarnのyarn resolutionsを使用すると、特定の依存パッケージだけを強制的に特定のバージョンに更新することができる。これにより、他の依存パッケージのバージョンを変更することなく、セキュリティ上の問題を解決することが可能。結果として、リグレッションテストの必要性が大幅に減少させる。

具体的な例

  • npm audit (force) の場合:
    • モジュールAとモジュールBが共にモジュールCに依存していると仮定。モジュールCのバージョン1.0.0に脆弱性が発見され、1.0.1に修正された場合、npm audit (force)ではモジュールAとモジュールBを最新版に更新する必要がある。
    • これには副作用があり、モジュールAとモジュールBの両方のバージョンが変更されるため、関連するすべての機能に対するリグレッションテストが必要になる。特にモジュールBがメジャーバージョンアップする場合、さらに複雑なマイグレーション作業が必要になる可能性がある。※ backportは考えない
  • yarn resolutions の場合:
    • yarn resolutionsを使用すると、モジュールCのみをバージョン1.0.1に強制的に更新し、モジュールAとモジュールBのバージョンは変更せずに済む。これにより、リグレッションテストの範囲を大幅に狭めることができ、更新プロセスをよりスムーズかつ安全に行うことが可能となる。

結論

年々、差はなくなってきているけど、脆弱性対応とかが yarn のほうが優れてるかなあという印象。大規模なプロジェクトになっていく+積み重なる運用コストを考えると結局のところ、 yarn を選ぶ方が良さそう。エンジニアとしては大規模なプロジェクト=うまくいってるサービスなので、問答無用で yarn を選んでいきたいなあと思った。

devalondevalon

Claude さんの要約

npm vs yarn: 現在のパッケージマネージャーの選択基準
長年JavaScriptエコシステムのデファクトスタンダードであったnpmですが、後発のyarnに多くの場面でその座を奪われつつあります。最新の動向を踏まえつつ、なぜ最近はyarnの方が優先的に選ばれるケースが増えているのか、その要因を考察したいと思います。

パフォーマンス比較
従来の常識では、yarnの方が高速なインストールとキャッシュ処理を実現しているとされていました。しかし最新のベンチマークを見る限り、大幅に差は縮小されつつあり、プロジェクト次第では逆転するケースすら見られます。決定打となる明白な差ではなくなってきています。

セキュリティ脆弱性への対応力
比較的新しい動向として、脆弱性対応機能におけるyarnの優位性がクローズアップされています。yarnが提供する resolutions 機能は、他への影響範囲を局限しつつ最小限の変更で問題をパッチできるという観点で大きな強みがあります。複雑化するJS依存関係を抱える大規模プロジェクトにとって、この点ではyarnがより現実的な選択といえるでしょう。

Lerna等外部ツールとの連携性
モノリポ開発において、yarn workspace対応を挙げるケースも多いですが、LernaやTurborepoといった外部ツールとの相性の高さも重視されつつあります。マイクロフロント構成などでこうしたツール活用が前提化している場合、むしろyarnよりもnpmの方が自然な選択となる可能性すらあり、一概には言えません。

このスクラップは2024/01/12にクローズされました