投稿者: @jigen2020/5/24 8:30に作成

npm vs yarnどっち使うかの話

宣伝: YouTubeで初心者向けの配信をしています。よかったら覗いていってね😉

結果だけ書くと

yarn の方が速くて簡潔です。

また必要な状況はかなり限定的ですがyarnにあってnpmにない機能も存在します。それに関する内容にこの記事で若干触れました。気になる方はご覧ください。

(比較した方法・バージョンとかは下を読んでください。誤りがあれば意見いただけると嬉しいです。)

よくいわれていること

node.js使う前提なんですが、npmは最初から入っていて、yarnは自分で入れないといけません。 yarnは独自のキャッシュサーバー持ってるらしい。 もうすでに速度あまり変わらないのでは。

比較点

  • パッケージのインストール速度
  • コマンドの簡潔さ

おそらくこの2つが主に開発速度に影響するのではないかと思います。

パッケージのインストール速度

npm_tmp yarn_tmp ディレクトリを作成し、 $ npm init -y $ yarn init -y でそれぞれ初期化したプロジェクトの package.jsondevDependencies にライブラリ自体の依存関係が多い、みなさんおなじみ webpack を加えて、インストールする速度を $ time npm install $ time yarn install で比較してみようと思います。

それぞれのpackage.json

npm

{
  "name": "npm_tmp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "webpack": "4.19.0"
  }
}

yarn

{
  "name": "yarn_tmp",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "webpack": "4.19.0"
  }
}

実験環境

CPU: 2.8 GHz Intel Core i7 MEM: 16 GB 2133 MHz LPDDR3 GPU: Intel HD Graphics 630 1536 MB NETWORK: 141.8Mbps/10.3Mbps (Download/Upload)

yarn: 1.9.4 npm: 6.4.1

*ネットワーク速度はGoogleでspeed testと検索した時に一番上に出てくるもので計測。 詳細はここ

結果

回数\速度(real : user : sys)npmyarn
1real: 15.431s<br>user: 21.068s<br>sys: 5.005sreal: 15.328s<br>user: 5.999s<br>sys: 3.006s
2real: 9.252s<br>user: 15.967s<br>sys: 4.234sreal: 5.194s<br>user: 4.455s<br>sys: 2.208s
3real: 8.747s<br>user: 15.527s<br>sys: 4.120sreal: 5.207s<br>user: 4.506s<br>sys: 2.225s
4real: 9.396s<br>user: 16.025s<br>sys: 4.229sreal: 5.248s<br>user: 4.562s<br>sys: 2.247s
5real: 9.249s<br>user: 15.898s<br>sys: 4.222sreal: 7.051s<br>user: 4.643s<br>sys: 2.294s
averagereal: 10.209s<br>user: 16.897s<br>sys: 4.362sreal: 7.606s<br>user: 4.833s<br>sys: 2.396s

考察

事実だけ見ると、全てにおいて yarn の方が速いです。

両者とも、1回目のインストールにかかった実時間はこの環境ではあまり変わりませんでした。 しかし、userとsysの結果がかなり乖離しています。userに関しては約3倍以上。npmは依存関係の処理を並列化して高速化したんでしょうか。yarn側はuser+sysしても実時間と乖離があるので、なんとなくネットワークIOな気がします。サーバー側で何か(独自で依存ライブラリの解決を)やってるんでしょうか。 なのでもしかすると1CPUのPCだと、npmは論外の遅さになるかもしれません(推測なので持っている方いたら検証してみてください・とはいえ開発者は普段1CPUのPCとか使ってないから意味のない話だとは思いますが…わりとこのPCスペックがいいので比較としては面白そうだなと思いました)

コマンドの簡潔さ

大きく違うところで主にやりたいこと2つは、

  • パッケージ追加したい
  • スクリプト実行したい

だと思うのでこの2点を比較します。

パッケージ(xxx)追加したい

npm

$ npm install --save(-dev) xxx

yarn

$ yarn add (--dev) xxx

スクリプト実行したい(インストールしたパッケージを直接呼び出す)

インストールしたライブラリ(xxx)を引数(-t yyy)付きで呼び出す時

npm

$ npm run xxx -- -t yyy

yarn

$ yarn xxx -t yyy

スクリプト実行したい(package.jsonのscriptsに書いた処理(xxx)を呼び出す)

npm

$ npm run xxx

yarn

$ yarn xxx

考察

この辺りは人によると思いますが(npmも短縮系を使えば短いとか)、yarnの方が簡潔で、実際の開発スタイルにあっていていいと思います。(例えばpackage.jsonに追加せずにinstallすることはチーム開発する上ではやってはいけないし、やらない)

終わりに

これらを踏まえて、やはりyarnを使おうと思ってます。