Edited at

npmに変わるパッケージマネージャーYarnを導入してみる

More than 1 year has passed since last update.

npmのinstallが遅い? yarnを試しましょう。


Yarnとは

https://yarnpkg.com/

Facebook2016年10月にローンチした新しいパッケージマネージャー。

開発にはGoogleを始めとする企業のエンジニアが携わっているらしい。

サイトにも書かれている通り、Ultra Fast らしい。


特徴


  • 早い


    • 特に2回目以降のinstallはキャッシュが使われるため非常に高速になる



  • オフラインでもキャッシュあればインストール可能

  • yarn.lockによりインストールバージョンが固定される(後述)

  • 重複バージョンをインストールしないように出来る


    • サイズが減る(ただし、動作確認しないと悲惨なことになりそう)




インストール

とりあえず、Macにインストールしてみる。

npm install でもいいけど、npmからの乗り換えのために作られたのでbrewでのインストールが推奨されている。

$ brew install yarn

$ yarn --version
0.17.2

まだv1.0.0ではないらしい。


すでにnpm入れていて、yarnに乗り換えるとき

package.jsonはnpm互換とのことで、そのまま使える。※例外あったので後述

$ cd [project_directory]

$ rm -rf node_modules/
$ yarn (or yarn install)

これで完了。


初めてyarnを試す時

$ cd [project_directory]

$ yarn init
// nameとかversionとか聞かれるので入力する
$ yarn add [package]

addとかremoveとかupgradeは公式ドキュメントを見る

https://yarnpkg.com/en/docs/usage


速度

とあるPJで測定してみると・・・

Ultra Fast!

// npm install

real 1m29.153s
user 1m1.950s
sys 0m13.633s

// yarn(1回目)
real 0m14.794s
user 0m9.357s
sys 0m4.429s

// yarn(2回目)
real 0m0.923s
user 0m0.932s
sys 0m0.069s


npmとの互換性について


private githubリポジトリがインストール出来ない

下記のような記載になっているとインストールが上手く行かない


package.json

{

"dependencies": {
"some-package": "git+ssh://git@github.com:org/some-package.git#v1.0.0"
}
}

このような場合は":org"を"/org"にする


package.json

{

"dependencies": {
"some-package": "git+ssh://git@github.com/org/some-package.git#v1.0.0"
}
}

※yarnのgithubではこれに対するPRが出ているので、そのうち修正されると思われる。


ローカルパッケージがインストール出来ない


package.json

{

"dependencies": {
"some-local-package": "../some-local-package"
}
}

こうする


package.json

{

"dependencies": {
"some-local-package": "file:./../some-local-package"
}
}


yarn.lockについて

インストールすると、ルートディレクトリにyarn.lockなるファイルが自動生成される。

このファイルにはインストールされたバージョン情報などが記載され、他の人がインストールするときに全く同じバージョンのパッケージがインストールされるとのこと。

このファイルは、gitなどのバージョン管理に含めることが推奨されており、

「え?自分のマシンだと動くし」みたいなめんどくさいやつが無くなりそう。


補足: pnpm

npm installの時間を短縮しようと、yarn以外でpnpmというものもある。

こちらもnpmに比べて超高速にインストールが可能。

既存プロジェクトで比べた所、インストールに2分とかかかるやつが20秒くらいでインストールされる。

ただし、node_modulesのディレクトリ構成が変わる(シンボリックリンクになる)ため、不具合が出る可能性もある。