npmとYarn。どちらのパッケージマネージャーを選ぶべきか？【和訳】

以下は[NPM vs. Yarn: Which Package Manager Should You Choose?](https://www.whitesourcesoftware.com/free-developer-tools/blog/npm-vs-yarn-which-should-you-choose/)という記事の和訳です！

npmとyarnのどちらがより優れているかを調べてるところこの記事を拝見し、英語の勉強がてら翻訳して見ました！

以下の７つの観点からnpmとYarnのどちらが優れているかを比較したものです。
・人気の面
・インストールの面
・依存関係の管理の面
・パフォーマンスの面
・セキュリティの面
・アップデートの面
・CLIコマンドの面

## 人気の面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/0cda5dac-a37d-c4ca-117d-b4c5371e3548.png)

まだnpmの方が人気が高い。
しかしながら、その２つのツールの人気を比較するためにGithubの活動の範囲を見れば、Yarnの方が活動的である。
2021年6月1日現在
### npm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/8ce62620-5c6e-7f00-a640-4307db902867.png)

### Yarn
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/faf6fefe-2dde-69e2-b08e-c5823c90af72.png)


## インストールの面
npmはNode.jsをインストールすれば自動的にインストールされるので、yarnよりもインストールが容易である。
yarnをインストールするには以下のコマンドで可能である。

```shell:shell
 npm install yarn
```

## 依存関係の管理の面
しかしながら、yarnはnpm経由でyarnをインストールすることを推奨していない。自分のパソコンのシステム要件に応じて、インストール方法を選択することができる。[Install option](https://classic.yarnpkg.com/en/docs/install#solus-stable)

どちらもプロジェクトのワーキングディレクトリのルートディレクトリにpackage.jsonを提供する。

両者ともnode_modulesに依存関係ファイルを蓄積する。しかしながら、yarn 2ではこのフォルダがサポート対象外になった。
さらに両者ともプロジェクトで使用されている依存関係の正確なバージョンのエントリを含むロックファイルを提供する。
yarnにおいてはyarn.lock。npmではpackage-lock.jsonとなる。これらのファイルは、package.jsonファイルにバージョン管理パラメータを設定した後、インストールプロセス中に依存関係を規定のバージョンにロックします。

以上のように依存関係の管理において、Yarnとnpmは似たようなスタイルで依存関係を管理していますが、デフォルトでインストールされているものとは異なるレジストリが指定されている場合を除き、一緒に使用しないことをお勧めします。これらを併用すると、特にロックファイルが同期していないことによる解決の不整合により、コンフリクトが発生する可能性があります。

それにもかかわらず、Yarnは最近、2つのパッケージマネージャ間の認識を高め、開発者がnpmからYarnにスムーズに移行できるようにする新機能を発表しました。この新機能は開発者たちが、npmのpackage.jsonから依存関係をインポート、そしてインストールすることを可能にしました。特に、yarn/npmが混在している環境や、既存のプロジェクトをYarnに移行しようと考えている人にとっては、便利な改善です。

package.jsonファイルを持っているレポジトリにおいて、yarn importコマンドを走らせることでこの機能を使うことができる。その結果、Yarnはpackage-lock.jsonファイルの解決パラメータを適用して、対応するyarn.lockファイルを生成します。

同様に、npmも開発者がYarnとより仲良く付き合えるように取り組んでいます。次期v7では、npmはpackage-lock.jsonファイルの更新を行い、yarn.lockファイルを扱えるようにします。これにより、npmとYarnを切り替える（または両方を使う）際によくある摩擦が軽減されます。

## パフォーマンスの面
大量のパッケージを管理する場合、パッケージマネージャのパフォーマンスは重要な考慮事項です。開発には苦労がつきものなので、重くならないパフォーマンスの高いツールが必要です。

これまでに述べた通り、Yarnが開発された主な理由の1つは、npmのperformance問題を克服するためである。故に、最初はyarnが明らかなパフォーマンス面ではnpmに勝っていた。

しかしながら、最近、特にnpmのv5,v6においては、npmのYarnとのパフォーマンス面でのギャップを埋めてきている。
Yarnが大抵の場合でより早いが、npmがこの競争を急速に激化させています。

スピードを比較する、いくつかのベンチマークテストが行われ、例えば、いくつかの簡単な依存関係を異なる条件でインストールする際の速度を比較したあるテストの結果をまとめた表が以下の表です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/1e650dae-a650-b890-9507-3aac41c84b56.png)

見てわかるように、Yarnが明らかにパフォーマンス速度において優っています。インストールの際、npmが1つずつインストールするのに対し、Yarnは複数のパッケージを一度にインストールします。
再度のインストール過程においては、Yarnがかなり早かったです。その理由は、オフラインモード機能がキャッシュ機構を利用して、過去にダウンロードしたパッケージの高速ダウンロードを可能にしているからです。npmもキャッシュ機能をサポートしていますが、Yarnの方がはるかに優れているようです。

## セキュリティの面
Yarnとnpmの比較を行う際には、セキュリティも重要な論点となります。Yarnは当初、より安全であると考えられていましたが、npmチームは大幅なセキュリティの改善を導入し、称賛に値するカムバックを果たしました。

npm v6では、セキュリティが組み込まれています。既知のセキュリティ脆弱性があるコードをインストールしようとすると、npmは自動的に警告を発します。また、新しいコマンド npm audit が導入され、依存関係のツリーを再帰的に評価して異常を特定することができるようになりました。

一方、Yarnのセキュリティ機能には、チェックサムを使ってすべてのパッケージの整合性を検証する機能や、インストールしたパッケージのライセンスをチェックする機能などがあります。

## アップデートの面
最新のパッケージバージョンにするパフォーマンスは多少のコマンドの相違はあっても、両者ともに似ています。

### Yarn
`yarn upgrade`
`yarn upgrade [package-name]`

### npm
`npm update`
`npm update [package-name]`

パッケージ名を省略すれば、全ての依存関係が最新のものに、アップデートされます。
これはpackage.jsonファイルに定義されているバージョンの範囲に基づきます。そして、package.jsonとyarn.lockファイルは修正されます。また、使用しているツールに応じて、package-lock.jsonファイルまたはyarn.lockファイルが修正されます。

パッケージ名を省略しなければ、その特定のパッケージのみがアップデートされます。

## CLIコマンドの面
開発者は普段から多くの時間をターミナルのインターフェースとむきあうことに費やしている。それ故に、もう１つの欠かせないポイントはCLIにおける比較である。

両者のツールに共通するコマンドが以下である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/c0dcce70-6bd7-19df-8549-2faf50a2a65c.png)

両者のツールにおいて異なるコマンドが以下である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/9014a286-3340-486d-8213-d9f8fac03468.png)


両者のツールにおいて、各々が独自に持っているコマンドが以下である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/94812a14-00ac-f9ce-a0f1-0c09a044bd13.png)

CLIコマンドを実行するときの結果について、Yarnはよりすっきりとした結果を返す。（Windowsではない場合、絵文字が表示されたりする。）

npmはたくさんのノイズを生成する。対して、Yarnのアウトプットはよりすっきりしており、冗長でない。

## 結論
両者ともにプロジェクトの依存関係を操るためには便利なツールである。npmが早くに紹介されましたが、Yarnは急速にjavascriptの界隈で普及しました。

Yarnはnpmから多くのインスピレーションを得て、特にnpmの欠点を利用して、開発者が好むパッケージ管理ソリューションを作りました。

同様に、npmのコアチームは、新しいリリースのたびに、開発者のニーズに合わせて機能を更新しながら、反撃を続けてきました。

現在のところ、この2つのパッケージマネージャは、機能的にはほぼ同等であることがわかります。とはいえ、どちらかを選ぶには、いくつかの紆余曲折があります。

最終的に、npmとYarnのどちらを選ぶかは、あなたの要件、好み、そして嗜好によります。

Happy coding