Edited at

npm vs yarnどっち使うかの話


結果だけ書くと

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)
npm
yarn

1
real: 15.431s
user: 21.068s
sys: 5.005s
real: 15.328s
user: 5.999s
sys: 3.006s

2
real: 9.252s
user: 15.967s
sys: 4.234s
real: 5.194s
user: 4.455s
sys: 2.208s

3
real: 8.747s
user: 15.527s
sys: 4.120s
real: 5.207s
user: 4.506s
sys: 2.225s

4
real: 9.396s
user: 16.025s
sys: 4.229s
real: 5.248s
user: 4.562s
sys: 2.247s

5
real: 9.249s
user: 15.898s
sys: 4.222s
real: 7.051s
user: 4.643s
sys: 2.294s

average
real: 10.209s
user: 16.897s
sys: 4.362s
real: 7.606s
user: 4.833s
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を使おうと思ってます。